JViewport란 무엇인가?
JViewport 클래스는 Java Swing에서 기본적인 스크롤 모델을 정의하는 핵심 컴포넌트입니다. 이 클래스는 논리적 스크롤(logical scrolling)과 픽셀 기반 스크롤(pixel-based scrolling)을 모두 지원하도록 설계되어 있어, 다양한 종류의 콘텐츠를 유연하게 표시할 수 있습니다.
JViewport의 동작 방식은 다음과 같습니다:
- 뷰포트의 자식 컴포넌트인 뷰(view)는 JViewport.setViewPosition() 메서드를 호출하여 스크롤됩니다.
- JViewport 클래스는 논리적 스크롤을 지원합니다. 논리적 스크롤이란 뷰의 좌표가 픽셀이 아닌 다른 단위(예: 행, 열, 문자 등)로 표현되는 스크롤 방식을 의미합니다.
논리적 스크롤 지원 방식
논리적 스크롤을 지원하기 위해 JViewport는 뷰포트와 뷰의 기하학적 구조(geometry)를 정의할 수 있는 소수의 메서드들을 제공합니다. 기본적으로 이러한 메서드들은 뷰포트와 뷰의 픽셀 크기를 그대로 반환하지만, 필요에 따라 이를 재정의하여 논리적 좌표계를 구현할 수 있습니다.
JViewport 활용 예제 코드
아래 예제는 JLabel에 담긴 이미지를 JViewport로 감싸고, 뷰포트의 크기와 뷰 위치를 설정하여 화면에 출력하는 간단한 프로그램입니다.
import java.awt.*;
import javax.swing.*;
public class JViewportTest extends JFrame {
public JViewportTest() {
setTitle("JViewport Test");
setLayout(new FlowLayout());
JLabel label = new JLabel(new ImageIcon("C:/Users/User/Desktop/Java Answers/logo.jpg"));
JViewport viewport = new JViewport();
viewport.setView(label);
viewport.setExtentSize(new Dimension(350, 350));
viewport.setViewPosition(new Point(50, 25));
viewport.setPreferredSize(new Dimension(350, 275));
add(viewport);
setSize(400, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new JViewportTest();
}
}코드 설명
- setView(label): 뷰포트에 표시할 자식 컴포넌트(뷰)를 설정합니다.
- setExtentSize(): 뷰포트에 보이는 영역의 크기를 지정합니다.
- setViewPosition(): 뷰의 어느 부분부터 화면에 표시할지 좌표를 지정하여 스크롤 효과를 만듭니다.
- setPreferredSize(): 뷰포트 자체의 선호 크기를 설정합니다.
실행 결과
위 코드를 실행하면 지정된 이미지가 뷰포트 영역 안에서 설정된 좌표(50, 25)만큼 이동된 상태로 표시됩니다. 이처럼 JViewport는 JScrollPane 등과 함께 사용되어 대용량 이미지나 긴 문서를 효율적으로 탐색할 수 있는 환경을 제공합니다.