본문 바로가기

언어/Java

GUI프로그램

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;
import javax.swing.JTextField;

/**
 * GUI프로그램 순서
 * 1. 이벤트소스(bt)와 이벤트종류(ActionEvent)를 결정한다
 * 2. 이벤트처리용 클래스(이벤트핸들러)를 작성한다
 * class MyHandler implements ActionListener{
 * }
 * 3. 이벤트소스와 이벤트핸들러를 연결한다
 * 	  bt.addActionListener(new MyHandler());	// 버튼에서 이벤트가 발생하면 클릭되었습니다 메시지 발생
 * */

class MyHandler implements ActionListener {	// java는 click 이벤트는 없고 Action 이벤트가 있다.
						// 이벤트가 발생했을 때 적는거 = 핸들러
	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("클릭되었습니다");
	}
}

public class GUITest {
	private JFrame f;
	private JButton bt;
	private JTextField t;

	public GUITest() {
		f = new JFrame("프레임"); //창
		bt = new JButton("클릭"); //버튼
		t = new JTextField("입력하세요"); //한줄입력란
		
		Container c = f.getContentPane(); //프레임뒷판
		c.setLayout(new FlowLayout()); //순서대로 배치하겠다
		c.add(bt); //버튼추가
		c.add(t); //텍스트프레임추가
		
		bt.addActionListener(new MyHandler()); //이벤트소스와 이벤트핸들러 연결.
		f.setSize(300, 200);
		f.setVisible(true);
	}
	
	public static void main(String[] args) {
		new GUITest();
	}
}

클릭 누르면 콘솔에 출력됨

// 한줄 입력란에 클릭되었습니다.
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;
import javax.swing.JTextField;

class MyHandler implements ActionListener {
	private JTextField t;
	MyHandler(JTextField t) {
		this.t = t;
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		t.setText("클릭되었습니다");
	}
}

public class GUITest {
	private JFrame f;
	private JButton bt;
	private JTextField t;	// 위의 (JTextField t) this.t=t 와 같은 t 공유

	public GUITest() {
		f = new JFrame("프레임"); //창
		bt = new JButton("클릭"); //버튼
		t = new JTextField("입력하세요"); //한줄입력란
		
		Container c = f.getContentPane(); //프레임뒷판
		c.setLayout(new FlowLayout()); //순서대로 배치하겠다
		c.add(bt); //버튼추가
		c.add(t); //텍스트프레임추가
	
		bt.addActionListener(new MyHandler(t)); //이벤트소스와 이벤트핸들러 연결

		f.setSize(300, 200);
		f.setVisible(true);
	}
	
	public static void main(String[] args) {
		new GUITest();
	}
}

결과

//Inner class
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;
import javax.swing.JTextField;

public class GUITest {
	private JFrame f;
	private JButton bt;
	private JTextField t;
	
	class MyHandler implements ActionListener {	// 위치는 GUITest 안이면 상관 없음
		@Override
		public void actionPerformed(ActionEvent e) {
			t.setText("클릭되었습니다");
		}
	}

	public GUITest() {
		f = new JFrame("프레임"); //창
		bt = new JButton("클릭"); //버튼
		t = new JTextField("입력하세요"); //한줄입력란
		
		Container c = f.getContentPane(); //프레임뒷판
		c.setLayout(new FlowLayout()); //순서대로 배치하겠다
		c.add(bt); //버튼추가
		c.add(t); //텍스트프레임추가
		
		// bt 3가지 방법으로 작성 가능 결과는 위와 같다
		// ver1
//		bt.addActionListener(new MyHandler());
		
		// ver2
		// ActionListner 인터페이스를 구현한 이름없는 클래스 타입 객체(익명클래스)	
		/* bt.addActionListener(new ActionListener() { 
			@Override
			public void actionPerformed(ActionEvent e) {
			t.setText("클릭되었습니다");
			}
		});*/
		
		// ver5
		bt.addActionListener((e) -> {t.setText("클릭되었습니다");}); 
		
		f.setSize(300, 200);
		f.setVisible(true);
	}
	
	public static void main(String[] args) {
		new GUITest();
	}

}

※ Inner class
class 안에 class 넣기
재사용성은 떨어지나 Outer class의 멤버변수, 메서드를 자기 것처럼 사용가능하다
Outer class를 사용하나 Inner class 로 사용하나 결과는 동일

※  람다식
안드로이드 앱에선 기본
자바스크립트의 화살표 함수"()=>{}"가 유사함

bt.addActionListener();     //() 안에 addActionListener 객체가 와야함
bt.addActionListener((e) -> {t.setText("클릭되었습니다");});

'언어 > Java' 카테고리의 다른 글

복제(shallow copy, deep copy)  (0) 2023.08.02
리플렉션(Reflection)  (0) 2023.08.02
인터페이스 예시  (0) 2023.08.02
인터페이스(Interface)  (0) 2023.08.01
클래스의 용도  (0) 2023.08.01