11장_스윙 컴포넌트와 이벤트 핸들링

IkSun·2023년 6월 6일

CHAPTER 11 기본적인 스윙 컴포넌트와 활용

11.1 스윙 컴포넌트 소개
11.2 JLabel, 레이블 컴포넌트
11.3 JButton, 버튼 컴포넌트
11.4 JCheckBox, 체크박스 컴포넌트
11.5 JRadioButton, 라디오버튼 컴포넌트
11.6 JTextField,텍스트필드 컴포넌트
11.7 JTextArea, 텍스트영역 컴포넌트
11.8 JList, 리스트 컴포넌트
11.9 JComboBox, 콤보박스 컴포넌트
11.10 JSlider, 슬라이더 컴포넌트


11.1 ) 스윙 컴포넌트 소개

GUI를 구성하는 2가지 방법

  • 1) 컴포넌트 기반 GUI 기반 프로그래밍
    • 워드, 한글과 같은 프로그램이라고 생각
  • 2) 그래픽 기반 GUI 프로그래밍
    • 포토샵과 괕은 프로그램과 유사

기초적인 스윙 컴포넌트와 상속 관계

스윙 컴포넌트의 공동 메소드. JComponent의 메소드

예제 11-1 : 스윙 컴포넌트의 공통 기능, JComponent의 메소드

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class JComponentEx extends JFrame {
	public JComponentEx() {
		super("JComponent의 공통 메소드 예제");
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		JButton b1 = new JButton("Magenta/Yellow Button");
		JButton b2 = new JButton("Disabled Button");
		JButton b3 = new JButton("getX(), getY()");
		
		b1.setBackground(Color.YELLOW); //배경색 설정
		b1.setForeground(Color.MAGENTA); //글자색 설정
		b1.setFont(new Font("Arial", Font.ITALIC, 20)); //Arial, 20 픽셀 폰트 설정
		b2.setEnabled(false); //버튼 비활성화
		b3.addActionListener(new ActionListener() { // ⭑ 세번째 버튼은 익명 클래스로 바로 등록
			public void actionPerformed(ActionEvent e) {
				JButton b = (JButton)e.getSource();
				JComponentEx frame = (JComponentEx)b.getTopLevelAncestor();
				frame.setTitle(b.getX() + "," + b.getY()); //타이틀에 버튼 좌표 출력
			}
		});
		c.add(b1);c.add(b2);c.add(b3); //컨텐트 팬에 버튼 부착
		setSize(300, 200);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new JComponentEx();
	}

}


11.2 ) JLabel, 레이블 컴포넌트

  • JLabel의 용도
    • 문자열이나 이미지를 컴포넌트화 하여 출력하기 위한 목적
  • 생성자
JLabel() //빈 레이블
JLabel(Icon image) //이미지 레이블
JLabel(String text) //문자열 레이블
JLabel(String text, Icon image, int hAlign) //문자열과 이미지를 모두 가진 레이블

// - hAlign : 수평 정렬 값으로 SwingConstants.LEFT,
//            SwingConstants.RIGHT, SwingConstants.CENTER 중 하나.

레이블 컴포넌트 생성 예

  • 단순 텍스트 만을 가진 레이블 컴포넌트 생성
    JLabel textLabel = new JLabel("사랑합니다");
  • 이미지를 가진 레이블 컴포넌트 생성
    • 이미지 파일로부터 이미지를 읽기 위해 ImageIcon 클래스 사용
    • 다룰 수 있는 이미지 종류
      • png, gif, jpg
    • sunset.jpg 의 경로명이 "images/sunset.jpg" 인 경우 (현재 프로젝트 폴더 안에서)
      //주의할 부분 : 객체 생성시 이미지를 전달하는 방식
      ImageIcon image = new ImageIcon("images/sunset.jpg");
       JLabel imageLabel = new JLabel(image);
  • 수평정렬 값을 가진 레이블 컴포넌트 생성
    • 수평정렬 설정을 생성자의 3번째 인자로 지정
    • 텍스트 이미지 모두 출력하고자 하는 경우 수평정렬 지정
      ImageIcon image = new ImageIcon("images/sunset/.jpg");
       JLabel label = new JLabel("사랑합니다", image, SwingConstants.CENTER);

예제 11-2 : JLabel을 이용한 레이블 만들기

//프로젝트 폴더에 iamges 폴더를 생성한 후
//이미지 {beauty.jpg, normalIcon.gif} 를 images 폴더 내부에 복사

import javax.swing.*;
import java.awt.*;

public class LabelEx extends JFrame {
	public LabelEx() {
		setTitle("레이블 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		JLabel textLabel = new JLabel("사랑합니다."); //⭑
		
		ImageIcon beauty = new ImageIcon("images/beauty.jpg"); 
		JLabel imageLabel = new JLabel(beauty);  //⭑
		
		ImageIcon normalIcon = new ImageIcon("images/normalIcon.gif"); //⭑
		JLabel label = new JLabel("보고싶으면 전화하세요", normalIcon, SwingConstants.CENTER);
		
		c.add(textLabel); //컨텐트팬에 추가
		c.add(imageLabel);
		c.add(label);
		
		setSize(400, 600);
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new LabelEx();
	}

}


11.3 ) JButton, 버튼 컴포넌트

텍스트 뿐만 아니라 이미지로도 버튼을 구성할 수 있다.
이미지 버튼을 제공할 때 세가지의 이미지가 필요

  • 버튼 컴포넌트
    • 버튼 모양의 컴포넌트
    • 버튼은 클릭될 때 Action 이벤트를 발생시킴
  • 버튼 컴포넌트 생성자
JButton() //텍스트나 이미지 아이콘을 가지지 않은 "빈 버튼" 생성
JButton(Icon icon) //이미지 버튼 생성
JButton(String text) //문자열 버튼 생성
JButton(String text, Icon icon) //텍스트와 이미지를 모두 가진 버튼 생성
  • 버튼 컴포넌트 생성 예
// "hello" 문자열을 가진 버튼 컴포넌트 생성 예
JButton btn = new JButton("hello");

이미지를 가진 버튼 컴포넌트 만들기

  • 하나의 버튼에 3개의 이미지 연결
    • 사용자의 마우스 접근 에 따라 3개의 이미지 중 선택 출력
  • 3개의 버튼 이미지
    • 버튼의 보통 상태 때 출력되는 이미지 : normalIcon.gif
      • 생성자에 이미지 아이콘 전달
      • 이미지 설정 메소드 : JButton 의 setIcon(Icon image)
    • 버튼 위에 마우스가 올라갈 때 출력되는 이미지 : rolloverIcon.gif
      • 이미지 설정 메소드 : JButton.setRolloverIcon(Icon)
    • 마우스 버튼을 누른 상태 때 출력되는 이미지 : pressedIcon.gif
      • 이미지 설정 메소드 : JButton.setPressedIcon(Icon)
  • 이미지 아이콘 생성
    • new ImageIcon(이미지 경로명);
    • new ImageIcon("images/normalIcon.gif");

예제 11-3 : JButton 을 이용한 버튼 만들기

import javax.swing.*;
import java.awt.*;

public class ButtonEx extends JFrame {
	public ButtonEx() {
		setTitle("이미지 버튼 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
        //버튼으로 사용할 이미지 로딩
		ImageIcon normalIcon = new ImageIcon("images/normalIcon.gif"); 
		ImageIcon rolloverIcon = new ImageIcon("images/rolloverIcon.gif"); 
		ImageIcon pressedIcon = new ImageIcon("images/pressedIcon.gif"); 
		
		JButton btn = new JButton("call~~", normalIcon); //Normal 상태 버튼 컴포넌트 생성 및 btn 참조 변수로 관리
		btn.setPressedIcon(pressedIcon); //press 아이콘용 이미지 등록
		btn.setRolloverIcon(rolloverIcon); //rollover 아이콘용 이미지 등록
		
		c.add(btn); //현재 컨텐트팬에 등록
		setSize(250, 150);
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new ButtonEx();
	}
}

레이블과 버튼의 정렬

  • 수평 정렬

    • 컴포넌트 영역 내에 이미지와 텍스트의 수평상의 위치 결정
    • void setHorizontalAlignment (int align)
  • 수직 정렬

    • 컴포넌트 영역 내에 콘텐츠(이미지와 텍스트)의 수직상의 위치
    • void setVerticalAlignment (int align)

11.4 ) JCheckBox, 체크박스 컴포넌트

  • 체크박스
    • 선택(selected)과 비선택(deselected)의 두 상태만을 가지는 버튼
  • 생성자
    • 디폴트는 선택되지 않은 상태
      JCheckBox() //빈체크박스
       JCheckBox(String text) //문자열 체크박스
       JCheckBox(String text, boolean selected) //문자열 체크박스 
       JCheckBox(Icon iamge) //이미지 체크박스
       JCheckBox(Icon iamge, boolean selected) //이미지 체크박스
       JCheckBox(String text, Icon image) //문자열과 이미지를 가진 체크박스
       JCheckBox(String text, Icon image, boolean selected) //문자열과 이미지를 가진 체크박스
       // - selected : ture 이면 선택 상태로 초기화, 디폴트는 해제 상태

체크박스 생성

  • 텍스트 정보만을 가진 체크 박스 생성
    • "사과" 텍스트를 가진 체크박스 생성
      JCheckBox c = new JCheckBox("사과");
    • "배" 텍스트를 가지고 있는 선택 상태로 체크박스 생성
      JCheckBox c = new JCheckBox("배", true);
    • 체크 박스 모양이 명료하게 출력되고 사용자는 이것을 체크

  • 이미지 아이콘을 가진 체크 박스 생성 예
    • 체크박스 모양이 출력되지 않음
    • 따로 선택상태를 표현하는 이미지 아이콘을 설정 하여야 함.
    • cherry.jpg 이미지와 "체리" 텍스트를 가진 체크 박스 생성 예
      • 선택 상태의 이미지를 위해 selectedCherry.jpg 를 사용하였음
      ImageIcon cherryIcon = new ImageIcon("images/cherry.jpg");
       ImageIcon seletedCherryIcon = new ImageIcon("images/seletedCherry.jpg")'
       JCheckBox cherry = new JCheckBox("체리", cherryIcon);
       cherry.setSeletedIcon(seletedCherryIcon); //선택 상태의 이미지 달기

예제 11-4 : 체크박스 생성 예

import javax.swing.*;
import java.awt.*;

public class CheckBoxEx extends JFrame {
	CheckBoxEx() {
		setTitle("체크박스 만들기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		ImageIcon cherryIcon = new ImageIcon("images/cherry.jpg"); //기본이미지
		ImageIcon seletedCherryIcon = new ImageIcon("images/selectedCherry.jpg"); //선택된 경우에 사용할 이미지
		
		JCheckBox apple = new JCheckBox("사과");
		JCheckBox pear = new JCheckBox("배", true);
		JCheckBox cherry = new JCheckBox("체리", cherryIcon);
		
		cherry.setBorderPainted(true); //이미지 외곽선이 보이도록 설정
		cherry.setSelectedIcon(seletedCherryIcon); //선택된 경우 보여질 이미지 등록
		
		c.add(apple);
		c.add(pear);
		c.add(cherry);
		
		setSize(250, 150);
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new CheckBoxEx();
	}
}


JCheckBox 와 Item 이벤트

  • Item 이벤트
    • 체크박스가 선택되거나 해제되는 각 경우에 발생하는 이벤트
      • 사용자가 마우스나 키보드로 체크박스를 선택하거나 해제한 경우 -> 자동 으로 설정 변경됨
      • 프로그램에서 체크박스 컴포넌트를 선택하거나 해제한 경우
        JCheckBox c = new JCheckBox("사과");
        c.setSeleted(true);  //선택 상태로 변경, 마우스와 키보드로 선택하지 않아도 변경 가능
    • 이 이벤트가 발생하면 이미 체크박스 컴포넌트의 상태 변경된 후
    • 체크박스가 선택/해제되는 순간 : ⭑ ItemEvent 발생 \to ItemEvent 객체 생성 ⭑

  • ItemListener 인터페이스의 추상 메소드
    • void itemStateChanged(ItemEvent e) // 체크박스가 상태가 변하는 경우(선택/해제)에 호출됨
  • ItemEvent의 주요 메소드
    • int getStateChange()
      • 체크박스의 상태가 선택 상태인지 비선택 상태인지에 대한 결과 리턴
        • ItemEvent.SELECTED 또는 ItemEvent.DESELECTED
    • Object getItem()
      • 이벤트를 발생시킨 아이템 객체
      • 체크박스의 경우 이벤트가 발생한 JCheckBox 컴포넌트의 레퍼런스 리턴

예제 11-5 : ItemEvent 활용하여 체크박스로 가격 합산하기

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class CheckBoxItemEventEx extends JFrame {
	private JCheckBox[] fruits = new JCheckBox[3]; //⭑ 체크박스를 배열로 선언
	private String[] names = {"사과", "배", "체리"};  // ⭑ 그떄 출력할 문자열로 배열로 제공
	private JLabel sumLabel; //⭑ 계산 결과를 출력할 레이블
	
	public CheckBoxItemEventEx() {
		setTitle("체크박스와 ItemEvent 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane(); //기본 컨텐트팬 정보 얻기
		c.setLayout(new FlowLayout());
		c.add(new JLabel("사과 100원, 배 500원, 체리 20000원"));
		
		MyItemListener listener = new MyItemListener(); //⭑
		for(int i=0; i<fruits.length; i++) {
			fruits[i] = new JCheckBox(names[i]); //체크박스 배열 정보 실제 생성
			fruits[i].setBorderPainted(true); //외곽선 설정 및 패널에 추가
			c.add(fruits[i]); // 컨텐트팬 등록
			fruits[i].addItemListener(listener); // ⭑⭑ 이벤트가 발생했을때 처리하는 이벤트 리스너
            //체크박스 배열에 맞는 리스너 추가
		}
		
		sumLabel = new JLabel("현재 0원 입니다.");
		c.add(sumLabel); //가격을 출력하는 레이블 컴포넌트 컨테이너에 부착
		setSize(250, 150);
		setVisible(true);
	}
	
    // ⭑⭑ 이벤트가 발생했을떄 처리해주는 MyItemListener
    // ⭑ 리스너 클래스 정의 
    // ⭑ 체크 박스가 변동 : itemStateChanged() 자동 호출됨
	class MyItemListener implements ItemListener {
		private int sum = 0; //가격의 합
		public void itemStateChanged(ItemEvent e) {
			if(e.getStateChange() == ItemEvent.SELECTED) { //⭑ 현재 아이템 정보중 선택된게 있는지 확인
				if(e.getItem() == fruits[0]) //⭑ 체크 상황 확인 후 가격 조정
					sum += 100;
				else if(e.getItem() == fruits[1])
					sum += 500;
				else 
					sum += 20000;
			}
            // ⭑⭑ 체크가 풀어지는 이벤트가 다시 발생하면 이제는 ItemEvent.DESELETED 이벤트가 발생하기 떄문에 else 로 분기
			else {
				if(e.getItem() == fruits[0])
					sum -= 100;
				else if(e.getItem() == fruits[1])
					sum -= 500;
				else
					sum -= 20000;
			}
			sumLabel.setText("현재" + sum + "원 입니다.");
		}
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new CheckBoxItemEventEx();
	}
}


11.5 ) 라디오 버튼, JRadioButton

  • 라디오버튼이란?
    • 여러 버튼을 그룹으로 형성하고, 그룹에 속한 버튼 중 하나만 선택 상태 가 되는 버튼
      • 다른 버튼이 선택되면 이전에 선택된 버튼은 자동으로 해제됨
    • 체크박스와의 차이점
      • 체크 박스는 각 체크박스마다 선택/해제가 가능하지만 라디오 버튼은 그룹에 속한 버튼 중 하나만 선택 상태가 됨
    • 이미지를 가진 라디오버튼의 생성 및 다루기는 체크박스와 완전히 동일

  • 생성자
//디폴트는 선택되지 않은 상태, JCheckBox 의 생성자와 동일
JRadioButton() // 빈 라디오 버튼
JRadioButton(Icon image) //이미지 라디오버튼
JRadioButton(Icon image, boolean selected) //이미지 라디오버튼
JRadioButton(String text) //문자열 라디오 버튼 
JRadioButton(String text, boolean selected) //문자열 라디오 버튼
JRadioButton(String text, Icon image) //문자열과 이미지를 가진 라디오 버튼
JRadioButton(String text, Icon image, boolean selected) //문자열과 이미지를 가진 라디오 버튼

// seleted : true 이면 선택 상태로 초기화, 디폴트는 해제 상태

라디오 버튼 생성 과정

  • 라디오 버튼의 생성은 JRadioButton 의 생성자를 호출하는 것만으로 끝나지 않고,
    다음 4가지 과정을 거쳐야 한다.
    • \to 단독으로 동직하는 것이 아닌 그룹 중에서 하나가 선택되기 때문에, 그룹으로 관리하는 부분이 추가 된다.
//1. 버튼 그룹 객체 생성 (중요) ⭑⭑⭑
ButtonGroup group = new ButtonGroup();

//2. 라디오 버튼 컴포넌트 생성
JRadioButton apple = new JRadioButton("사과");
JRadioButton pear = new JRadioButton("배");
JRadioButton cherry = new JRadioButton("체리");

//3. 라디오 버튼을 버튼 그룹에 등록 ⭑⭑⭑
group.add(apple);
group.add(pear);
group.add(cherry);

//4. 라디오 버튼을 컨테이너에 삽입
container.add(apple);
container.add(pear);
container.add(cherry);

예제 11-7 : ItemEvent 활용, 사진 보여 주기

//라디오 버튼 클릭 -> ItemEvent 발생
//수행할 메소드 -> itemStateChanged()
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class RadioButtonItemEventEx extends JFrame {
	private JRadioButton [] radio = new JRadioButton[3]; //라디오 버튼 배열로 생성
	private String [] text = {"사과", "베", "체리"}; //텍스트 정보 배열로 생성
	private ImageIcon [] image = {new  ImageIcon("images/apple.jpg"), //이미지 정보도 미리 배열로 생성해둠
			new ImageIcon("images/pear.jpg"), 
			new ImageIcon("images/cherry.jpg")};
	private JLabel imageLabel = new JLabel();
	
	RadioButtonItemEventEx() {
		setTitle("라디오버튼 Item Event 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new BorderLayout());
		
		JPanel panel = new JPanel(); //기본 컨텐트팬과는 다른 새로운 패널을 하나 생성
		panel.setBackground(Color.GRAY);
		
		ButtonGroup g = new ButtonGroup();  //⭑⭑⭑
		for(int i=0; i<radio.length; i++) { //위 회색 영역에 3개의 라디오 버튼 등록
			radio[i] = new JRadioButton(text[i]);
			g.add(radio[i]); // ⭑⭑⭑ 그룹에 등록
			panel.add(radio[i]); // ⭑⭑⭑ panel 에 등록
            //⭑ 여기서 발생한 이벤트를 처리하기 위한 MyItemListener 라는 클래스의 리스너 객체를 생성
			radio[i].addItemListener(new MyItemListener()); //⭑⭑⭑
		}
        
        //setSelected(true) 메소드 호출로 인해 
        //Item 이벤트가 발생하여 해당하는 이미지 출력됨
		radio[2].setSelected(true); //⭑⭑
		c.add(panel, BorderLayout.NORTH); //전체 패널에서 위에서 새로 생성한 회색패널을 북쪽에 배치
		c.add(imageLabel, BorderLayout.CENTER); //중앙에는 이미지 등록
		imageLabel.setHorizontalAlignment(SwingConstants.CENTER);
			
		setSize(250, 200);
		setVisible(true);
	}
	
	class MyItemListener implements ItemListener {
		public void itemStateChanged(ItemEvent e) { //⭑ 라디오 버튼을 클릭시 ItemEvent 가 발생하여 인자로 들어감
			if(e.getStateChange() == ItemEvent.DESELECTED) 
				return;
			// ⭑⭑ 라디오 0, 1, 2가 선택이 됬는지 검증하고 각 ImageLabel 정보로 변경 후 출력
			if(radio[0].isSelected())
				imageLabel.setIcon(image[0]);
			else if(radio[1].isSelected())
				imageLabel.setIcon(image[1]);
			else
				imageLabel.setIcon(image[2]);
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new RadioButtonItemEventEx();
	}
}


11.6 ) JTextField, 텍스트필드 컴포넌트

  • 텍스트 필드란?
    • 한 줄 짜리 텍스트(문자열) 입력 창을 구현한 컴포넌트
    • 텍스트 입력 도중 <Enter> 키가 입력되면 Action 이벤트 발생
    • 입력 가능한 문자 개수와 입력 창의 크기는 서로 다르다.
  • 생성자
// 빈 텍스트 필드
JTextField()		

// 입력 창의 크기가 columns 개 빈 텍스트 입력 창 생성
JTextField(int columns)

// text 문자열로 초기화된 텍스트 입력 창 생성
JTextField(String text)

// 입력 창의 크기가 columns 개이고, text 문자열이 초기 출력된 텍스트 입력 창 생성
JTextField(String text, int columns)

11-7 패스 (필요한 예제만 할 것임)

텍스트 필드의 주요 메소드

// 텍스트의 편집을 불가능하게 하기 
JTextField.setEditable(false);

// 텍스트 창에 강제로 문자열 출력하기 
JTextField.setText("hello");

//텍스트 폰트 지정하기
JTextField.setFont(new Font("고딕체", Font.ITALIC, 20);

//텍스트 창에 있는 문자열 선택하기
JTextField.select(0, 5); //0번 문자에서 5번째까지 문자열 선택

11.7 ) JTextArea, 텍스트영역 컴포넌트

  • 텍스트 영역이란?

    • 여러 줄을 입력할 수 있는 텍스트 입력창
    • 우리가 입력한 textArea 나 textField 는 기본적으로 스크롤바를 지원하지 않는다.
      • 대안 : JScrollPane 객체 에 삽입하는 방식으로 스크롤바 지원 ⭑
  • 생성자: (4 종류)

//빈 텍스트 영역
JTextArea()

//입력 창이 rows x columns개의 문자 크기인 텍스트 영역
JTextArea(int rows, int columns)

//text 문자열로 초기화된 텍스트 영역
JTextArea(String text)

//입력 창의 크기가 rows x columns개의 문자 크기 이며, text 문자열로 초기화된 텍스트 영역
JTextArea(String text, int rows, int columns)

스크롤바 객체의 인자로 TextArea 객체 전달!

예제 11-9 : JTextArea 컴포넌트 생성

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class TextAreaEx extends JFrame {
	private JTextField tf = new JTextField(20);
	private JTextArea ta = new JTextArea(7,20);
	
	public TextAreaEx() {
		setTitle("텍스트 영역 만들기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		c.add(new JLabel("입력 후 <Enter> 키를 입력하세요"));
		c.add(tf);
		c.add(new JScrollPane(ta));
		tf.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JTextField t = (JTextField)e.getSource();
				ta.append(t.getText() + "\n");  //⭑⭑⭑ <Enter>키가 입력되면 
                								//t에서 발생한 텍스트 정보를 읽어와 (문자열 + "\n") 를ta 끝에 추가한다. 
                								//그 텍스트 정보는 tf 에 입력된 문자열 
                								
				t.setText("");  //⭑ 하나를 입력하고 지워진것처럼 표시
			}
		});
		setSize(300, 250); setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new TextAreaEx();
	}
}

[해설]

tf 는 스크롤지원 x , ta 는 스크롤을 지원하기 떄문에 밑에 Area 부분에 스크롤이 생성됨.


11.8 ) JList<E>, 리스트 컴포넌트

  • JList<EE>
    • 리스트 컴포넌트란?
      • 여러 개의 아이템을 리스트 형식으로 보여주고 선택하는 컴포넌트
      • JComboBox<EE> 와 기본적으로 같은 기능
      • JScrollPane에 Jlist<EE>를 삽입하여 스크롤 가능
    • JList<EE>
      • JDK7부터 제네릭 리스트로 바뀜
      • <EE>에 지정된 타입의 객체만 저장하는 리스트
  • 생성자

리스트를 생성하는 3가지 방법 + 스크롤 지원

//1-1 객체 배열로 아이템 제공
String [] fruits= {"apple", "banana", "kiwi", "mango", "pear", "peach", "berry", "strawberry", blackberry"}; 
JList<String> strList = new JList<String>( fruits );

//1-2 Vector로 아이템 제공
Vector v = new Vector();
v.add("apple");
v.add("banana");
v.add("kiwi");
JList<String> vList = new JList<String>(v);

//1-3 빈 JList 컴포넌트를 생성하고 setListData() 로 아이템 제공 ⭑⭑⭑⭑⭑
//이미지로도 리스트를 제공할 수도 있다. ⭑⭑
ImageIcon [] images = { new ImageIcon("images/icon1.png"), new ImageIcon("images/icon2.png"), 
					  new ImageIcon("images/icon3.png"), new ImageIcon("images/icon4.png") };
JList<ImageIcon> imageList = new JList<ImageIcon>(); 
imageList.setListData( images );

//2. 스크롤링을 지원하는 방법 ⭑⭑⭑⭑⭑
JList scrollList = new Jlist<String>(fruits); 
new JScrollPane( scrollList );

예제 11-10 : 3종류의 리스트 컴포넌트 생성

import javax.swing.*;
import java.awt.*;

public class ListEx extends JFrame {
	private String [] fruits= {"apple", "banana", "kiwi", "mango", "pear",
					"peach", "berry", "strawberry", "blackberry"};
	
	ImageIcon [] images = { new ImageIcon("images/icon1.png"),
				new ImageIcon("images/icon2.png"), new ImageIcon("images/icon3.png"), 
				new ImageIcon("images/icon4.png") };
	public ListEx() {
		setTitle("리스트 만들기 예제"); 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		Container c = getContentPane(); // 컨텐츠팬 관리 참조 변수 c 
		c.setLayout(new FlowLayout());
		
		JList<String> strList = new JList<String>(fruits); 
		c.add(strList); // 리스트 컴포넌트 생성 후 부착
		JList<ImageIcon> imageList = new JList<ImageIcon>(); 
		imageList.setListData(images);  //⭑⭑⭑⭑⭑
		c.add(imageList); // 이미지 리스트 컴포넌트 생성 후 부착
		JList<String> scrollList = new JList<String>(fruits); // 리스트 컴포넌트 생성 
		c.add(new JScrollPane(scrollList)); //⭑⭑⭑⭑⭑ 스크롤 추가하여부착
		setSize(300,300);
		setVisible(true); 
	}
	public static void main(String [] args) { 
		new ListEx(); 
	} 
}

리스트 아이템 변경

앞선 내용은 리스트를 단순 출력인데 이것은 리스트를 보관해서 출력하는 방식이다

  • JList<EE>의 특징
    • JList<EE>(Vector listData)나 JList(Object [] listData)로 리스트가 생성되고 나면 벡터나 배열을 수정해도 리스트 수정 안됨
  • 리스트를 수정하는 간단한 방법
    • JList<EE>의 setListData()를 호출
      • 리스트에 수정된 벡터나 배열을 새로 달아주는 방법

예제 11-11 : 리스트의 아이템 변경

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*;

public class ListChangeEx extends JFrame {
	private JTextField tf = new JTextField(10);
	private Vector<String> v = new Vector<String>(); //⭑⭑⭑ 이름 목록 벡터 v
	private JList<String> nameList = new JList<String>(v); //⭑⭑⭑ 이름 리스트

	public ListChangeEx( ) {
		setTitle("리스트 변경 예제"); 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
  
		c.add(new JLabel("이름 입력 후 <Enter> 키")); 
  		c.add(tf);
  
		v.add("홍길동");
		v.add("이하이"); 
		nameList.setVisibleRowCount(5); 
		nameList.setFixedCellWidth(100); 
		c.add( new JScrollPane(nameList) );
		
		setSize(300,180); 
		setVisible(true);

		//	JTextField에 ActionLister 등록. <Enter> 키 처리 
		tf.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) { 
				JTextField t = (JTextField)e.getSource(); 
				v.add(t.getText());
				t.setText("");
				nameList.setListData(v); 
  		    } //⭑⭑⭑ 이름 목록 벡터 v를 
		});   //⭑⭑⭑ List 참조변수 ‘nameList’를 활용하여, List에 추가 
			 
	}
	public static void main(String [] args) { 
		new ListChangeEx();
	}
}

[설명]
문자열을 관리하는 '벡터' 가 있고 그 벡터에 홍길동과 이하이를 추가
그런다음 그 벡터에 있는 정보를 리스트 정보로 내보내줄것
정보를 추가 해주는것은 벡터에 저장
입력한 정보가 리스너에 전달되는 부분인 v.add(t.getText()); 한 뒤 지워진 것처럼 t.setText(" "); 로 햐준뒤 리스트에 넣기


11.9 ) JComboBox, 콤보박스 컴포넌트

콤보박스 컴포넌트

  • 콤보박스란?
    • JComboBox<EE>
    • 리스트와 텍스트필드가 합쳐진(입력도가능, 리스트 선택도 가능) 구조라 이해 ⭑⭑⭑
    • 텍스트 필드와 버튼, 그리고 드롭다운 리스트로 구성
  • 콤보박스 생성자

예제 11-12 : 콤보박스 만들기 (설명만하고 넘어감)

두개의 콤보박스 만들기
fruit 라는 배열 정보를 strCombo 라고해서 초기 값으로 제공해주고
두번째 콤보박스는 아무것도 정보를 제공하지 않았기 때문에 아이템 하나하나를 반복문을 통해서 제공해주는 형태로 만들어준다.

JComboBox<E> 와 Action 이벤트

  • [콤보박스에서 아이템 선택 시] → Action 및 Item 이벤트 동시 발생
    • 프로그래머가 목적에 맞게 해당 이벤트를 선택하여 처리!
  • [Action 이벤트 처리]
    • ActionListener 이용
    • 한 번의 아이템 선택 시 한 번의 ActionEvent 발생
  • [Item 이벤트 처리]
    • ItemListener 이용
    • 새로운 아이템이 선택되면 2 번의 ItemEvent 발생
      • 새로 아이템이 선택되었음을 알리는 Item 이벤트 발생
      • 이전에 선택된 아이템이 해제됨을 알리는 Item 이벤트 발생
    • 사용자가 아이템을 선택하지만 선택된 아이템이 변경되지 않을 경우에는 Item 이벤트가 발생하지 않음
  • 현재 선택된 아이템 알아내기: JComboBox의 다음 메소드 활용

예제 11-13 : Action 이벤트를 이용한 콤보박스 활용 예

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*;

public class ComboActionEx extends JFrame {
	private String [] fruits = {"apple", "banana", "pear", "mango"};
	private ImageIcon [] images = { new ImageIcon("images/apple.jpg"), new ImageIcon("images/banana.jpg"),
					new ImageIcon("images/pear.jpg"), new ImageIcon("images/mango.jpg") }; 
	private JLabel imgLabel = new JLabel(images[0]); //이미지 레이블 생성 
	private JComboBox<String> strCombo = new JComboBox<String>(fruits); //strCombo 콤보박스 생성
	
	public ComboActionEx() {
		setTitle("콤보박스 활용 예제");	
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		c.add(strCombo);
		c.add(imgLabel);
		
		//콤보박스 액션리스너 - 이너 클래스
		strCombo.addActionListener(new ActionListener( ) {  
			public void actionPerformed(ActionEvent e) {
				//Action 이벤트가 발생한 콤보박스 알아내기
				JComboBox<String> cb = (JComboBox<String>)e.getSource();
				// ⭑⭑⭑⭑ 콤보박스의 선택된 아이템의 인덱스 번호 알아내기
				int index = cb.getSelectedIndex(); 
				// ⭑⭑⭑⭑ 인덱스의 이미지를 이미지 레이블 컴포넌트에 출력
				imgLabel.setIcon(images[index]);
			} 
		});
		setSize(300,200);
		setVisible(true);
	}
	public static void main(String [] args) { new ComboActionEx(); } 
}

[해설]
fruit 문자열 정보, image 이미지 정보
콤보박스생성
리스트중 하나를 누르면 액션이 발생하여 액션 리스너가 그것을 받아서 이벤트 처리
누가 눌려졌는지 에대한 인덱스 정보를 얻어와 그 인덱스 정보로 해당하는 아이콘 정보가 변경하도록


11.10 ) JSlider, 슬라이더 컴포넌트

슬라이더, JSlider

  • 슬라이더란?
    • 일정 범위 내에서 마우스로 움직이면서 값을 선택 하는 컴포넌트
    • 슬라이더 구성 요소
      • 수평 or 수직 슬라이더
      • 작은 눈금이 minor 큰 눈금은 major
  • 슬라이더 생성
    • 슬라이더의 디폴트 값
      • minimum=0, maximum=100, value=50인 수평 슬라이더

슬라이더의 모양 제어

//슬라이더 방향 설정
void setOrientation(int orientation)
   ◼ orientation: JSlider.HORIZONTAL, JSlider.VERTICAL
// 최대 최소값 설정
void setMaximum(int max) 
void setMinimum(int min)
  
// label 보이기/감추기
void setPaintLabels(boolean b)
   ◼ b가 true이면 label 출력, false이면 감추기

//tick 보이기/감추기
void setPaintTicks(boolean b)
   ◼ b가 true이면 눈금 출력, false이면 감추기
  
//track 보이기/감추기
void setPaintTrack(boolean b)
   ◼ b가 true이면 track 출력, false이면 감추기 
  
// 큰 눈금 간격 지정
void setMajorTickSpacing(int space) 
  
// 작은 눈금 간격 지정
void setMinorTickSpacing(int space) 

// 슬라이더 값 제어
void setVaule(int n)
   ◼ n이 슬라이더의 값이 되며 이에 따라 슬라이더의 손잡이 위치가 변경된다.

JSlider와 Change 이벤트

  • 발생 이벤트: ChangeEvent
    • JSlider의 값(value)이 바뀌면 발생
      • 사용자가 슬라이더의 손잡이를 움직이는 경우
      • JSlider의 setValue(int n)를 호출하여 값(value 필드)이 바뀌는 경우
  • ChangeListener의 메소드

예제 11-15 : JSlider 와 Change 이벤트를 활용한 색깔 다루기

import javax.swing.*; 
import java.awt.*; 
import javax.swing.event.*;

public class SliderChangeEx extends JFrame {
	private JLabel colorLabel;
	private JSlider [] sl = new JSlider [3]; // 3개의 슬라이더 배열 생성 
	public SliderChangeEx() {
		setTitle("슬라이더와 ChangeEvent 예제"); 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		colorLabel = new JLabel(" SLIDER EXAMPLE ");
		for(int i=0; i<sl.length; i++) { // 반복문: 슬라이더 3개 생성하고, 모양을 제어
			sl[i] = new JSlider(JSlider.HORIZONTAL, 0, 255, 128); 
			sl[i].setPaintLabels(true);
			sl[i].setPaintTicks(true);
			sl[i].setPaintTrack(true);
			sl[i].setMajorTickSpacing(50); 
			sl[i].setMinorTickSpacing(10);  //슬라이더에 MyChangeListerner() 리스너 등록
			sl[i].addChangeListener(new MyChangeListener()); 
			c.add(sl[i]); // 슬라이더를 컨텐트팬에 부착
		}
		sl[0].setForeground(Color.RED); // 슬라이더 눈금 표의 색상: R, G, B 설정 
		sl[1].setForeground(Color.GREEN);
		sl[2].setForeground(Color.BLUE);
		
		int r = sl[0].getValue();
		int g = sl[1].getValue(); // 슬라이더 눈금 정보를 얻어와서
		int b = sl[2].getValue(); // “SLIDER EXAMPLE”: colorLabel 배경색 설정함
		
		colorLabel.setOpaque(true); // 배경을 불투명하게 설정(배경색 출력되도록) 
		colorLabel.setBackground(new Color(r,g,b)); // colorLabel 배경색 설정함 
		c.add(colorLabel);
		setSize(300,230);
		setVisible(true);
	}
	class MyChangeListener implements ChangeListener {
		public void stateChanged(ChangeEvent e) {
			int r = sl[0].getValue();
			int g = sl[1].getValue();
			int b = sl[2].getValue();
			colorLabel.setBackground(new Color(r,g,b));
		}
	}
	
	public static void main(String [] args) {
		new SliderChangeEx();
	}
}	

[해설]
슬라이더를 배열로 만들기
슬라이더를 3개 생성할떄 반복문 사용
틱, 트랙, 레이블을 뭔지 알아야함.
원래는 개별로 리스너를 달아도 된다 (3개의 리스너)
하지만 하는 역할이 3개의 정보를 합성해야하기 떄문에 하나의 리스너를 만들어 0 1 2 번으로 등록을 한 것이다.
어디서 발생했던지간에 0 1 2 번에서의 rgb 값을 getValue 로 가져온다음에 배경색을 바꿔줌.

profile
공부한 것 기록용

0개의 댓글