JScrollPane은 스윙(Swing)에서 제공하는 컴포넌트로 화면에 다 표시되지 않는 내용을 스크롤 기능을 통해 보여줍니다. 화면 크기에 맞게 컴포넌트의 내용을 표시하고 내용이 화면을 초과할 경우 자동으로 수평 및 수직 스크롤바를 추가하여 사용자가 모든 내용을 볼 수 있도록 도와줍니다. 주로 JPanel, JTextArea, JTable, JList와 같은 컴포넌트와 함께 사용되며 공간을 절약하고 사용자가 효율적으로 내용을 확인할 수 있게 합니다.
JAVA
JFrame frame = new JFrame("");
JTextArea textArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(textArea);
frame.add(scrollPane);
2 JScrollPane 스크롤바 설정
JScrollPane은 수직 스크롤바(vertical scrollbar) 와 수평 스크롤바(horizontal scrollbar) 두 가지를 제공합니다. 각각의 스크롤바는 언제 표시할 것인지를 설정할 수 있으며 생성자나 메서드를 통해 조절할 수 있습니다.
2-1수직 스크롤바
JAVA
/*
* 항상 수직 스크롤바 표시 : JScrollPane.VERTICAL_SCROLLBAR_ALWAYS
* 필요할 때만 수직 스크롤바 표시 (기본값) : JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED
* 수직 스크롤바 표시 안 함 : JScrollPane.VERTICAL_SCROLLBAR_NEVER
*/
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
2-2수평 스크롤바
JAVA
/*
* 항상 수직 스크롤바 표시 : JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS
* 필요할 때만 수직 스크롤바 표시 (기본값) : JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
* 수직 스크롤바 표시 안 함 : JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
*/
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
3JScrollPane 테두리 설정
JScrollPane은 기본적으로 테두리(Border) 를 가지고 있으며 필요에 따라 테두리를 제거하거나사용자 지정 테두리로 변경할 수 있습니다.
3-1 테두리 제거
JAVA
scrollPane.setBorder(null);
3-2 투명 테두리로 여백 조절
투명한 테두리(여백)를 설정하여 스크롤 내용과 외부 레이아웃 사이에 여유 있는 공간을 만들어줍니다. 이 여백은 실제 테두리 선 없이 비워진 공간이므로 해당 영역을 통해 JScrollPane 뒤쪽의 배경이 자연스럽게 드러납니다.
// 방법 1
scrollPane.setBorder(BorderFactory.createMatteBorder(10, 10, 10, 10, Color.BLACK));
// 방법 2
scrollPane.setBorder(BorderFactory.createLineBorder(Color.BLACK, 10));
4JScrollPane 여백 설정
JScrollPane 자체에는 여백(padding)을 직접 지정할 수 없습니다. JScrollPane은 기본적으로 테두리(border) 설정은 가능하지만 내부의 여백을 설정하는 기능은 제공하지 않습니다. JScrollPane은 스크롤 기능을 제공하는 데 초점을 맞춘 컴포넌트로 스크롤 가능한 영역 안에 다른 컴포넌트를 배치합니다. 따라서 여백을 지정하는 대신 내부 컴포넌트(예 : JPanel, JTextArea)에서 여백을 조정하거나 JScrollPane에 빈 테두리를 설정하여 간접적으로 여백을 추가하는 방식으로 해결할 수 있습니다. JScrollPane의 핵심은 스크롤 기능을 제공하는 것이므로 여백을 직접 지정하기보다는 스크롤 영역을 효율적으로 관리하는 데 집중하고 있습니다.
5JScrollPane 뷰포트 변경하기
JScrollPane 내부에는 JViewport라는 공간이 있으며 이곳이 실제로 화면에 보여지는 영역입니다. 우리가 보고 싶은 컴포넌트(JTextArea, JTable 등)는 바로 이 뷰포트에 들어갑니다. 스크롤은 뷰포트 안의 콘텐츠를 움직여 보여주는 방식으로 동작합니다.
JScrollPane은 내부에 여러 구성요소를 포함하고 있습니다. 주요 구성은 다음과 같습니다.
Viewport (JViewport) : 실제로 스크롤되는 콘텐츠를 포함하는 영역입니다. (예 : JTextArea, JPanel 등)
Scroll Bars (JScrollBar) : 스크롤을 조작할 수 있는 UI.
Corner Components : 스크롤 바가 교차하는 지점 등의 UI를 담당.
ScrollPane 자체 : 이 모든 구성요소를 포함하는 컨테이너.
JAVA
scrollPane.setViewportView(table);
방식
설명
장점
사용 시점
JScrollPane scrollPane = new JScrollPane(table);
JTable을 바로 JScrollPane에 추가하면서 생성
간단하고 직관적
컴포넌트를 바로 감쌀 때 사용
scrollPane.setViewportView(table);
기존에 생성된 JScrollPane에 나중에 table을 추가
동적으로 컴포넌트를 설정 가능
뷰포트 설정을 나중에 할 때 사용
6JScrollPane 휠 스크롤 제어
JScrollPane에서 마우스 휠을 이용한 스크롤 기능을 켜거나 끄는 역할을 합니다. 휠 스크롤을 꺼도 스크롤바 자체는 그대로 유지되며, 스크롤바를 마우스로 직접 조작하는 것은 계속 가능합니다.
6-1 휠 스크롤 비활성화하기
휠 스크롤을 비활성화하고 싶을 때는 이 메서드를 사용하여 휠 스크롤을 끌 수 있습니다. 화면에 휠 스크롤 기능이 불필요하거나 다른 방식으로 스크롤을 처리할 경우 유용합니다.
JAVA
scrollPane.setWheelScrollingEnabled(false);
⚠️주의
JScrollPane.setWheelScrollingEnabled(false)를 설정해도 내부 컴포넌트가 마우스 휠 이벤트를 자체적으로 처리하는 경우에는 스크롤이 계속 작동합니다.
(예: JTextArea, JTable 등은 내부적으로 MouseWheelListener를 구현하고 있기 때문입니다.)
6-2 휠 스크롤 활성화하기
기본적으로 휠 스크롤은 활성화되어 있지만 만약 비활성화된 상태에서 다시 휠 스크롤을 사용하려면 true로 설정하여 활성화할 수 있습니다.
JAVA
scrollPane.setWheelScrollingEnabled(true);
6-3 설정에 따른 동작 방식
설정값에 따라 마우스 휠 스크롤 기능이 어떻게 동작하는지 비교한 표입니다.
설정
마우스 휠 스크롤
스크롤바 표시
수동 드래그
ture
O
O
O
flase
X
O
O
7JScrollPane 배경 설정
JScrollPane에 배경색이나 배경 이미지를 설정해도 바로 눈에 띄지 않는 경우가 많습니다. 이는 JScrollPane이 내부에 뷰포트(Viewport)를 포함하고 있고 실제 콘텐츠는 이 뷰포트 위에 표시되기 때문입니다. 따라서 배경색이나 이미지를 적용하려면 JScrollPane이 아닌 뷰포트나 내부 컴포넌트(JPanel 등)에 직접 설정해야 합니다.
💡 Tip
✔ 배경색 설정
JScrollPane에 배경색을 설정해도 잘 보이지 않는 경우가 있습니다.
실제 콘텐츠는 Viewport에 표시되므로, 배경색도 여기에 설정해야 합니다.
scrollPane.getViewport().setBackground(Color.원하는색); 와 setOpaque(true) 설정이 필요합니다.
✔ 배경 이미지 설정
JScrollPane 자체에는 배경 이미지를 설정할 수 없습니다.
이미지를 배경으로 사용하려면, 이미지가 그려진 JPanel을 생성하여 JScrollPane 안에 넣는 방식으로 구현해야 합니다.