java에서 GUI(Graphic User Interface - 윈도우즈) 프로그램을 하는 방법
- 1. AWT: 운영체제의 자원을 빌려서 사용
- 느리고 무겁기 때문에 잘 사용하지 않음
- Swing 이나 Android의 기반이 되기 때문에 주로 학습용으로 사용
- 2. Swing: JVM의 자원을 이용해서 사용
- AWT 보다는 가벼움
- AWT 보다 다양한 컴포넌트를 지원
- AWT 와 동일한 방식으로 프로그래밍
- 3. Java FX
- 가장 최근에 지원하기 시작한 GUI 프로그래밍
- 다양한 UI를 제공
- Swing 보다는 프로그래밍 하기가 까다로움
AWT
- Frame
- 하나의 윈도우에 해당하는 클래스
- 이 클래스의 인스턴스를 만들면 하나의 윈도우가 만들어집니다.
- 기본적으로 좌표는 0,0 이고 크기는 0,0 이며 화면이 보이지 않도록 설정되어 있습니다.
- 그래서 크기와 화면 출력 설정을 해주어야 합니다.
- 프레임을 상속받은 클래스를 만들고 이 클래스의 생성자에서 기본 설정을 하고 메인에서 인스턴스를 생성해서 화면에 출력하는 형식을 따릅니다.
- panel
- 여러 rodml Compoonent 들을 하나로 묶어주기 위해 사용하는 컨테이너
- 독자적으로 출력을 할 수 없기 때문에 Frame이나 다른 Panel의 위에 배치되서 화면에 출력됩니다.
- 컴포넌트 위에 배치할 때는 add(배치할 컴포넌트) 메소드를 이용합니다.
- Dialog(대화상자)
- 1) 종류
- Model Dialog: 대화상자가 출력되면 다른 컴포넌트에게 제어권을 옮길 수 없는 형식으로 코드 실행도 중단됩니다.
대화상자를 화면에서 제거해야만 다른 컴포넌트를 사용할 수 있고 코드도 수행됩니다.
- Modeless Dialog: 대화상자가 출력된 상태에서도 다른 컴포넌트에게 제어권을 옮길 수 있는 형식의 다이얼로그
- 2) 대화상자를 생성할 때는 생성자의 첫번째 매개변수에 자신의 부모 컴포넌트의 주소를 대입해야 합니다.
- Button
- 마우스로 클릭해서 작업을 수행하는 컴포넌트
- 기본적으로 글자도 보여주지만, 윈도우 기반으로 작동하기 때문에 ms949 형식으로 바꾸어 주어야 합니다.
- Checkbox
- 체크 박스와 라디오 버튼을 만들 수 있는 클래스
- 체크 박스는 하나도 선택하지 않을 수 있고, 여러 개를 선택 할 수도 있습니다.
- 라디오 버튼은 반드시 1개를 선택해야 할 때 사용합니다.
- 따라서 라디오 버튼을 만들 때는 디폴트를 설정해 주어야 합니다.
- 만들 때 생성자의 두번째 매개변수로 CheckboxGroup 인스턴스를 대입하면 라디오 버튼이 됩니다.
- 라이오 버튼은 3개가 넘어가면 잘 안 쓴다.(항목의 개수가 너무 많아서)
- Choice
- ComboBox라고 많이 불린다.
- 여러 개의 항목 중 하나의 항목만 선택하도록 하고자 할 때 사용하는 Component로 RadioButton과 유사한 역할을 하는 Component
- Label
- 텍스트를 출력하기 위한 Component
- List
- 여러 개의 항목을 보여주고 그 중 하나 또는 여러 개를 선택 할 수 있도록 해주는 Component
**오늘 중요 학습목표**
|
package guiEx1;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;
public class GuiEx1 extends Frame {
// 생성자
public GuiEx1() {
/*
* Dialog dialog = new Dialog(this, "대화상자"); // dialog.setTitle("대화상자");
* dialog.setSize(100, 100);
*/
this.setBackground(Color.ORANGE);
setSize(500, 500);
setLocation(100, 100);
setTitle("나의 첫번째 윈도우 프로그램");
Panel panel1 = new Panel();
Button button = new Button("버튼");
// 버튼의 배경색을 변경하는 스레드
// ColorThread th1 = new ColorThread(button); - 클래스 지워도 되지만 공부를 위해서 남겨둠.
Thread th1 = new Thread() {
public void run() {
Color[] colors = { Color.BLACK, Color.blue, Color.CYAN, Color.GREEN };
int count = 0;
while (true) {
try {
Thread.sleep(500);
button.setBackground(colors[count % colors.length]);
count = count + 1;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
th1.start();
Button button1 = new Button("버튼");
// 버튼의 텍스트를 변경하는 스레드
// TextThread th2 = new TextThread(button1);
Thread th2 = new Thread() {
public void run() {
String[] text = { "버튼", "button", "단추", "클릭" };
int count = 0;
while (true) {
try {
Thread.sleep(500);
button1.setLabel(text[count % text.length]);
count = count + 1;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
th2.start();
// add(button); 윈도우 크기로 너무 크게 만들어진다.
// 버튼 추가
panel1.add(button);
button.setLabel("클릭");
/*
* button.setBackground(Color.DARK_GRAY); button.setForeground(Color.white);
* button.setFont(new Font("맑은 고딕", Font.BOLD, 30));
*/
panel1.add(button1);
button1.setLabel("누르기");
/*
* button1.setBackground(Color.DARK_GRAY); button1.setForeground(Color.white);
* button1.setFont(new Font("맑은 고딕", Font.BOLD, 30));
*/
// 패널을 프레임에 추가
add(panel1);
setVisible(true);
/*
* int sign = 1; while(true) { try { Thread.sleep(1000); if(sign > 0) {
* button.setBackground(Color.MAGENTA); }else {
* button.setBackground(Color.LIGHT_GRAY); } sign= -sign; } catch
* (InterruptedException e) { e.printStackTrace(); } }
*/
}
}
package guiEx1;
import java.awt.*;
public class ColorThread extends Thread {
private Button button;
public ColorThread(Button button) {
this.button = button;
}
public void run() {
//한정된 값중에서 출력하고 싶을 때는 아래와 같이 배열을 만들어서 배열 길이로 증가값을 나눈 나머지로 출력하면 됩니다.
Color[] colors = { Color.red, Color.ORANGE, Color.green, Color.BLACK };
int idx = 0;
while (true) {
try {
idx = idx + 1;
Thread.sleep(1000);
button.setBackground(colors[idx % colors.length]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package guiEx1;
import java.awt.Button;
public class TextThread extends Thread {
private Button button1;
public TextThread(Button button1) {
this.button1 = button1;
}
public void run() {
String [] text = {"클릭", "누르기", "이동", "확인", "Apply"};
int idx1 = 0;
while(true) {
idx1 = idx1+1;
try {
Thread.sleep(1000);
button1.setLabel(text[idx1 % text.length]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package guiEx1;
public class GuiEx1Main {
public static void main(String[] args) {
new GuiEx1();
}
}
메인에서는 생성자만 부르면 됩니다.
package guiEx2;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Choice;
import java.awt.Frame;
import java.awt.List;
import java.awt.Panel;
public class GuiEx2 extends Frame {
public GuiEx2() {
setTitle("GUI 두번째 프로그램");
setLocation(100, 100);
setSize(500, 500);
Panel p = new Panel();
Checkbox cb1 = new Checkbox("독서");
Checkbox cb2 = new Checkbox("프랑스 자수");
Checkbox cb3 = new Checkbox("음악 감상");
Checkbox cb4 = new Checkbox("게임");
Checkbox cb5 = new Checkbox("컬러링북");
Checkbox cb6 = new Checkbox("그림그리기");
p.add(cb1);
p.add(cb2);
p.add(cb3);
p.add(cb4);
p.add(cb5);
p.add(cb6);
// 라디오 버튼 만들기
CheckboxGroup group = new CheckboxGroup();
Checkbox man = new Checkbox("남자", group, true);
Checkbox woman = new Checkbox("여자", group, true);
Choice ch = new Choice();
ch.add("맥북 프로");
ch.add("아이패드 프로");
ch.add("아이폰 x");
ch.add("선풍기");
p.add(ch);
p.add(man);
p.add(woman);
// 5개를 보여주고 여러 개를 선택할 수 있도록 해주는 리스트
List list = new List(5, true);
list.add("박보검"); // 0
list.add("박서준"); // 1
list.add("서강준"); // 2
list.add("강동원"); // 3
list.add("조진웅"); // 4
list.add("유해진"); // 5
list.add("용준형"); // 6
list.add("양요섭"); // 7
list.add("강다니엘"); // 8
list.add("시우민"); // 9
// list의 remove(int idx)를 이용하면 idx번재를 지울 수 있습니다.
// list.remove(0);
// 첫번째에 있는 c&c++과 5번째에 있는 objective-c를 제거 -> 0번과 4번을 제거
// 여러개를 지울 때는 항상 뒤에서부터 삭제해야 합니다.
// bcz.앞에서 지우면 뒤의 인덱스에 영향을 주기 때문입니다.
// 0을 지우면 원래 4번은 3번이 됩니다.
list.remove(4);
list.remove(0);
p.add(list);
add(p);
setVisible(true);
}
}
package guiEx2;
public class Main {
public static void main(String[] args) {
new GuiEx2();
}
}
'JAVA 공책 > 수업 메모' 카테고리의 다른 글
Java, swing, Android의 view의 이벤트 처리형식 (0) | 2018.07.18 |
---|---|
GUI - Java.awt 패키지의 component & 이벤트 처리 (0) | 2018.07.18 |
Scanner (0) | 2018.07.12 |
날짜&시간 (0) | 2018.07.12 |
자료구조 (0) | 2018.07.11 |