Java Swing에서 JScrollBar와 JScrollPane은 모두 스크롤 기능과 관련이 있지만, 역할과 동작 방식에서 중요한 차이가 있습니다.
JScrollBar는 하나의 컴포넌트(Component)로서 자체적으로 이벤트를 처리하지 않는 반면, JScrollPane은 컨테이너(Container)로서 자체적으로 이벤트를 처리하고 스크롤 동작까지 수행합니다. 또한 JScrollBar 안에는 JScrollPane을 포함할 수 없지만, JScrollPane 안에는 JScrollBar를 포함할 수 있습니다.
JScrollBar란?
- JScrollBar 클래스의 객체는 수평(horizontal) 및 수직(vertical) 스크롤바를 추가하는 데 사용되며, 사용자가 지정된 최솟값과 최댓값 사이에서 항목을 선택할 수 있도록 해줍니다.
- JScrollBar 클래스는 스크롤바(scrollbar)의 구현체이며, JComponent 클래스를 상속받습니다.
문법(Syntax)
public class JScrollBar extends JComponent implements Adjustable, Accessible예제 코드
import javax.swing.*;
import java.awt.*;
public class JScrollBarTest extends JFrame {
JScrollBarTest() {
setTitle("JScrollBar Test");
JScrollBar jsb = new JScrollBar();
setLayout(new FlowLayout());
add(jsb);
setSize(350, 275);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]) {
new JScrollBarTest();
}
}위 코드를 실행하면 프레임 오른쪽에 수직 스크롤바가 표시됩니다. 다만 JScrollBar 단독으로는 스크롤 대상 뷰(viewport)가 없기 때문에, 실제 화면 내용이 자동으로 움직이지는 않습니다.
JScrollPane이란?
- JScrollPane은 컴포넌트의 스크롤 가능한 뷰(scrollable view)를 만드는 데 사용됩니다.
- 스크롤 패인(Scroll Pane)은 JComponent 클래스를 확장한 JScrollPane 클래스의 객체입니다.
- 화면 크기가 제한적일 때, 큰 컴포넌트나 크기가 동적으로 변하는 컴포넌트를 표시하기 위해 스크롤 패인을 사용합니다.
- JScrollPane 클래스의 주요 메서드로는 setColumnHeaderView(), setRowHeaderView(), setViewportView() 등이 있습니다.
예제 코드
import javax.swing.*;
import java.awt.*;
public class JScrollPaneTest extends JFrame {
JScrollPaneTest() {
setTitle("JScrollPane Test");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
JScrollPane jsp = new JScrollPane(panel,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
add(jsp);
setSize(350, 275);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new JScrollPaneTest();
}
}위 예제에서는 VERTICAL_SCROLLBAR_ALWAYS와 HORIZONTAL_SCROLLBAR_ALWAYS 상수를 사용하여 수평·수직 스크롤바가 항상 표시되도록 설정했습니다. JScrollPane은 내부적으로 JScrollBar를 포함하며, 마우스 휠이나 드래그 이벤트를 스스로 처리하기 때문에 별도의 이벤트 리스너 구현 없이도 스크롤 기능이 바로 동작합니다.
핵심 차이점 요약
| 구분 | JScrollBar | JScrollPane |
|---|---|---|
| 분류 | 컴포넌트(Component) | 컨테이너(Container) |
| 이벤트 처리 | 자체 처리하지 않음 | 자체적으로 처리 |
| 스크롤 동작 | 직접 구현해야 함 | 자동으로 수행 |
| 포함 관계 | JScrollPane 포함 불가 | JScrollBar 포함 가능 |
결론적으로, 단순히 스크롤바 UI만 필요하다면 JScrollBar를, 콘텐츠가 넘칠 때 자동으로 스크롤되는 뷰가 필요하다면 JScrollPane을 사용하는 것이 적절합니다.