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 이벤트가 발생한다고 보면 된다.

예제

그림1

슬라이더 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();
	}

}



© 2021. By Backtony