[Java] Window Programming
- BACKEND/Java
- 2017. 11. 6. 09:32
[java] Window Programming
java로 윈도우 프로그램을 만들 수 있는 기술
AWT (윈도우 3.1 쯤 나온 기술) -> Swing (최근 나온 기술) -> JavaFX (가장 최신 기술)
AWT, Swing : 둘 다 사용 방법이 비슷하다.
JavaFX : AWT, Swing와 연관성은 있지만 사용방법이 꽤 다르다. 안드로이드 환경과 비슷하다.
<윈도우 프로그래밍의 3요소>
1. 재료 (Component)
- 윈도우 프로그래밍을 만들기 위한 재료
2. 디자인 (Layout)
3. 동작 (Event)
4. Component (재료) 더 알아보기
1) AWT(Abstract Window Toolkit)
Abstract : 추상
버튼을 눌렀을 때 실제 기능은 코딩을 해야한다.
처음 버튼 자체는 껍데기일 뿐이다.
그렇기 때문에 Abstract 라고 말한다.
java.desktop
java.awt.Component
클래스를 살펴보자.
Component의 자식 클래스들을 만나보자
Button : 버튼
Canvas : 그림판 같이 그릴 수 있음
Checkbox : 체크박스
Choice : 항목이 숨겨져 있다가 버튼 누르면 리스트가 툭 튀어나옴
Container : 다른 컨포넌트를 담기위한 그릇이다. 모든재료는 Container에 담아야 사용가능하다.
Container의 중요한 자식 클래스
└ panel
└ applet : 가장 대표적인 Container. 전체 프로그램의 뼈대 담당.
└ window
└ dialog
└ frame : 가장 대표적인 Container. 전체 프로그램의 뼈대 담당.
Label : 글자만 출력 할 수 있는 재료
List : 처음부터 리스트가 있음
Scrollbar : 밑에나 아래 스크롤바를 달 수 있도록 함
TextComponent : 글자를 입력 할 수 있는 도구
TextComponent 의 중요한 자식 클래스
└ TextField : 딱 한줄 입력할 수 있는 텍스트 박스
└ TextArea : 여러 줄 입력할 수 있는 텍스트 박스
AWT는 간단하지만, 스윙으로 가면 재료가 많아진다.
<Container 의 핵심 클래스 2가지>
applet
- 가장 대표적인 Container. 전체 프로그램의 뼈대 담당.
- 웹브라우저에서 사용 가능한 프로그램을 만든다.
- 이제는 보안과 웹기술의 발전으로 거의 쓰지 않는다.
frame
- 일반데스크 탑에서 실행되는 응요 프로그램
- 가장 대표적인 Container. 전체 프로그램의 뼈대 담당.
package component;
import java.awt.Frame;
import java.awt.Label;
public class LabelTest {
public static void main(String[] args) {
//Label클래스의 인스턴스를 생성한다.
Label lab1 = new Label("첫번째 라벨"); //레이블 클래스는 바로 초기화가 가능하다.
Label lab2 = new Label("두번째 라벨");
Label lab3 = new Label("세번째 라벨");
//Label을 그릇에 담아야 사용이 가능하다.
//Frame클래스의 인스턴스를 생성한다.
Frame f = new Frame();
//재료들을 컨테이너에 담아준다.
f.add(lab1);
f.add(lab2);
f.add(lab3);
//화면 사이즈를 픽셀단위로 설정해준다.
f.setSize(300, 400);
//화면에 보여지게끔 설정을 해준다.
f.setVisible(true);
//프래임에 특성상 같은 위치에 겹쳐서 세번째만 보인다.
//종료는 콘솔의 빨간 버튼을 눌러 종료한다.
}
}
※ 결과값
프래임에 특성상 같은 위치에 겹쳐서 세번째만 보인다.
종료는 콘솔의 빨간 버튼을 눌러 종료한다.
프로그램에서 말하는 디자인은 공간 배치이다.
같은 코드를 Frame클래스를 상속받아 메인을 단순하게 만들어보자.
package component;
import java.awt.Frame;
import java.awt.Label;
public class LabelTest_1 extends Frame{
//인스턴스 변수를 미리 만들어준다.
private Label lab1, lab2, lab3;
LabelTest_1(){
//Label클래스의 인스턴스를 생성한다.
lab1 = new Label("첫번째 라벨"); //레이블 클래스는 클래스 특성상 바로 초기화가 가능하다.
lab2 = new Label("두번째 라벨");
lab3 = new Label("세번째 라벨");
//Label을 그릇에 담아야 사용이 가능하다.
//재료들을 컨테이너에 담아준다.
add(lab1);
add(lab2);
add(lab3);
//화면 사이즈를 픽셀단위로 설정해준다.
setSize(300, 400);
//화면에 보여지게끔 설정을 해준다.
setVisible(true);
}
public static void main(String[] args) {
//Frame클래스를 상속받아 LabelTest의 인스턴스를 생성한다. (?)
LabelTest_1 f = new LabelTest_1();
}
}
※ 결과값
<코드리펙토링>
- 코드리뷰
- 코드 전반적인 부분을 살펴보고 합리적이고 깔끔하게 고쳐나가는 작업
아래 예제를 실행해보자.
package component;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
public class LabelTest_1 extends Frame{
//인스턴스 변수를 미리 만들어준다.
private Label lab1, lab2, lab3;
LabelTest_1(){
setLayout(new FlowLayout());
//Label클래스의 인스턴스를 생성한다.
lab1 = new Label("첫번째 라벨"); //레이블 클래스는 클래스 특성상 바로 초기화가 가능하다.
lab2 = new Label("두번째 라벨");
lab3 = new Label("세번째 라벨");
//Label을 그릇에 담아야 사용이 가능하다.
//재료들을 컨테이너에 담아준다.
add(lab1);
add(lab2);
add(lab3);
//각각의 라벨의 배경색깔을 바꾼다.
lab1.setBackground(Color.BLUE);
lab2.setBackground(Color.RED);
lab3.setBackground(Color.YELLOW);
//setSize(300, 400); //화면 사이즈를 픽셀단위로 설정해준다.
//300, 400은 가로세로 모니터에서 위치, 800, 600은 가로 세로 픽셀 크기
//화면크기와 실행 위치까지 정할 수 있다.
setBounds(300,400,800, 600);
//화면에 보여지게끔 설정을 해준다.(출력)
setVisible(true);
}
public static void main(String[] args) {
//Frame클래스를 상속받아 LabelTest의 인스턴스를 생성한다.
LabelTest_1 f = new LabelTest_1();
}
}
※ 결과값
package component;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
public class ButtonTest extends Frame{
//인스턴스 변수를 미리 만들어준다.
private Button b1, b2, b3;
ButtonTest(){
setLayout(new FlowLayout());
//Label클래스의 인스턴스를 생성한다.
b1 = new Button("첫번째 라벨"); //레이블 클래스는 클래스 특성상 바로 초기화가 가능하다.
b2 = new Button("두번째 라벨");
b3 = new Button("세번째 라벨");
//Label을 그릇에 담아야 사용이 가능하다.
//재료들을 컨테이너에 담아준다.
add(b1);
add(b2);
add(b3);
//각각의 라벨의 배경색깔을 바꾼다.
b1.setBackground(Color.BLUE);
b2.setBackground(Color.RED);
b3.setBackground(Color.YELLOW);
//setSize(300, 400); //화면 사이즈를 픽셀단위로 설정해준다.
//300, 400은 가로세로 모니터에서 위치, 800, 600은 가로 세로 픽셀 크기
//화면크기와 실행 위치까지 정할 수 있다.
setBounds(300,400,800, 600);
//화면에 보여지게끔 설정을 해준다.(출력)
setVisible(true);
}
public static void main(String[] args) {
//Frame클래스를 상속받아 LabelTest의 인스턴스를 생성한다.
ButtonTest f = new ButtonTest();
}
}
※ 결과값
체크박스 : 다중선택
라디오 버튼 : 단일선택
체크박스를 라디오 버튼으로 만드는 방법은 그룹으로 묶는 것이다.
package component;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.FlowLayout;
import java.awt.Frame;
public class CheckboxTest extends Frame{
Checkbox c1, c2, c3;
Checkbox r1, r2;
CheckboxGroup g1;
CheckboxTest(){
setLayout(new FlowLayout()); // 위치를 잡는 레이아웃으로 추측
//체크박스를 만든다. 체크박스는 다중선택이 가능하다.
c1 = new Checkbox("첫번째 체크박스", true); // 체크박스에 미리 체크가 되도록 true값을 줌
c2 = new Checkbox("두번째 체크박스");
c3 = new Checkbox("세번째 체크박스");
g1 = new CheckboxGroup(); // 라디오 버튼을 만들기 위해 체크박스 그룹을 만든다.
// 라디오 버튼을 만든다. 라디오 버튼은 하나만 선택해야한다.
r1 = new Checkbox("첫번째 라디오", true, g1); //라디오 이름, 체크박스 선택유무, 그룹이름을 써준다.
r2 = new Checkbox("두번째 라디오", false, g1);
add(c1);
add(c2);
add(c3);
add(r1);
add(r2);
setSize(300, 400);
setVisible(true);
}
public static void main(String[] args) {
new CheckboxTest();//클래스를 호출하는 인스턴스 생성, 자기 자신이기 때문에 클래스 이름 생략
}
}
Choice 메서드
package component;
import java.awt.Choice;
import java.awt.Frame;
public class ChoiceTest extends Frame{
private Choice c;
ChoiceTest(){
c = new Choice();
c.add("홍길동");
c.add("임꺽정");
c.add("김유신");
c.add("강감찬");
add(c);
setSize(300, 400);
setVisible(true);
}
public static void main(String[] args) {
new ChoiceTest();
}
}
Choice
- 하나를 선택한다.
- 단일 선택만 가능
list
- 펼쳐서 보여준다. 기본적으로 1개만 선택
- 다중성택도 가능
package component;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.List;
public class ListTest extends Frame{
private List list1, list2;
ListTest(){
setLayout(new FlowLayout());
list1 = new List(5, true); //()인자는 출력될 아이템을 지정한다. 기본리스트는 4개이다.
list2 = new List(3);
list1.add("사과");
list1.add("배");
list1.add("포도");
list1.add("귤");
list1.add("레몬");
list2.add("짜장면");
list2.add("울면");
list2.add("라면");
list2.add("볶음면");
list2.add("짬짜면");
add(list1);
add(list2);
setSize(300, 400);
setVisible(true);
}
public static void main(String[] args) {
new ListTest();
}
}
//윈도우를 이용해서 야구게임을 만들어보자.
TextField, TextArea 사용
package component;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
public class TextTest extends Frame{
private TextField tf;
private TextArea ta;
TextTest(){
setLayout(new FlowLayout());
tf = new TextField(30); //한 줄입력, 크기를 늘리고 싶다면 인자의 값을 쓴다.
ta = new TextArea(5, 30); //여러 줄 입력, 행과 열의 크기를 입력할 수 있다.
add(tf);
add(ta);
setSize(600, 400);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new TextTest();
}
}
package component;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
public class TextTest extends Frame{
private TextField tf;
private TextArea ta;
TextTest(){
setLayout(new FlowLayout());
tf = new TextField("여기는 textfied",30); //한 줄입력, 크기를 늘리고 싶다면 인자의 값을 쓴다.
ta = new TextArea("여기는 TextArea", 5, 30); //여러 줄 입력, 행과 열의 크기를 입력할 수 있다.
add(tf);
add(ta);
setSize(600, 400);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new TextTest();
}
}
Container
panel
- 가장 대표적인 Container. 전체 프로그램의 뼈대 담당.
- 윈도우 안에서 부분적인 영역을 처리할 때 사용한다.
- 내가 필요한 부분 디자인을 따로 만들어 사용하고자 했을 때
접착제처럼 붙여 사용할 수 있도록 한다.
- 컨포넌트를 담을 수 있는 컨테이너가 패널이다.
package container;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
public class PanelTest extends Frame {
private Panel p1, p2;
private Button b1, b2, b3, b4;
PanelTest(){
setLayout(new FlowLayout());
p1 = new Panel();
p2 = new Panel();
b1 = new Button("패널 2 보이기");
b2 = new Button("패널 2 안보이기");
b3 = new Button("패널 1 보이기");
b4 = new Button("패널 1 안보이기");
p1.add(b1);
p1.add(b2);
p2.add(b3);
p2.add(b4);
add(p1);
add(p2);
setSize(300, 400);
setVisible(true);
}
public static void main(String[] args) {
new PanelTest();
}
}
package container;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
public class PanelTest extends Frame {
private Panel p1, p2;
private Button b1, b2, b3, b4;
PanelTest(){
setLayout(new FlowLayout());
//Label클래스의 인스턴스를 생성한다.
p1 = new Panel();
p2 = new Panel();
b1 = new Button("패널 2 보이기");
b2 = new Button("패널 2 안보이기");
b3 = new Button("패널 1 보이기");
b4 = new Button("패널 1 안보이기");
//재료들을 컨테이너에 담아준다.
p1.add(b1);
p1.add(b2);
p2.add(b3);
p2.add(b4);
add(p1);
add(p2);
//각각의 라벨의 배경색깔을 바꾼다.
p1.setBackground(Color.BLUE);
p2.setBackground(Color.MAGENTA);
//화면크기와 실행 위치까지 정할 수 있다.
setSize(300, 400);
//화면에 보여지게끔 설정을 해준다.(출력)
setVisible(true);
}
public static void main(String[] args) {
new PanelTest();//클래스를 호출하는 인스턴스 생성, 자기 자신이기 때문에 클래스 이름 생략
}
}
이벤트를 넣어보기
이벤트는 마우스로 클릭하거나 하는 등의 컴퓨터 상에서 벌어지는 모든 사건을 말한다.
package container;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class PanelTest extends Frame implements ActionListener{
private Panel p1, p2;
private Button b1, b2, b3, b4;
PanelTest(){
setLayout(new FlowLayout());
//Label클래스의 인스턴스를 생성한다.
p1 = new Panel();
p2 = new Panel();
b1 = new Button("패널 2 보이기");
b2 = new Button("패널 2 안보이기");
b3 = new Button("패널 1 보이기");
b4 = new Button("패널 1 안보이기");
//재료들을 컨테이너에 담아준다.
p1.add(b1);
p1.add(b2);
p2.add(b3);
p2.add(b4);
add(p1);
add(p2);
//각각의 라벨의 배경색깔을 바꾼다.
p1.setBackground(Color.BLUE);
p2.setBackground(Color.MAGENTA);
//버튼이 눌리면 ActionListener 메서드가 호출되도록 한다.
b1.addActionListener(this);
//화면크기와 실행 위치까지 정할 수 있다.
setSize(300, 400);
//화면에 보여지게끔 설정을 해준다.(출력)
setVisible(true);
}
//ActionListener 상속받아 메서드를 오버라이드 한다. 버튼을 누르면 메서드가 호출돤다.
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("버튼이 눌렸어요~~~");
}
public static void main(String[] args) {
new PanelTest();//클래스를 호출하는 인스턴스 생성, 자기 자신이기 때문에 클래스 이름 생략
}
}
※ 결과값
이처럼 첫번째 버튼을 누르면 "버튼을 눌렀어요가 이클립스에 찍힌다.
package container;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class PanelTest extends Frame implements ActionListener{
private Panel p1, p2;
private Button b1, b2, b3, b4;
PanelTest(){
setLayout(new FlowLayout());
//Label클래스의 인스턴스를 생성한다.
p1 = new Panel();
p2 = new Panel();
b1 = new Button("패널 2 보이기");
b2 = new Button("패널 2 안보이기");
b3 = new Button("패널 1 보이기");
b4 = new Button("패널 1 안보이기");
//재료들을 컨테이너에 담아준다.
p1.add(b1);
p1.add(b2);
p2.add(b3);
p2.add(b4);
add(p1);
add(p2);
//각각의 라벨의 배경색깔을 바꾼다.
p1.setBackground(Color.BLUE);
p2.setBackground(Color.MAGENTA);
//버튼이 눌리면 ActionListener 메서드가 호출되도록 한다.
b1.addActionListener(this); // ActionEvent 메서드와 같은 클래스에 있기 때문에 this
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
//화면크기와 실행 위치까지 정할 수 있다.
setSize(300, 400);
//화면에 보여지게끔 설정을 해준다.(출력)
setVisible(true);
}
//ActionListener 상속받아 메서드를 오버라이드 한다. 버튼을 누르면 메서드가 호출돤다.
@Override
public void actionPerformed(ActionEvent arg0) {
/*
System.out.println(arg0);
System.out.println(arg0.getActionCommand()); //버튼이 가지고 있는 레이블 값만 뽑아온다.
System.out.println("버튼이 눌렸어요~~~");
*/
String cmd = arg0.getActionCommand(); //버튼이 가지고 있는 레이블 값만 뽑아온다.
if(cmd.equals("패널 2 보이기")) {
p2.setVisible(true);
}else if(cmd.equals("패널 2 안보이기")) {
p2.setVisible(false);
}else if(cmd.equals("패널 1 보이기")) {
p1.setVisible(true);
}else {
p1.setVisible(false);
}
}
public static void main(String[] args) {
new PanelTest();//클래스를 호출하는 인스턴스 생성, 자기 자신이기 때문에 클래스 이름 생략
}
}
※ 결과값
Frame
dispose()는 윈도우를 종료하는 윈도우 클래스의 메서드이다.
package container;
import java.awt.Button;
import java.awt.Frame;
public class FrameTest extends Frame{
private Button b;
FrameTest(){
b = new Button("버튼");
add(b);
setSize(300, 400);
setVisible(true);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
dispose(); // 윈도우를 종료시키는 메서드이다.
}
public static void main(String[] args) {
new FrameTest();
}
}
※ 결과값
버튼을 켜면 3초 후에 꺼진다.
package container;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.MarshalledObject;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.activation.ActivationDesc;
import java.rmi.activation.ActivationException;
import java.rmi.activation.ActivationID;
import java.rmi.activation.ActivationInstantiator;
public class FrameTest extends Frame implements ActionListener{
private Button b;
FrameTest(){
b = new Button("버튼");
add(b);
b.addActionListener(this);
setSize(300, 400);
setVisible(true);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
dispose(); // 윈도우를 종료시키는 메서드이다.
}
@Override
public void actionPerformed(ActionEvent e) {
dispose(); // 윈도우를 종료시키는 메서드이다.
}
public static void main(String[] args) {
new FrameTest();
}
}
※ 결과값
버튼의 x버튼을 누르면 없어진다.
2) Dialog
Window : 아무것도 없다.
- Dialog : 별도의 재료들로 만들어 줄 수 있다.
패널은 한번 붙이면 위치가 고정되지만,
Dialog는 창이 움직인다.
프로그램과 사용자 사이에서 소통창구가 되게 한다.
별도의 창이 사용되는 것은 Dialog가 대부분 이다.
서브윈도우로 사용된다.
자식클래스는 filrDialog가 있다.
(1) Custom(User Define) Dialog
다이얼로그는 서브 윈도우다.
다이얼로그를 내 마음대로 만들 수 있다.
다이얼로그를 그냥 상속받으면 커스텀 다이얼로그가 된다.
다이얼로그는 누가 나를 호출했는지가 가장 중요하다.
Dialog에서 가장 많이 사용하는 생성자
Dialog(Frame owner, String title, boolean modal)
생성자를 가장 많이 이용한다.
Frame owner
- 이 다이얼로그를 생성한 객체의 주소
String title
- 다이얼로그의 주소
- 새 창 다이얼로그의 타이틀
- 예) 메모장 - 다른이름으로 저장
boolean modal
- 다이얼로그의 실행방식이다.
- true false 중에 하나를 쓰면 된다.
- true 이면 madal방식이고 false는 modaless방식이다.
<modaless 과 modal>
modal
- 현재 윈도우를 종료하기 전 까지 다른 작업을 할 수 없게 하는 것이 modal방식이다. (modal 이 대부분이다.)
modaless
- modal의 반대. 현재 실행 중인 윈도우를 종료하지 않아도 다른 작업을 병행할 수 있는 상태.
훨씬 어렵고 신경써야 할 것이 많다.
(2) Common(System) Dialog
이미 만들어져있는 다이얼로그이다.
메모장의 파일열기 같이 운영체제가
미리 만들어 놓은 다이얼로그를 가져다가 쓰는 것이다.
FileDialog가 이에 해당한다.
package container;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class MessageDialog extends Dialog implements ActionListener{
private String message;
//Dialog 자식클래스 생성자를 만들었다.
public MessageDialog(Frame arg0, String msg) { //생성자의 인자값을 넣어 준다.
super(arg0, "메시지 대화상자", true); // Dialog를 만들 때에는 반드시 부모 생성자를 호출해주어야 한다.
setLayout(new FlowLayout()); //자동정렬됨
message = msg; //생성자의 인자값을 불러온다.
Label lab = new Label(message);
add(lab);
Button b = new Button("종료");
add(b);
setBackground(Color.GRAY);
b.addActionListener(this);
setSize(200, 300);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
dispose();
}
}
public class CustomDialogTest extends Frame implements ActionListener{
private Panel p;
private Button b1, b2;
public CustomDialogTest() {
p = new Panel();
b1 = new Button("다이얼로그 열기");
b2 = new Button("종료");
p.add(b1);
p.add(b2);
add(p);
b1.addActionListener(this);
setSize(300, 400);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
new MessageDialog(this, "이것은 메인에서 전달하는 메시지"); //현재 실행된 자기 자신의 주소를 넣어준다.
}
public static void main(String[] args) {
new CustomDialogTest();
}
}
본래 생성자의 목적에 맞게 디팩토링 하고 기능을 추가해보자.
package container;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class MessageDialog extends Dialog implements ActionListener{
private String messge;//생성자의 인자값을 불러온다.
private Label lab;
private Button b;
//Dialog 자식클래스 생성자를 만들었다.
public MessageDialog(Frame arg0, String msg) { //생성자의 인자값을 넣어 준다.
super(arg0, "메시지 대화상자", true); // Dialog를 만들 때에는 반드시 부모 생성자를 호출해주어야 한다.
lab = new Label(msg);
b = new Button("종료");
}
void display() {
setLayout(new FlowLayout()); //자동정렬됨
add(lab);
add(b);
setBackground(Color.GRAY);
b.addActionListener(this);
setSize(200, 300);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
dispose();
}
}
public class CustomDialogTest extends Frame implements ActionListener{
private Panel p;
private Button b1, b2;
public CustomDialogTest() {
p = new Panel();
b1 = new Button("다이얼로그 열기");
b2 = new Button("종료");
p.add(b1); //패널에 버튼 추가
p.add(b2);
add(p); //패널호출
b1.addActionListener(this);
setSize(300, 400);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
MessageDialog md = new MessageDialog(this, "이것은 메인에서 전달하는 메시지"); //현재 실행된 자기 자신의 주소를 넣어준다.
md.display();
}
public static void main(String[] args) {
new CustomDialogTest();
}
}
package container;
import java.awt.Button;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CommonDialogTest extends Frame implements ActionListener{
FileDialog fopen, fsave;
Panel p;
Button btnOpen, btnSave;
public CommonDialogTest() {
p = new Panel(); //패널의 인스턴스 생성
btnOpen = new Button("파일 열기");
btnSave = new Button("파일 저장");
//첫번째는 주소값, 두번째는 title, 세번째는 파일열기 or 저장하기로 할건지 지정 옵션
fopen = new FileDialog(this, "파일 열기", FileDialog.LOAD);
//첫번째는 주소값, 두번째는 title, 세번째는 파일열기 or 저장하기로 할건지 지정 옵션
fsave = new FileDialog(this, "파일 저장", FileDialog.SAVE);
p.add(btnOpen);
p.add(btnSave);
add(p);
btnOpen.addActionListener(this);
btnSave.addActionListener(this);
}
@Override //버튼을 눌렀을 때 행동하도록 상속받아 연결
public void actionPerformed(ActionEvent arg0) {
if(arg0.getActionCommand().equals("파일 열기")) {
fopen.setVisible(true); //fopen을 불러와 보여준다.
System.out.println(fopen.getDirectory()); //현재 선택한 파일의 경로를 보여준다.
System.out.println(fopen.getFile()); //현재 선택한 파일의 주소를 보여준다.
}else {
fsave.setVisible(true); //fsave을 불러와 보여준다.
}
}
public static void main(String[] args) {
CommonDialogTest test = new CommonDialogTest();
test.setSize(300, 400);
test.setVisible(true);
}
}
'BACKEND > Java' 카테고리의 다른 글
[Java] Window Programing - <Event> (0) | 2017.11.06 |
---|---|
[Java] Window Programming - <Layout> (0) | 2017.11.06 |
[Java] IO 예제 (0) | 2017.11.02 |
[Java] Thread 예제 (0) | 2017.11.02 |
[Java] Thread (0) | 2017.11.01 |