

최상위 컨테이너를 바닥에 깔고, 그 위에 컨테이너를 놓고, 다시 컴포넌트를 쌓아가는 방식 ⇒ 레고 블록 쌓는 듯이 GUI 프로그램 작성

스윙 프레임 만들기 → main() 메소드 작성 → 스윙 프레임에 스윙 컴포넌트 붙이기
구성 : 프레임, 메뉴바, 컨텐트 팬(컴포넌트들이 부착되는 공간)
JFrame 클래스를 상속받은 클래스 작성
프레임 크기 반드시 지정(setSize()), 프레임을 화면에 출력하는 코드 반드시 필요(setVisible(true))
public class 클래스명 extends JFrame {
public 클래스명() {
setTitle("타이틀"); //타이틀 (또는 super("타이틀");)
setSize(가로길이,세로길이); //프레임 크기
setVisible(true); //프레임을 화면에 출력
setDefaultCloseOperaion(JFrame.EXIT_ON_CLOSE); //닫기버튼 누르면 프로그램도 종료
Container 컨텐트팬변수 = getContenPane(); //프레임에 붙은 디폴트 컨텐트팬 알아내기
컨텐트팬변수.setBackground(Color.ORANGE); //배경색(오렌지)
컨텐트팬변수.setLayout(new FlowLayout()); //컨텐트팬에 FlowLayout 배치관리자로 설정
JButton 버튼변수 = new JButton("표시글씨"); //버튼 컴포넌트 생성
컨텐트팬변수.add(버튼변수); //컨텐트팬에 버튼부착
컨텐트팬변수.add(new JButton("표시글씨2"); //버튼 컴포넌트 생성하여 컨텐트팬에 부착
}
public static void main(String[] args){
클래스명 변수명 = new 클래스명(); //스윙 프레임 생성
}
}
Container 컨텐트팬변수 = getContenPane(); : 프레임에 붙은 디폴트 컨텐트 팬 알아내기컨텐트팬변수.setBackground(Color.색깔); : 컨텐트 팬 배경색 지정컨텐트팬변수.add(컴포넌트변수); : 컨텐트 팬에 컴포넌트 붙이기System.exit(0); : 응용프로그램 내에서 스스로 종료 (언제 어디서나 무조건 종료)frame.setDefaultCloseOperaion(JFrame.EXIT_ON_CLOSE); : 프레임 종료버튼 클릭 시 프레임과 응용프로그램 종료: 컨테이너에 부착되는 컴포넌트의 위치와 크기 결정
컨테이너변수.setLayout(new 배치관리자유형()); : 컨테이너에 배로운 배치관리자 설정JPanel p = new JPanel(); p.setLayout(new BorderLayout()); : JPanel에 BorderLayout 설정: FlowLayout() , FlowLayout(align, hGap, vGap)

: BorderLayout() , BorderLayout(hGap, vGap)
컨테이너변수.add(컴포넌트, index); (컴포너트를 index위치에 배치)
: GridLayout() , GridLayout(rows, cols) , GridLayout(rows, cols, hGap, vGap)

컨테이너변수.setLayout(null); 컴포넌트변수.setSize(width, height) : 크기 설정컴포넌트변수.setLocation(x, y) : 위치 설정컴포넌트변수.setBounds(x, y, width, height) : 위치와 크기 동시 설정: 이벤트를 처리하는 자바 프로그램 코드
이벤트 기반 프로그래밍 : 이벤트 발생에 의해 프로그램 흐름 결정되는 방식
이벤트 객체 : 발생한 이벤트에 관한 정보를 가진 객체
이벤트객체.getSource() : 발생한 이벤트 소스 컴포넌트 리턴
| 이벤트 객체 | 이벤트 소스 | 이벤트 발생하는 경우 |
|---|---|---|
| ActionEvent | JButton | 마우스/키 |
| JMenuItem | 메뉴 아이템 선택 | |
| JTextField | 텍스트 입력 중 키 | |
| ItemEvent | JCheckBox | 체크박스 선택/해제 |
| JRadioButton | 라디오버튼 선택 상태 변경 | |
| JCheckBoxMenuItem | 체크박스 메뉴 아이템 선택/해제 | |
| ListSelectionEvent | JList | 리스트에 선택된 아이템 변경 |
| KeyEvent | Component | 키 누르기/떼기 |
| MouseEvent | Component | 마우스 누르기/떼기/올리기/내려가기/드래그/움직이기 |
| FocusEvent | Component | 포커스 받기/잃기 |
| WindowEvent | Window | 윈도우 활성화/비활성화/아이콘화, 아이콘에서 복구, 열기/닫기/종료 |
| ComponentEvent | Component | 컴포넌트 사라지기/나타나기/이동/크기변경 |
| ContainerEvent | Container | 컴포넌트 추가/삭제 |
이벤트 리스너는 클래스로 작성 (리스터 인터페이스를 상속받아 구현)
// 1. 이벤트 리스너 클래스 작성 (리스너인터페이스 에 속한 추상메소드 모두 구현!!)
class 리스너클래스명 implements 리스너인터페이스 {
public void 추상메소드명(이벤트객체 e) {
구현코드
}
}
// 2. 작성한 이벤트 리스너 등록
리스너클래스명 리스너변수 = new 리스너클래스명();
컴포넌트변수.add리스너인터페이스(리스너변수);
| 리스너 인터페이스 | 대응하는 어댑터 | 추상 메소드 | 메소드 호출되는 경우 |
|---|---|---|---|
| ActionListener | 없음 | actionPerforemed(ActionEvent) | Action이벤트 발생 |
| ItemListener | 없음 | itemStateChanged(ItemEvent) | Item이벤트 발생 |
| KeyListener | KeyAdapter | keyPressed(KeyEvent) | 키가 눌러질 때 |
| keyReleased(KeyEvent) | 키가 떼어질 때 | ||
| keyTyped(KeyEvent) | 유니코드 키 입력될 때 | ||
| MouseListener | MouseAdapter | mousePressed(MouseEvent) | 마우스 버튼 눌러질 때 |
| mouseReleased(MouseEvent) | 마우스 버튼 떼어질 때 | ||
| mouseClicked(MouseEvent) | 마우스 버튼 클릭될 때 | ||
| mouseEntered(MouseEvent) | 마우스가 컴포넌트 위에 올라올 때 | ||
| mouseExited(MouseEvent) | 마우스가 컴포넌트를 벗어날 때 | ||
| MouseMotionListener | MouseAdapter | mouseDragged(MouseEvent) | 마우스를 컴포넌트 위에서 드래그할 때 |
| mouseMoved(MouseEvent) | 마우스를 컴포넌트 위에서 움질일 때 | ||
| FocusListener | FocusAdqpter | focusGained(FocusEvent) | 컴포넌트가 포커스 받을 때 |
| focusLost(FocusEvent) | 컴포넌트가 포커스를 잃을 때 | ||
| WindowListener | WindowAdapter | windowOpened(WindowEvent) | 윈도우 생성되어 처음 보일 때 |
| windowClosing(WindowEvent) | 윈도우 닫기 시도할 때 | ||
| windowIconfied(WindowEvent) | 윈도우가 아이콘화될 때 | ||
| windowDeiconfied(WindowEvent) | 아이콘에서 원래 상태로 복귀할 때 | ||
| windowClosed(WindowEvent) | 윈도우가 닫혔을 때 | ||
| windowActivated(WindowEvent) | 윈도우가 활성화될 때 | ||
| windowDeactivated(WindowEvent) | 윈도우가 비활성화될 때 | ||
| ListSelectionListener | 없음 | valueChanged(ListSelectionEvent) | list에 선택된 아이템이 변경될 때 |
독립 클래스로 작성 : 이벤트 리스너를 완전한 클래스로 작성 (여러 곳에서 사용할 때 적합)
public class IndepClass extends JFrame {
public IndepClass() {
setTitle("Action이벤트리스너 독립 클래스");
setDefaultCloseOperaion(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
JBtton btn = new JButton("Action");
btn.addActionListener(new 리스너클래스명()); //ActionListener 등록
c.add(btn);
setSize(250,120);
setVisible(true);
}
public static void main(String[] args) {
new IndepClass();
}
}
//독립 클래스로 이벤트 리스너 작성
class 리스너클래스명 implements ActionListener { //ActionListener의 메소드 구현
public void actionPerformed(ActionEvent e) {
JButton b = (JButton)e.getSource();
if (b.getText().equals("Action")) b.setText("액션");
else b.setText("Action");
}
}
내부 클래스로 작성 : 클래스 안에 멤버처럼 클래스 작성 (특정 클래스에서만 사용할 때 적합)
public class InnerClass extends JFrame {
public InnerClass() {
setTitle("Action이벤트리스너 내부 클래스");
setDefaultCloseOperaion(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
JBtton btn = new JButton("Action");
btn.addActionListener(new 리스너클래스명()); //ActionListener 등록
c.add(btn);
setSize(250,120);
setVisible(true);
}
//내부 클래스로 이벤트 리스너 작성
private class 리스너클래스명 implements ActionListener {
public void actionPerformed(ActionEvent e) {
JButton b = (JButton)e.getSource();
if (b.getText().equals("Action")) b.setText("액션");
else b.setText("Action");
InnerClass.this.setTitle(b.getText());
}
public static void main(String[] args) {
new InnerClass();
}
}
익명 클래스로 작성 : 클래스의 이름 없이 간단히 작성(간단한 리스너이면 익명 클래스 사용 추천)
public class AnonymousClass extends JFrame {
public AnonymousClass() {
setTitle("Action이벤트리스너 내부 클래스");
setDefaultCloseOperaion(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
JBtton btn = new JButton("Action");
//익명 클래스로 이벤트 리스너 작성 (이벤트리스너클래스명 없음. 등록하면서 그 안에 작성)
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
JButton b = (JButton)e.getSource();
if (b.getText().equals("Action")) b.setText("액션");
else b.setText("Action");
setTitle(b.getText());
}
}); //ActionListener 등록 + 구현
//람다식 이벤트 리스너 작성(메소드가 한개인 경우만 가능)
btn.addActionListener((ActionEvent e) -> {
JButton b = (JButton)e.getSource();
if (b.getText().equals("Action")) b.setText("액션");
else b.setText("Action");
});
c.add(btn);
setSize(250,120);
setVisible(true);
}
public static void main(String[] args) {
new AnonymousClass();
}
}
(ActionEvent e) → { e.setText("액션"); }(e) → { e.setText("액션"); }e → e.setText("액션");추상 메소드가 1개뿐인 이벤트 리스너는 어댑터 없음
이벤트 리스너 인터페이스의 메소드 중 모두 구현하지 않고 몇 개 메소드만 구현하고 싶을 때 사용!
class 리스너클래스명 implements MouseListener { //모든 메소드 구현해야 함!
public void mousePressed(MouseEvent e) { //사용하는 메소드
구현할 메소드
}
public void mouseReleased(MouseEvent e) {} //사용하지 않는 메소드들
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
class 리스너클래스명 extends MouseAdapter { //사용하는 메소드만 구현
public void mousePressed(MouseEvent e) {
구현할 메소드
}
}