학원일기

22일

걷는 청년 2024. 7. 24. 11:53

자바 event

자바에서 프레임을 이용해 레이아웃을 만들어서 버튼을 생성하고 버튼을 눌렀을 때 어떤 버튼이 눌렸는지 e.getSource() 메소드를 이용해 값을 비교해서 눌린 버튼에 따라 타이틀에 써진 것을 변경하는 실습을 해보았다.

 

package pack7gui;

import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Ex44Event extends Frame implements ActionListener{
	private Button btn1 = new Button("Button1");
	private Button btn2 = new Button("Button2");
	private Button btn3 = new Button("Button3");
	private Button btn4 = new Button("Button4");
	private Button btn5 = new Button("Button5");
	
	public Ex44Event() {
		super("이벤트 연습");
		
		addLayout();
		
		setBounds(200, 200, 400, 400);
		setVisible(true);
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}
	
	private void addLayout() {
		add("East", btn1);	// Frame은 BorderLayout이 기본
		add("West", btn2);
		add("Center", btn3);
		add("North", btn4);
		add("South", btn5);
		
		btn1.addActionListener(this);	// 방법1 : 현재 클래스에 implements ActionListener를 사용
		btn2.addActionListener(this);
		
		btn3.addActionListener(new EventTest());	// 방법2 : 내부 클래스 사용
		
		btn4.addMouseListener(new EventTest2());	// 방법3 : 내부 클래스 사용
		
		btn5.addMouseListener(new MouseAdapter() {	// 방법4 : 내부 무명 클래스 사용
			@Override
			public void mouseClicked(MouseEvent e) {
				// btn5 클릭하면 수행되는 메소드
				setTitle("버튼5번이다");
			}
		});
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// btn1, btn2를 클릭하면 수행되는 메소드
		
		//System.out.println(e.getActionCommand());
		//System.out.println(e.getSource());
		if(e.getSource() == btn1) {	// 객체 비교 : == (문자열 비교는 equals)
			setTitle("버튼 1 클릭");
		}else if(e.getSource() == btn2){
			setTitle("버튼 2 click");
		}
	}
	
	class EventTest implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
			// btn3을 클릭하면 수행되는 메소드
			setTitle("버튼 3을 누름");
		}
		
	}
	
	class EventTest2 extends MouseAdapter{
		@Override
		public void mouseClicked(MouseEvent e) {
			setTitle("버튼 마우스 이벤트로 btn4 처리");
		}
	}
	
	public static void main(String[] args) {
		// 이벤트 처리 정리
		new Ex44Event();

	}

}

 

기본이 BorderLayout이다.

 

 

Swing

AWT 기술을 기반으로 순수 자바 언어로 만들어진 라이브러리인 Swing은 자바에서 GUI(Graphic User Interface)를 구현하기 위해 JDK에서 기본적으로 제공하는 개발 툴킷이다. 그에 관한 실습을 해보았다.

 

package pack7gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/*
Swing
AWT 기술을 기반으로 순수 자바 언어로 만들어진 라이브러리
모든 AWT 기능 + 추가된 풍부하고 화려한 고급 컴포넌트
AWT 컴포넌트에 J자가 덧붙여진 이름의 클래스
그 외 J 자로 시작하는 클래스
javax.swing 패키지
Swing 컴포넌트는 경량 컴포넌트(Light weight components)
native(peer) 운영체제에 의존하지 않음
*/


public class Ex45Swing extends JFrame implements ActionListener{
	JLabel lblShow;
	int count = 0;
	
	public Ex45Swing() {
		setTitle("스윙 연습");
		
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(2, 1));
		panel.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30)); // top, left, bottom, right 여백 주기
		
		JButton button = new JButton("클릭");
		button.setMnemonic(KeyEvent.VK_C);	// Mnemonic key : alt + C
		button.addActionListener(this);
		
		panel.add(button);
		
		lblShow = new JLabel("버튼 클릭 수 : 0");
		panel.add(lblShow);
		
		add(panel, BorderLayout.CENTER);
		//add("Center", panel);	// 위의 결과와 동일
		
		setBounds(200, 200, 300, 300);
		setVisible(true);
		
		//addWindowListener(....);	윈도우 종료를 아래와 같이 적을 수 있다.
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		count++;
		lblShow.setText("버튼 클릭 수 : " + count);
		
	}
	
	public static void main(String[] args) {
		new Ex45Swing();
		
	}

}

 

 

alt + c를 눌러서도 클릭할 수 있다.

 

 

 

Menu

화면 상단의 메뉴바 만들기 실습

 

package pack7gui;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Ex46Menu extends JFrame implements ActionListener{
	JButton btnR, btnG, btnB;
	JMenuBar mBar;
	JTextArea txtArea = new JTextArea("", 10, 5); // 키보드로 여러 행 입력 가능
	JMenuItem mnuMes, mnuOk, mnuInput;
	
	public Ex46Menu() {
		setTitle("연습");
		
		addLayout();		// 버튼 관련
		addMenuLayout();	// 메뉴 관련
		
		setBounds(200, 200, 400, 300);
		setVisible(true);
		
		//addWindowListener(....);	윈도우 종료를 아래와 같이 적을 수 있다.
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
	
	private void addLayout() {
		btnR = new JButton("빨강");
		btnG = new JButton("초록");
		btnB = new JButton("파랑");
		btnR.addActionListener(this);
		btnG.addActionListener(this);
		btnB.addActionListener(this);
		
		JPanel panel = new JPanel();
		panel.add(btnR);
		panel.add(btnG);
		panel.add(btnB);
		
		add("South", panel);	// Frame은 BorderLayout 이므로
		add("Center", txtArea);
	}
	
	private void addMenuLayout() {
		mBar = new JMenuBar();
		
		JMenu menu = new JMenu("대화상자");
		mnuMes = new JMenuItem("메세지창");
		mnuOk = new JMenuItem("확인창");
		mnuInput = new JMenuItem("입력창");
		menu.add(mnuMes);	// 메뉴에 메뉴 아이템 등록
		menu.add(mnuOk);
		menu.add(mnuInput);
		
		mBar.add(menu);		// 메뉴바에 메뉴 등록
		
		JMenu menu2 = new JMenu("난 메뉴");
		mBar.add(menu2);
		
		setJMenuBar(mBar);
		
		// 메뉴에 리스너 장착
		mnuMes.addActionListener(this);
		mnuOk.addActionListener(this);
		mnuInput.addActionListener(this);
		
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		//System.out.println(e.getActionCommand());
		if(e.getSource() == btnR) {
			txtArea.setBackground(Color.RED);
		}else if(e.getSource() == btnG) {
			txtArea.setBackground(new Color(0, 255, 0));
		}else if(e.getSource() == btnB) {
			txtArea.setBackground(new Color(0, 0, 255));
		}else if(e.getSource() == mnuMes) {	// 메뉴
			// 내장 다이얼로그 박스 호출
			JOptionPane.showMessageDialog(this, "메세지", "알림", JOptionPane.INFORMATION_MESSAGE);
			// Modal dialogbox는 실행을 멈추고 창을 보여준다. 창을 닫으면 처리 진행.
			System.out.println("계속");	// 메세지(showMessageDialog)를 유저가 다 보기 전까지 실행을 멈춤
		}else if(e.getSource() == mnuOk) {
			int result = JOptionPane.showConfirmDialog(this, "버튼을 고르시오", "골라", JOptionPane.YES_NO_CANCEL_OPTION);
			System.out.println(result);
			// if(result == 0) ...
			switch(result) {
			// case 0: ...
			case JOptionPane.YES_OPTION:
				txtArea.append("예 선택\n");
				break;
			case JOptionPane.NO_OPTION:
				txtArea.append("아니오 선택\n");
				break;
			case JOptionPane.CANCEL_OPTION:
				txtArea.append("취소 선택\n");
				break;
			}
		}else if(e.getSource() == mnuInput) {
			String str = JOptionPane.showInputDialog(this, "자료 입력");
			txtArea.append(str + "\n");
		}
		
	}
	
	public static void main(String[] args) {
		// 메뉴 작성, 메세지 박스 ...
		new Ex46Menu();

	}

}

 

 

 

 

 

 

배운 것들을 활용한 이름, 나이, 성별 입력 화면 만들기

 

package pack7gui;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class Ex47 extends JFrame implements ActionListener {
	JTextField txtName, txtAge;
	ButtonGroup buttonGroup = new ButtonGroup();
	JRadioButton rdoM, rdoF;
	JLabel lblResult;

	public Ex47() {
		super("이벤트 연습");

		layoutInit();

		setBounds(200, 200, 400, 300);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	private void layoutInit() {
		setLayout(new GridLayout(5, 1));

		// 1행
		JLabel lbl1 = new JLabel("이름 : ");
		txtName = new JTextField("", 20);
		JPanel panel1 = new JPanel();
		panel1.add(lbl1);
		panel1.add(txtName);
		add(panel1); // Frame에 등록

		// 2행
		JLabel lbl2 = new JLabel("나이 : ");
		txtAge = new JTextField("", 20);
		JPanel panel2 = new JPanel();
		panel2.add(lbl2);
		panel2.add(txtAge);
		add(panel2);

		// 3행
		rdoM = new JRadioButton("남자", true);
		rdoF = new JRadioButton("여자", false);
		buttonGroup.add(rdoM); // JRadioButton을 그룹화
		buttonGroup.add(rdoF);
		JPanel panel3 = new JPanel();
		panel3.add(rdoM);
		panel3.add(rdoF);
		add(panel3);

		// 4행
		JButton btnOk = new JButton("확인");
		btnOk.addActionListener(this);
		JPanel panel4 = new JPanel();
		panel4.add(btnOk);
		add(panel4);

		// 5행
		lblResult = new JLabel("결과 : ", JLabel.CENTER);
		add(lblResult);

		txtName.requestFocus(); // 해당 객체로 cursor 이동

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// 입력 자료 오류 검사
		if (txtName.getText().equals("")) {
			lblResult.setText("이름 입력!");
			txtName.requestFocus();
			return;
		} else if (txtAge.getText().equals("")) {
			lblResult.setText("나이 입력!");
			txtAge.requestFocus();
			return;
		}
		// 나이는 숫자 형태 여부 확인 필요
		int nai = 0;
		try {
			nai = Integer.parseInt(txtAge.getText());
		} catch (Exception e2) {
			lblResult.setText("나이는 정수만 가능");
			txtAge.requestFocus();
			return;
		}

		// System.out.println(nai);
		// 라디어 버튼 선택여부 확인
		// System.out.println(rdoM.isSelected() + " " + rdoF.isSelected());
		String gender = "";
		if (rdoM.isSelected()) {
			gender = "남";
		} else gender = "여";
		String message = "결과 : " + txtName.getText() + "님의 나이는 " + nai + ", 성별은 " + gender;
		
		lblResult.setText(message);
	}

	public static void main(String[] args) {
		new Ex47();

	}

}

 

 

 

결과 화면

 

 

 

 

배운 것들을 활용하여 미니 계산기 만들기 문제 풀기

 

package pack7gui;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

import pack7gui.Ex44Event.EventTest;

public class Ex48Mini extends JFrame implements ActionListener {
	JTextField num1, num2;
	ButtonGroup buttonGroup = new ButtonGroup();
	ButtonGroup buttonGroup2 = new ButtonGroup();
	JRadioButton plus, minus, gop, na;
	JLabel lblResult;
	JButton button, button1, button2;

	public Ex48Mini() {
		super("미니 계산기");

		layoutInit();

		setBounds(200, 200, 400, 300);
		setVisible(true);
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0); // 종료 버튼에 종료 기능 추가
			}
		});

	}

	private void layoutInit() {

		// 1행 : 숫자 1 입력 필드
		setLayout(new GridLayout(5, 1));
		JLabel lbl1 = new JLabel("숫자1 : ");
		num1 = new JTextField("", 20);
		JPanel panel1 = new JPanel();
		panel1.add(lbl1);
		panel1.add(num1);
		add(panel1);

		// 2행 : 숫자 2 입력 필드
		JLabel lbl2 = new JLabel("숫자2 : ");
		num2 = new JTextField("", 20);
		JPanel panel2 = new JPanel();
		panel2.add(lbl2);
		panel2.add(num2);
		add(panel2);

		// 3행 : +,-,*,/ 들 라디오 버튼으로 나열, 기본 값은 +
		plus = new JRadioButton("+", true);
		minus = new JRadioButton("-", false);
		gop = new JRadioButton("*", false);
		na = new JRadioButton("/", false);
		buttonGroup.add(plus); // JRadioButton을 그룹화
		buttonGroup.add(minus);
		buttonGroup.add(gop);
		buttonGroup.add(na);
		JPanel panel3 = new JPanel();
		panel3.add(plus);
		panel3.add(minus);
		panel3.add(gop);
		panel3.add(na);
		add(panel3);

		// 4행 : 결과값 보여주는 곳.
		lblResult = new JLabel("결과 : ", JLabel.CENTER);
		add(lblResult);

		// 5행 : 계산, 초기화, 종료 버튼
		button = new JButton("계산");
		button1 = new JButton("초기화");
		button2 = new JButton("종료");
		button.addActionListener(this);
		button1.addActionListener(this);
		button2.addActionListener(this);
		buttonGroup2.add(button);
		buttonGroup2.add(button1);
		buttonGroup2.add(button2);
		JPanel panel4 = new JPanel();
		panel4.add(button);
		panel4.add(button1);
		panel4.add(button2);

		add(panel4);
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		if (e.getSource() == button) { // 계산 버튼이 눌렸을 때
			if (num1.getText().equals("")) { // 아무것도 입력되지 않았을 때 입력하게끔 유도
				lblResult.setText("숫자1 입력!");
				num1.requestFocus();
				return;
			} else if (num2.getText().equals("")) {
				lblResult.setText("숫자2 입력!");
				num2.requestFocus();
				return;
			}

			int number = 0;
			try { // 입력된 숫자를 number 변수에 대입하고, 정수가 아닌 값이 입력됐을때는 숫자를 입력하게끔 유도
				number = Integer.parseInt(num1.getText());
			} catch (Exception e2) {
				lblResult.setText("숫자만 가능");
				num1.requestFocus();
				return;
			}

			int nai2 = 0;
			try {
				nai2 = Integer.parseInt(num2.getText());
			} catch (Exception e2) {
				lblResult.setText("숫자만 가능");
				num2.requestFocus();
				return;
			}

			int res = 0; // isSelected() 메소드를 사용하여 체크된 라디오 버튼이 무엇인지 판단 후 연산
			if (plus.isSelected()) {
				res = number + nai2;
			} else if (minus.isSelected()) {
				res = number - nai2;
			} else if (gop.isSelected()) {
				res = number * nai2;
			} else if (na.isSelected()) {
				if(number == 0) {
					lblResult.setText("0으로 나누기 불가");
					num1.requestFocus();
					return;
				}
				else if(nai2 == 0){
					lblResult.setText("0으로 나누기 불가");
					num2.requestFocus();
					return;
				}
				res = number / nai2;
			}

			String mes = "결과는 : " + res;
			lblResult.setText(mes);
		} else if (e.getSource() == button1) { // 초기화 버튼이 눌렸을 때 값들 초기화
			num1.setText("");
			num2.setText("");
			plus.setSelected(true);
			lblResult.setText("결과 : ");
		} else if (e.getSource() == button2) { // 종료 버튼이 눌렸을 때
			int result = JOptionPane.showConfirmDialog(this, "종료하시겠습니까?", "알림", JOptionPane.YES_NO_OPTION);
			switch (result) {
			case JOptionPane.YES_OPTION:
				System.exit(0);
				break;
			case JOptionPane.NO_OPTION:
				return;
			}
		}

	}

	public static void main(String[] args) {
		new Ex48Mini();

	}

}

 

 

 

결과화면

 

 

 

'학원일기' 카테고리의 다른 글

21일  (2) 2024.07.24
20일  (2) 2024.07.24
19일  (0) 2024.07.24