GUI - 윈도우와 같이 그림으로 이루어진 인터페이스
CLI - DOS와 같이 글자를 입력하는 인터페이스
-------------------------------
Z인덱스
최상위 컨테이너
웹브라우저에서 경고창이 뜨면 경고창이 최상위 컨테이너가된다
---------------------------------
SWING
SWING은 AWT와 달리 순수 자바 언어로 작성되었다.
스윙은 AWT에 구현된 이벤트 처리나 GUI 컴포넌트의 기본 원리를 바탕으로 작성되었기 때문에,
스윙을 사용하기 위해 AWT패키지가 필요하다.
SWING을 배워두면 안드로이드도 배우기 쉬워진다
모니터 자체를 창(window) - OS관할
그안의 화면 전체를 도화지(canvas)
도화지의 좌측최상단을 X = 0 , Y = 0
각각의 좌표값을 픽셀이라고한다
SWING의 기본 레이아웃은 border레이아웃
border안에 panal을 넣어서 플로우를 그 안에 넣어서 위치를 정한다
GUI 컴포넌트들은 다른 컴포넌트를 포함할 수 있는지 여부에 따라 순수 컴포넌트와 컨테이너로 분류된다.
컨테이너란 다른 GUI 컴포넌트를 포함할 수 있는 컴포넌트이다.
최상위 컨테이너는 JFrame, JDialog, JApplet이 있다
컴포넌트 (위젯)
Button, TextField, TextArea 등
자주쓰는 기능 (버튼 등)은 재사용을 하기 위해 미리 클래스화 하여 만들어 놓는 것
특징 - 이벤트가 달려있다 (클릭이나 건들였을 때 반응이 일어나도록 하는 것)
변형을 주고 싶으면 상속을 받아서 오버라이딩 하여 사용한다
컴포넌트는 컨테이너 안에서 존재 할 수 있다
컨테이너
컨테이너는 컴포넌트를 포함 할 수 있는 컴포넌트를 말한다
자바의 컨테이너는 Frame, Panel, Scrollpane
HTML의 BODY는 컨테이너, 도화지 역할
자바의 Frame은 HTML의 BODY와 같은 역할
자바의 panel은 HTML의 DIV역할
이벤트
컴포넌트를 건들이는 것을 알아차리는 주체는 OS이다
알아차린 OS의 리스너는 우리에게 Callback해준다
Callback시 context(해당 컴포넌트가 가진 모든 정보)를 돌려준다
자바 이벤트분배스레드(Queue)는 context를 가지고 있다
리스너 - OS - 자바 이벤트분배스레드(Queue)
ex)
1.사용자가 마우스로 화면의 버튼을 클릭한다
2.이벤트 분배 스레드에게 마우스 클릭에 관한 정보를 보낸다
3.이벤트 분배 스레드는 이벤트 객체를 생성한다
이벤트 객체는 이벤트에 관한 여러 정보(context)를 담은 객체이다
이벤트 객체 내의 이벤트 소스는 위에서 클릭한 버튼자체이다
4.이벤트 분배 스레드는 타겟을 호출한다
커스터마이징
------------------------
Paint
setVisible시 그림을 그려줌
RePaint
setVisible상태에서 다른 것을 입력하거나 화면을 바꾸게 되면
RePaint로 해당 컴포넌트만 다시 그린다
-----------------------
1. 컨테이너 vs 컴포넌트
2. 레이아웃 4가지
3. 스윙 동작 구조
4. 리스너 등록 3가지 방법
- 익명 클래스 만들기
- 클래스 만들기(내부, 외부)
- this
-----------------------
리스너 등록 3가지 방법
1. - 익명 클래스 만들기
package ch14;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
// 익명 클래스로 타겟 생성
public class EventEx01 extends JFrame {
public EventEx01() {
setTitle("Action 이벤트 리스너 예제");
// x버튼 클릭시 이벤트 분배스레드 끄기
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JButton btn = new JButton("Action");
// 리스너 생성
btn.addActionListener(new ActionListener() {
// 타겟 (이벤트 분배 스레드가 콜백)
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("버튼클릭됨");
// e는 context, e.getSource()는 이벤트 소스
JButton b = (JButton) e.getSource();
System.out.println(b.getText());
b.setText("액션"); // RePaint()
}
});
c.add(btn);
setSize(350,150);
setVisible(true);
}
public static void main(String[] args) {
new EventEx01();
}
}
2. 클래스 만들기(내부, 외부)
package ch14;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
// 외부 클래스로 리스너 타겟 생성
class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
JButton b = (JButton) e.getSource();
if (b.getText().equals("Action")) {
b.setText("액션");
} else {
b.setText("Action");
}
}
}
public class EventEx011 extends JFrame {
public EventEx011() {
setTitle("Action 이벤트 리스너 예제");
// x버튼 클릭시 이벤트 분배스레드 끄기
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JButton btn = new JButton("Action");
// 리스너 생성
btn.addActionListener(new MyActionListener());
c.add(btn);
setSize(350,150);
setVisible(true);
}
public static void main(String[] args) {
new EventEx011();
}
}
3. this
package ch14;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
// 메인 클래스에 ActionListener를 구현하고 this로 객체를 리스너의 타겟으로 만든다
public class EventEx012 extends JFrame implements ActionListener {
public EventEx012() {
setTitle("Action 이벤트 리스너 예제");
// x버튼 클릭시 이벤트 분배스레드 끄기
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JButton btn = new JButton("Action");
// 리스너 생성
btn.addActionListener(this);
c.add(btn);
setSize(350,150);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("버튼 클릭됨");
}
public static void main(String[] args) {
EventEx012 ex012 = new EventEx012();
}
}
-----------------------
Frame
AWT는 아무것도 하지 않으면 프레임만 있는데
SWING은 기본적으로 프레임 안에 패널이 하나 들어가 있다
기본적으로 SWING은 border속성이기때문에 설정을 안해주면 버튼이
화면을 꽉 채운다
플로우 레이아웃을 생성하고 그 곳에 버튼을 넣으면 아래와 같이 나온다
현재 X버튼을 눌러도 창만 꺼질 뿐 프로그램 자체는 꺼지지 않는 상태이다
X버튼 설정, FlowLayout
WindowBuilder (SWING 대신)
next next accept
'Programming Language > Java' 카테고리의 다른 글
자바 SWING 리스너 (0) | 2020.04.22 |
---|---|
20200421 (0) | 2020.04.21 |
자바 문자 보내기 (0) | 2020.04.17 |
자바 String, StringBuilder, StringBuffer (0) | 2020.04.17 |
자바 GUI (0) | 2020.04.17 |