자바 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();
}
}
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();
}
}
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();
}
}