체크박스를 클릭하면 아이템이 선택된다. 체크박스는 두개 이상의 아이템을 선택할 수 있다. ItemListener에는 itemStateChanged 라는 메소드가 있다. 아이템 리스너를 구현할 때는 이것 하나만 오버라이드 해주면 된다.
어떤 아이템을 클릭했는지 ItemEvent클래스의 참조를 통해서 확인할 수 있다. Checkbox1, 2 두개가 있다면 어떤 Checkbox 를 클릭했는지, 그리고 다음에는 체크표시를 한것인지 (true) 안한 건지(false)에 따라 삼항연산자를 적용한다.(간략한 if문이다) State상태가 true면 checked false 면 unchecked 다.
*삼항 연산자 식 : 조건 ? 참일때 항 : 거짓일때 항
str = (a == 1 ? "a is 1" : "a is not 1") a가 1이면 "a is 1" , a 가 1이 아니면 "a is not 1" 을 반환.
-> str = "a is 1"; // 의 결과값을 str에 저장
import java.awt.*;
import java.awt.event.*;
public class AwtGUI8 extends Frame implements ItemListener,KeyListener,WindowListener{
int count=0;
Label lb1;
Label lb2;
Checkbox cb1;
Checkbox cb2;
TextArea ta1;
AwtGUI8(){
// Checkbox ItemEvent
lb1 = new Label("BLANK");
lb1.setAlignment(lb1.CENTER);
lb1.setSize(300,100);
cb1 = new Checkbox("CHECK 1");
cb1.setBounds(100,100,80,50);
cb2 = new Checkbox("CHECK 2");
cb2.setBounds(100,150,80,50);
cb1.addItemListener(this);
cb2.addItemListener(this);
// KeyListener
lb2 = new Label("First Pos");
lb2.setBounds(100, 200, 150, 50);
ta1 = new TextArea();
ta1.setBounds(100,250,300,300);
ta1.addKeyListener(this);
// WindowEvent
addWindowListener(this);
// Below is Frame
add(lb1);add(cb1);add(cb2);
add(lb2);add(ta1);
setTitle("Item Listener Interface");
setSize(500,700);
setLayout(null);
setVisible(true);
}
public static void main(String[] args) {
new AwtGUI8();
}
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getSource() == cb1)
lb1.setText("Checkbox 1 : "
+ (e.getStateChange()==1?"checked" : "unchecked"));
if(e.getSource() == cb2)
lb1.setText("Checkbox 2 : "
+ (e.getStateChange()==1?"checked" : "unchecked"));
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
lb2.setText("KEY TYPED");
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
lb2.setText("KEY PRESSED");
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
lb2.setText("KEY RELEASED");
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("Opend");
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("Closing");
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("Closed");
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("Iconified");
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("Deiconified");
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("Activated");
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("Deactivated");
}
}
키 리스너는 3개의 메소드를 구현해야한다. 키를 입력할 수 있는 컴포넌트는 현재 텍스트에리어다. 텍스트에리어에 글자를 입력하기 시작하면 레이블이 그때의 상태에 따라 동작한다. 키보드를 누른 상태는 Key Pressed(눌림) 눌렀다 때면 Key Releassed, 각 메서드들의 이름은 해당 동작을 의미하기 때문에 쉽게 이해할 수 있다.
인터페이스는 클래스의 일종이다. 클래스와 다른 점은 여러 인터페이스에서 상속을 받을 수 있다. 지금 100% 이해를 못해도 괜찮다. 인터페이스는 자바를 배우는 과정에서 가장 이해하기 어려운 내용에 속한다. OOP에 대한 깊은 이해를 하기 위해서는 프로그래밍 언어를 배우는 것 이상을 요구한다.
관심있는 분에게는 최근에 5팡이 나온 '객체지향 사고 프로세스' 라는 책과 '스프링 입문을 위한 자바 객체 지향의 원리와 이해'를 추천한다. 전자는 외서의 번역판이고, 후자는 저자 김종민 님이 유튜브에 10시간 이상 저자 직강의 강의를 올리셨다. (유튜브 강의는 무료다!)
*김종민 작가님의 스프링 입문을 위한 자바 객체 지향의 원리와 이해 저자 직강
그 동안 AWT 로 생성한 윈도우창을 닫기 위해서 익명 클래스를 사용했다. 이 포스트에서는 인터페이스를 구현한다.
public void windowClosing(WindowEvent e){
System.exit(0);
}
이 메서드는 윈도우의 닫기 버튼 'X'을 클릭했을 때 발생한다. 인터페이스 WindowListener를 구현하려면 소속된 메서드들을(windowOpened 등)을 전부 오버라이드 해야한다. 안그러면 컴파일 오류가 난다. 간단한 윈도우 프로그램의 경우 창을 닫기 위한 코드가 너무 길어지니까 수고수러움을 줄이기 위해서 WindowAdapter로 익명클래스를 사용한다.
이 소스 코드에서는 전부 구현해줬다. 딱히 메서드에 내용이 없으면
public void windowIconified(WindowEvent e){ }
이렇게만 implement 해도 된다. windowClosing은 종료하기 위해 사용했다.
https://docs.oracle.com/javase/8/docs/api/java/awt/event/WindowListener.html
그림으로 관계를 아래와 같이 그려본다.
객체지향 프로그래밍이 절차적 프로그래밍에 비해서 복잡하게 보일 수 있다.
자바 GUI라는 좀 딱딱한 주제라서 그런가 보다. 좀더 인간적인 예시도 참고하게 되면 더 나을 것이다.
(동물 클래스 상속하는 인간클래스 같은 내용)