Java 기본적인 스윙 컴포넌트와 활용 - 2
1. JTextField
JTextField를 이용하면 한 줄의 문자열을 입력받는 창을 만들 수 있다. 입력 가능한 문자 개수와 창의 크기는 응용프로그램에서 변경할 수 있다. 문자열 입력 도중 enter가 입력되면 Action 이벤트가 발생한다. 생성자는 다음과 같다.
JTextField() // 빈 텍스트 필드
JTextField(int cols) // 입력 창의 열의 개수가 cols개인 텍스트 필드
JTextField(String text) // text 문자열로 초기화된 텍스트
JTextField(String text, int cols) // 입력창의 열의 개수는 cols개, text문자열로 초기화된 텍스트
여기서 cols는 입력 가능한 문자의 개수가 아니라 입력 창의 크기를 나타내는 수치이다.
JTextField의 주요 메서드
- setEditable(false) : 텍스트필드 창에 입력 불가능하게 하기
- setText(“문자열”) : 텍스트필드 입력창에 있는 문자열 수정
- setFont() : 입력 창의 문자열의 폰트 수정
2. JTextArea
JTextArea를 이용하면 여러 줄의 문자열을 입력받을 수 있는 창을 만들 수 있다. 창의 크기보다 많은 줄과 문자를 입력할 수 있지만 스크롤바를 지원하지 않는다. JTextArea 컴포넌트를 JScrollPane에 삽입하여야 스크롤바를 지원받을 수 있다. 생성자는 다음과 같다.
JTextArea() // 빈 텍스트영역
JTextArea(int rows, int cols) // 입력 창이 rows * cols 크기의 텍스트 영역
JTextArea(String text) // 문자열로 초기화된 텍스트 영역
JTextArea(String text, int rows, int cols) // rows * cols 크기의 text로 초기화된 텍스트 영역
// 스크롤바 생성하기
// JScrollPane의 인자로 JTextArea를 주고
// JScrollPane을 컨테이너에 붙이면 된다.
container.add(new JScrollPane(new JTextArea("hello",7,20)));
3. JList< E >
JList< E >는 여러 개의 아이템을 리스트 형식으로 보여주고 아이템을 선택하도록 하는 리스트 컴포넌트를 구현한다. E는 리스트에 삽입되는 아이템의 타입으로, 리스트를 생성할 때 E 대신 아이템 타입을 대입하여 구체화해야 한다. 문자열과 이미지가 아이템으로 사용 가능하며, 사용자는 하나 이상의 아이템을 선택할 수 있다. JList는 스크롤 기능을 지원하지 않기 때문에 JTextArea처럼 JScrollPane에 삽입해야 스크롤 기능을 지원한다. 생성자는 다음과 같다. 빈 리스트를 만들고 나중에 데이터를 세팅해주려먼 setListData메서드를 사용하면 된다.
JList<E> // 빈 리스트
JList<E>(Vector listData) // 벡터로부터 아이템을 공급받는 리스트
JList<E>(Object [] listData) // 배열로부터 아이템을 공급받는 리스트
// 객체로부터 리스트 생성
String [] fruits={"apple","banana"};
// fruits 문자열 배열로 JList 만들기
JList<String> strList = new JList<String>(fruits);
// 스크롤기능 추가
JScrollPane pane = new JScrollPane(strList);
// 컨테이너에 붙이기
container.add(pane);
//빈 깡통 JList만들고 값 세팅도 가능
// JList<String> strList = new JList<>();
// strList.setListData(fruits);
리스트 아이템 변경
생성자를 이용하여 리스트가 일단 생성되고 나면, listData의 벡터나 배열을 수정한다고 해도 이미 생성된 리스트를 변경할 수 없다. 따라서 수정하기 위해서는 전체를 갈아껴줘야 한다.
Vector<String> v = new Vector<>();
v.add("해신");
v.add("장보고");
JList<String> nameList = new JList<String>(v);
// 수정하고 싶다면
// vector에 추가값을 넣고 JList 데이터 자체를 갈아낀다.
v.add("수정")
nameList.setListData(v);
JList 메서드
- setVisibleRowCount() : 리스트가 보여주는 행의 수 설정
- setFixedCellWidth() : 리스트의 폭 설정
4. JComboBox< E >
JComboBox는 텍스트필드, 버튼, 드롭다운 리스트로 구성되는 콤보박스 컴포넌트를 구현한다. 초기에는 텍스트필드 창과 버튼만 보이지만 버튼을 클릭하면 드롭다운 리스트가 아래로 출력되고, 아이템을 선택하면 텍스트필드 창에 나타난다. 생성자는 다음과 같다.
JComboBox<E>() // 빈 콤보박스
JComboBox<E>(Vector listData) // 벡터로부터 아이템을 공급받는 콤보박스
JComboBox<E>(Object [] listData) // 배열로부터 아이템을 공급받는 콤보박스
메서드
- addItem() : 콤보박스에 추가
- removeItem(Object obj) : obj 삭제
- removeItemAt(int index) : 해당 인덱스 아이템 삭제, 예를 들면, 2라면 3번째 아이템 삭제
- removeAllItems() : 모두 삭제
- int getSelectedIndex() : 선택 상태인 아이템의 인덱스 번호 리턴
- Object getSelectedItem() : 선택 상태인 아이템 객체 레퍼런스 리턴
JComboBox와 Action 이벤트
콤보박스의 아이템을 선택하면 Action 이벤트와 Item 이벤트가 동시에 발생한다. 목적에 따라 두 이벤트 중에 선택하여 사용해야 하는데 아이템 선택을 일종의 명령으로 처리하려면 Action이벤트를, 아이템 선택하거나 해제하는 것이 목적이라면 Item 이벤트를 처리하면 된다. 참고로 하나의 아이템 선택시 action 이벤트는 무조건 한 개 발생하지만 item의 경우에는 다르다. 선택되어 있는 아이템을 선택하는 경우에는 Item 이벤트는 발생하지 않는다. 또한 새로운 아이템을 선택하게 되면 선택 해제와 선택 총 2개의 Item 이벤트가 발생한다.
5. JSlider
JSlider는 슬라이드 바를 출력하여 마우스로 값을 선택하도록 하는 슬라이더 컴포넌트이다. 수직, 수평 슬라이더 2가지 종류로 나뉜다. 구성요소는 다음과 같다.
- 손잡이 : 사용자가 값 선택을 위해 움직이는 그래픽 심볼
- minimum, maximum : 최대 최소값
- orientation : 슬라이더의 방향 값, 수직, 수평 슬라이더 판단값
- JSlider.HORIZONTAL 수평, JSlider.VERTICAL 수직
- track : 슬라이더의 트랙 바
- majorTickSpacing, minorTickSpacing : 큰 눈금 간격과 작은 눈금 간격
- label : 눈금에 세겨진 문자열
- value : 슬라이더의 값으로 손잡이가 이 값을 가리킴
생성자
디폴트는 minimum=0, maximum=100, value=50 인 수평 슬라이더이다.
JSlider() // 디폴트 슬라이더
JSlider(int orientation) // orientation 방향 슬라이더
JSlider(int min, int max, int val)//최소, 최대, 초기값을 가진 슬라이더
JSlider(int orientation, int min, int max, int val) // 수평수직, 최소, 최대, 초기값
메서드
- void setOrientation(int orientation) : 수평, 수직 방향 수정
- void setMinimum(int min) : 최소값 수정
- void setMaximum(int max) : 최대값 수정
- void setPaintLabels(boolean b) : true면 슬라이더 label 보이게, false면 안보이게
- void setPaintTicks(boolean b) : true면 슬라이더의 눈금을 보이게, false면 안보이게
- void setPaintTrack(boolean b) : true면 슬라이더의 트랙을 보이게, false면 안보이게
- void setMinorTickSpacing(int space) : 슬라이더의 작은 눈금 간격 수정
- void setMajorTickSpacing(int space) : 슬라이더의 큰 눈금 간격 수정
- void setValue(int n) : 슬라이더의 값 수정
- void getValue() : 슬라이더의 값 가져오기
JSilder와 Change 이벤트
Change 이벤트는 스윙 이벤트로 JSilder의 값이 바뀌면 발생한다. 슬라이더가 움직이는 동안 계속 JSilder의 setValue를 호출하여 value 값을 변경할 때 Change 이벤트가 발생한다고 보면 된다.
예제
슬라이더 3개를 만들고 색의 구성요소인 rgb값은 선택하는데 사용한다. rgb값을 조합하여 레이블의 배경색을 출력하자.
public class RgbExam extends JFrame{
private JLabel label = new JLabel("SLIDER EXAM");
// 슬라이더 3개
private JSlider[] jSliders = new JSlider [3];
public RgbExam() {
setTitle("슬라이더 예제");
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout());
// 슬라이더 설정
for (int i=0; i<jSliders.length;i++) {
jSliders[i]=new JSlider(JSlider.HORIZONTAL,0,250,125);
jSliders[i].setPaintLabels(true);
jSliders[i].setPaintTicks(true);
jSliders[i].setPaintTrack(true);
jSliders[i].setMajorTickSpacing(50);
jSliders[i].setMinorTickSpacing(10);
// 슬라이더에 리스너 붙이고 컨텐트팬에 붙이기
jSliders[i].addChangeListener(new MyChangeListener());
contentPane.add(jSliders[i]);
}
// 글자색 설정
jSliders[0].setForeground(Color.red);
jSliders[1].setForeground(Color.green);
jSliders[2].setForeground(Color.blue);
// 현재 value 값 가져오기
int r = jSliders[0].getValue();
int g = jSliders[1].getValue();
int b = jSliders[2].getValue();
// 배경색 출력을 위해 불투명성 설정
label.setOpaque(true);
// 배경색 설정
label.setBackground(new Color(r,g,b));
// 컨텐트팬에 붙이기
contentPane.add(label);
setSize(300,200);
setVisible(true);
}
class MyChangeListener implements ChangeListener{
@Override
public void stateChanged(ChangeEvent e) {
int r = jSliders[0].getValue();
int g = jSliders[1].getValue();
int b = jSliders[2].getValue();
label.setBackground(new Color(r,g,b));
}
}
public static void main(String[] args) {
new RgbExam();
}
}