GUI

자바에서 사용하는 GUI패키지에는 AWT, Swing 두가지가 있다. 

결과값을 하나의 창으로 띄워 화면을 디자인하고, 키보드와 마우스 등과 같은 입력도구를 사용할 수 있는

GUI를 구성할 수 있도록 도와준다.  

AWT는 java.awt 패키지를 통해, Swing은 javax.swing 패키지를 통해 제공받을 수 있다.

AWT는 초기 버전에 많이 사용되던 GUI로 운영체제에 의존적이라 리소스를 많이 소모하고,

os에 따라 구현이 달라질 수 있다는 단점을 가지고 있다. 

Swing은 AWT기반으로 작성되었지만 운영체제에 독립적으로 운영되고 그래픽이 더 화려해서 

AWT보다 Swing 사용을 권장한다. 또한 AWT와 구별하기 위하여 컴포넌트 앞에 J를 붙인다. 

 

 

Component

자바AWT에서 제공하는 버튼, 체크박스 등의 윈도우 환경을 이루는 부분들을 컴포넌트라고 한다. 

ex) JLabel, JTextField, JTextArea ,,, 

Container

창(윈도우)의 역할을 한다. 컴포넌트를 담는 그릇 역할을 컨테이너라고 한다.

컨테이너가 될 수 있는 컴포넌트는 프레임(JFrame), 애플릿(JApplet), 패널(JPanel)이다.

여기서 JPanel은 중간 컨테이너로, 컴포넌트들을 JPanel에 추가하고 이 JPanel을 JFrame이나 JApplet에

추가하는 방식으로 만들어 진다. 

ex)  JFrame, JPanel, JApplet, JDialog, JWindow

 


GUI 프로그램 만들기

 

JFrame 클래스를 상속받아 창 생성(권장),

*스윙에서는 ContentPane을 불러와 컴포넌트를 부착해야 한다.

JFrame myframe = new JFrame();
Container contentPane = myframe.getContentPane();
//JFrame의 contentPane불러오기
//JFrame 생성시 자동으로 contentPane 생성됨
JButton b1 = new JButton("check");
contentPane.add(b1);
//버튼을 부착

 

 

 


 컴포넌트를 생성시키는 순서는 배치하는 순서의 정반대이다

 컴포넌트를 생성시키는 순서 화면에 보이게 배치(부착)하는 순서
JFrame->JPanel->JButton,  JButton,JTextField,,,->JPanel->JFrame

 

화면에 배치시키는 방법(배치관리자 종류) 

컴포넌트를 왼,오,위,아래,가운데(5군데)에 부착시키는 방법으로, 부착시키는 위치를 지정하지 않으면

무조건 맨 마지막 컴포넌트만 화면전체에 배치된다. 

 

1.BorderLayout

JFrame의 기본 레이아웃


2.FlowLayout

컴포넌트를 왼쪽으로 기준으로 오른쪽으로 배치, 자동으로 다음줄에 개행된다.

3.GridLayout 방법

바둑판식 방식으로 컴포넌트를 배치시키는 방법


AWT, Swing 이벤트 처리 방식

이벤트

키보드, 마우스 작업 등 운영체제가 인식가능한 사용자들의 모든 행동양식
                      

이벤트 용어

1. event source 

이벤트를 발생시킨 대상 컴포넌트 

예) 이벤트: 버튼 클릭-> 이벤트 소스: 버튼, 이벤트: 메뉴 클릭-> 이벤트 소스: 메뉴

 

2. 발생시킨 이벤트 종류

ActionEvent(버튼 클릭, 메뉴항목 클릭, 글자입력하고 엔터친 경우 ,,,)

MouseEvent(마우스 클릭,드래그 ,,,)

WindowEvent(창 크기 조절, 종료)

KeyEvent(자판키의 특정키를 눌렀을때)

 

3. 이벤트 핸들러

발생시킨 이벤트종류에 따라 내부적으로 호출해주는 메소드.

이벤트 종류명 뒤에 Listener 혹은 Adapter를 붙이면 된다.

특정 이벤트가 발생되면 내부적으로 자동으로 인식이 되어서 호출하는 메소드를 연결시켜주는 중간매개체이다.

1) Listener(인터페이스)

불필요한 추상메소드까지 구현해야한다. 소스코드가 늘어날 수 있다

2) Adapter(추상클래스)- 상속받아 사용

원하는 메소드만 오버라이딩 할 수 있다. 소스코드를 줄일 수 있다.

적용시키는 클래스 수가 너무 적다.

 

이벤트 처리 순서 

ex) 버튼클릭-> ActionEvent -> ActionListener  혹은  ActionAdapter                                                           

                                                              (인터페이스)                  (추상 클래스)

ex2) 창 종료-> WindowEvent -> WindowListener 혹은 WindowAdapter

 


콜백메소드

운영체제에서 자동으로 메소드를 호출

(객체명.일반메소드로 호출할 수 없음, 연결만 가능) 

 

이벤트 처리 프로그래밍 

1. 이벤트 처리를 해줄 이벤트 소스와 이벤트를 결정한다.

2. 이벤트 핸들러의 기능을 프로그래밍 한다.

3. 이벤트 소스와 이벤트 핸들러를 연결해준다.

ex) 이벤트 발생 대상자.addXXXListener(처리해줄 객체명)

 

 

이벤트를 발생시키는 클래스, 이벤트를 처리해주는 클래스 => WindowTest

-> this.addWindowListener(this);

import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.*;

public class WindowTest extends JFrame implements WindowListener{
//WindowListener=> 윈도우이벤트 발생-> 이벤트에 맞는 내부적인 콜백메소드를 자동으로 호출
	WindowTest(){
		super("창 이벤트 연습");//JFrame(String title)
		//setTitle("창 이벤트 연습")
		
		setBounds(900, 300, 400, 300);
		//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.addWindowListener(this);
		setVisible(true);
	}
	
	/*인터페이스의 모든 메소드를 반드시 오버라이딩 해야한다*/
	//창을 선택했을때 
	@Override
	public void windowActivated(WindowEvent e) {
		// TODO Auto-generated method stub
		//창이 활성화될때 호출
		System.out.println("windowActivated");
	}
	@Override
	public void windowClosed(WindowEvent e) {
		// TODO Auto-generated method stub
		//윈도우가 닫힌 후에 발생되므로 눈에 보이지 않음
	}
	@Override
	public void windowClosing(WindowEvent e) {
		// TODO Auto-generated method stub
		//윈도우의 x버튼을 눌렀을때 호출
		System.out.println("windowClosing!");
		System.exit(0);//프로그램 종료=> 메모리 해제
	}
	@Override
	public void windowDeactivated(WindowEvent e) {
		// TODO Auto-generated method stub
		//창이 비활성화 되었을때 호출(여러개의 창이 켜져있을때 창이 뒤로갔을때를 의미)
		System.out.println("windowDeactivated");
	}
	@Override
	public void windowDeiconified(WindowEvent e) {
		// TODO Auto-generated method stub
		//작업표시줄에 등록된창이 화면에 출력될때 호출 
		System.out.println("windowDeiconified");
	}
	@Override
	public void windowIconified(WindowEvent e) {
		// TODO Auto-generated method stub
		//작업표시줄에 창이 들어갈때 호출
		System.out.println("windowIconified");
	}
	@Override
	public void windowOpened(WindowEvent e) {
		// TODO Auto-generated method stub
		//창이 열렸을때 호출된다
		System.out.println("windowOpened");
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//WindowTest wt = new WindowTest();
		new WindowTest();
	}
}

 

이벤트를 발생시키는 클래스-> windowtest2, 이벤트를 처리해주는 클래스 => Other

-> this.addWindowListener(new Other());

public class WindowTest2 extends JFrame{

	WindowTest2(){
		super("창 이벤트 연습2");
		setBounds(900, 300, 400, 300);

		this.addWindowListener(new Other());//익명객체
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new WindowTest2();
	}
	
	//이벤트를 처리해주는 클래스 따로 작성
	class Other implements WindowListener{
		//위의 예제와 같음
		@Override
		public void windowActivated(WindowEvent e) {
			// TODO Auto-generated method stub
			//창이 활성화될때 호출
			System.out.println("windowActivated");
		}
        
        ,,,

		@Override
		public void windowOpened(WindowEvent e) {
			// TODO Auto-generated method stub
			//창이 열렸을때 호출
			System.out.println("windowOpened");
		}
	}
}

 


내부 클래스(=Inner Class)

클래스 내부에 또 다른 클래스가 있는 상태

source> bin 파일에 이너클래스는 $로 표현된다

 

만드는 이유

1. 접근지정자의 영향을 덜 받기 위함

하나의 패키지 안의 클래스에 접근할 수 있을 수도 있고 없을수도 있음(접근지정자때문) 

이런 영향을 덜 받기 위함 

2. 이벤트 처리 때문에 

효율성을 위해 추상클래스를 사용하고자 하는데 이때 다중상속이 안된다는 단점이 있다

이런 단점으로 인해 이너클래스를 사용하여 추상클래스를 상속하는 클래스를 클래스 안에 넣는다

 

 

이벤트를 발생시키는 클래스-> windowtest3, 이벤트를 처리해주는 클래스 => Other2

WindowAdapter 추상클래스 상속

public class WindowTest3 extends JFrame{

	WindowTest3(){
		super("창 이벤트 연습3");
		setBounds(900, 300, 400, 300);
        
        /*this.addWindowListener(new Other2());*/

		this.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e){
				// TODO Auto-generated method stub
				System.out.println("windowClosing!");
				System.exit(0);
			}
		});
		setVisible(true);
	}
	/*이너클래스
	class Other2 extends WindowAdapter{//추상클래스 상속
		@Override
		public void windowClosing(WindowEvent e) {
			// TODO Auto-generated method stub
			System.out.println("windowClosing!");
			System.exit(0);
		}
	}*/
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new WindowTest3();
	}
}

 


ActionListener + WindowAdapter 

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ButtonTest extends JFrame implements ActionListener{
	
	JButton b1,b2,b3,b4;
	JTextField tf1;//사용자로부터 값을 입력받음
	
	public ButtonTest() {
		super("버튼의 이벤트처리");
		setBounds(900, 300, 400, 300);
		
		this.setLayout(new GridLayout(5,1,3,3));//5행1열,hgap,vgap
		
		//버튼 객체 생성
		b1=new JButton("시작");//버튼이름
		b2=new JButton("고");
		b3=new JButton("백");
		b4=new JButton("점프");
		tf1=new JTextField(" ");//빈 입력상자
		
		//JButton, JTextField 모두 하나하나의 객체이므로 하나씩 붙이고,연결해줘야함
		
		//버튼을 컨테이너에 부착//this.getContentPane().add();
		this.add(b1); add(b2); add(b3); add(b4); add(tf1);
		
		//b1에 대해 이벤트 처리할 대상자 
		b1.addActionListener(this);
		b2.addActionListener(this);
		b3.addActionListener(this);
		b4.addActionListener(this);
		tf1.addActionListener(this);
		
		//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);과 기능은 똑같음
		this.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);			}
		});
		setVisible(true);
	}
	
	//추상메소드=> 버튼클릭시 처리해주는 메소드
	/*
	 * 1.이벤트 발생시킨 컴포넌트 이름을 알 수 있다(시작, 고,,) -> e.getActionCommand()
	 * 2.이벤트를 발생시킨 컴포넌트 종류를 알 수 있다(버튼인지 텍스트필드인지 ,,)->e.getSource()
	 * */
	//액션에 관련된 정보는 모두 ActionEvent 객체가 받는다.
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		System.out.println(e.getActionCommand());
		String s = e.getActionCommand();
		if(s.contentEquals("시작")) {//시작버튼 눌렀다면
			b1.setBackground(Color.red);
			setTitle(s);//창의 제목에 버튼이름 찍힘
		}else if(s.contentEquals("고")) {
			b2.setBackground(Color.yellow);
			setTitle(s);
		}else if(s.contentEquals("백")) {
			b3.setBackground(Color.blue);
			setTitle(s);
		}else if(s.contentEquals("점프")) {
			b4.setBackground(Color.orange);
			setTitle(s);
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new ButtonTest();
	}
}

 

결과값

+ Recent posts