코리아 IT아카데미/Java
14일차 | swing
Sharon kim
2021. 11. 9. 11:08
SwingEx 복습 순서 | 메모 |
ch01> ColorChangeFrame EventListenerEx1 EventListenerEx2 SuperMyFrame ch02> Maintest1 MyFrame4 MyFrame5 MyFrame6 MyFrame7 MyFrame8 |
이벤트 리스너 연습 위한 SuperMyFrame 클래스 설계
package ch01;
import javax.swing.JFrame;
public class SuperMyFrame extends JFrame {
public SuperMyFrame() {
}
protected void initData() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
protected void setInitLayout() {
setVisible(true);
}
protected void addEventListener() {
}
}
이벤트 리스너1 연습 : 컬러체인지
package ch01;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JPanel;
public class ColorChangeFrame extends SuperMyFrame implements ActionListener {
BorderLayout borderLayout;
JPanel panel1;
JPanel panel2;
// 기본
// JButton button1;
// JButton button2;
// JButton button3;
// JButton button4;
// JButton button5;
// JButton button6;
// JButton button7;
// 배열
// JButton[] buttons = new JButton[7];
// 배열리스트
final int BUTTONS_SIZE = 7;
//static
ArrayList<JButton> buttons = new ArrayList<>();//선언과 초기화 동시에
// for문 시 이용
Color[] colors = new Color[7];
public ColorChangeFrame() {
initData();
setInitLayout();
addEventListener();
}
@Override
protected void initData() {
super.initData();
setTitle("이벤트 리스너 연습 3");
setSize(600, 500);
borderLayout = new BorderLayout();
panel1 = new JPanel();
panel2 = new JPanel();
// 기본
// button1 = new JButton("red");
// button2 = new JButton("orange");
// button3 = new JButton("yellow");
// button4 = new JButton("green");
// button5 = new JButton("cyan");
// button6 = new JButton("blue");
// button7 = new JButton("magenta");
// 배열
// buttons[0] = new JButton("red");
// buttons[1] = new JButton("orange");
// buttons[2] = new JButton("yellow");
// buttons[3] = new JButton("green");
// buttons[4] = new JButton("cyan");
// buttons[5] = new JButton("blue");
// buttons[6] = new JButton("magenta");
//color 배열
// for
for (int i = 0; i < BUTTONS_SIZE; i++) {
}
}
@Override
protected void setInitLayout() {
super.setInitLayout();
setLayout(borderLayout);
panel1.setBackground(Color.gray);
panel1.setPreferredSize(new Dimension(500, 400));
add(panel1, BorderLayout.NORTH);
panel2.setBackground(Color.white);
panel2.setLayout(new FlowLayout());
panel2.setPreferredSize(new Dimension(500, 100));
add(panel2);
//기본
// panel2.add(button1);
// panel2.add(button2);
// panel2.add(button3);
// panel2.add(button4);
// panel2.add(button5);
// panel2.add(button6);
// panel2.add(button7);
// 배열
// panel2.add(buttons[0]);
// panel2.add(buttons[1]);
// panel2.add(buttons[2]);
// panel2.add(buttons[3]);
// panel2.add(buttons[4]);
// panel2.add(buttons[5]);
// panel2.add(buttons[6]);
// for
// for (int i = 0; i < colors.length; i++) {
// panel2.add(buttons.get(i));
}
@Override
protected void addEventListener() {
super.addEventListener();
// button1.addActionListener(this);
// button2.addActionListener(this);
// button3.addActionListener(this);
// button4.addActionListener(this);
// button5.addActionListener(this);
// button6.addActionListener(this);
// button7.addActionListener(this);
// 배열
// buttons[0].addActionListener(this);
// buttons[1].addActionListener(this);
// buttons[2].addActionListener(this);
// buttons[3].addActionListener(this);
// buttons[4].addActionListener(this);
// buttons[5].addActionListener(this);
// buttons[6].addActionListener(this);
// for
for (int i = 0; i < BUTTONS_SIZE; i++) {
buttons.get(i).addActionListener(this);
}
}
@Override
public void actionPerformed(ActionEvent e) {
// 1번 버튼이 눌러졌으면 panel1의 색상을 빨간색으로 변경
// 2번 버튼이 눌러졌으면 panel2의 색상을 노란색으로 변경
JButton clickedButton = (JButton) e.getSource();
// if(clickedButton.getText().equals(button1.getText())){
// if(clickedButton == button1) {
// panel1.setBackground(Color.red);
// }else if(clickedButton == button2) {
// panel1.setBackground(Color.orange);
// }else if(clickedButton == button3) {
// panel1.setBackground(Color.yellow);
// }else if(clickedButton == button4) {
// panel1.setBackground(Color.green);
// }else if(clickedButton == button5) {
// panel1.setBackground(Color.cyan);
// }else if(clickedButton == button6) {
// panel1.setBackground(Color.blue);
// }else {
// panel1.setBackground(Color.magenta);
// }
// }
// 배열
// if(clickedButton == buttons[0]) {
// panel1.setBackground(Color.red);
// }else if(clickedButton == buttons[1]) {
// panel1.setBackground(Color.orange);
// }else if(clickedButton == buttons[2]) {
// panel1.setBackground(Color.yellow);
// }else if(clickedButton == buttons[3]) {
// panel1.setBackground(Color.green);
// }else if(clickedButton == buttons[4]) {
// panel1.setBackground(Color.cyan);
// }else if(clickedButton == buttons[5]) {
// panel1.setBackground(Color.blue);
// }else {
// panel1.setBackground(Color.magenta);
// }
// for
// if(clickedButton == button[0]) {
// panel1.setBackground(Color.red);
// }else if(clickedButton == buttons[1]) {
// panel1.setBackground(Color.orange);
// }else if(clickedButton == buttons[2]) {
// panel1.setBackground(Color.yellow);
// }else if(clickedButton == buttons[3]) {
// panel1.setBackground(Color.green);
// }else if(clickedButton == buttons[4]) {
// panel1.setBackground(Color.cyan);
// }else if(clickedButton == buttons[5]) {
// panel1.setBackground(Color.blue);
// }else {
// panel1.setBackground(Color.magenta);
// }
}
public static void main(String[] args) {
new ColorChangeFrame();
}
}
시스템 콜백
package ch01;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
class MyFrame1 extends JFrame implements ActionListener{
JButton button;
JButton button2;
public MyFrame1() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setTitle("이벤트리스너 연습");
setSize(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button = new JButton("button 1");
button2 = new JButton("button 2");
}
private void setInitLayout() {
setVisible(true);
setLayout(new FlowLayout());
add(button);
add(button2);
}
private void addEventListener() {
button.addActionListener(this);
button2.addActionListener(this);
}//어떤 동작을 등록시키는 역할만 하는
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("시스템 콜백 실행");
//시스템 ★콜백★ - > 윈도우 운영체제에게 요청
//'사용자가 이 동작을 하였을 때 나에게 알려달라'인터페이스 -> 약속의 의미
System.out.println("버튼이 클릭되었습니다.");
System.out.println(e.toString());
}
}
public class EventListenerEx1 {
public static void main(String[] args) {
new MyFrame1();
}//end of main
}//end of class
이벤트 리스너2 연습 : 클릭한 버튼 출력
package ch01;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
//인터페이스는 기능으로만 쓸 때
class MyFrame2 extends SuperMyFrame implements ActionListener {
//기본
// JButton button1;
// JButton button2;
// JButton button3;
// JButton button4;
// JButton button5;
//베열
// JButton[] buttons = new JButton[5];
//ArrayList
ArrayList<JButton> buttons = new ArrayList<>();
final int BUTTONS_SIZE = 5;
//final은 소문자
public MyFrame2() {
initData();
setInitLayout();
addEventListener();
}
@Override
protected void initData() {
setTitle("이벤트 리스너 연습 2");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 500);
//기본
// button1 = new JButton("이벤트 버튼 1");
// button2 = new JButton("이벤트 버튼 2");
// button3 = new JButton("이벤트 버튼 3");
// button4 = new JButton("이벤트 버튼 4");
// button5 = new JButton("이벤트 버튼 5");
//배열
// buttons[0] = new JButton("이벤트 버튼 1");
// buttons[1] = new JButton("이벤트 버튼 2");
// buttons[2] = new JButton("이벤트 버튼 3");
// buttons[3] = new JButton("이벤트 버튼 4");
// buttons[4] = new JButton("이벤트 버튼 5");
//for문 변경
for (int i = 0; i < BUTTONS_SIZE; i++) {
buttons.add(new JButton("이벤트 버튼"+(i+1)));
}
}
@Override
protected void setInitLayout() {
setVisible(true);
setLayout(new FlowLayout());
//기본
// add(button1);
// add(button2);
// add(button3);
// add(button4);
// add(button5);
//배열
// add(buttons[0]);
// add(buttons[1]);
// add(buttons[2]);
// add(buttons[3]);
// add(buttons[4]);
//ArrayList
for (int i = 0; i < BUTTONS_SIZE; i++) {
add(buttons.get(i));
}
}
@Override
protected void addEventListener() {
//기본
// button1.addActionListener(this);
// button2.addActionListener(this);
// button3.addActionListener(this);
// button4.addActionListener(this);
// button5.addActionListener(this);
//배열
// buttons[0].addActionListener(this);
// buttons[1].addActionListener(this);
// buttons[2].addActionListener(this);
// buttons[3].addActionListener(this);
// buttons[4].addActionListener(this);
//for문
for (int i = 0; i < BUTTONS_SIZE; i++) {
buttons.get(i).addActionListener(this);
}
}
@Override
public void actionPerformed(ActionEvent e) {
// System.out.println("버튼이 눌러졌습니다.");
JButton clickedButton = (JButton) e.getSource();
System.out.println(clickedButton.getText());
// 문자열을 비교해서
// 1번 버튼이 클릭되었습니다.
// 2번 버튼이 클릭되었습니다.
//기본
// if (clickedButton.getText().equals(button1.getText())) {
// System.out.println("1번 버튼이 클릭되었습니다.");
// } else if (clickedButton.getText().equals(button2.getText())) {
// System.out.println("2번 버튼이 클릭되었습니다.");
// } else if (clickedButton.getText().equals(button3.getText())) {
// System.out.println("3번 버튼이 클릭되었습니다.");
// } else if (clickedButton.getText().equals(button4.getText())) {
// System.out.println("4번 버튼이 클릭되었습니다.");
// } else {
// System.out.println("5번 버튼이 클릭되었습니다.");
// }
//배열
// if (clickedButton.getText().equals(buttons[0].getText())) {
// System.out.println("1번 버튼이 클릭되었습니다.");
// } else if (clickedButton.getText().equals(buttons[1].getText())) {
// System.out.println("2번 버튼이 클릭되었습니다.");
// } else if (clickedButton.getText().equals(buttons[2].getText())) {
// System.out.println("3번 버튼이 클릭되었습니다.");
// } else if (clickedButton.getText().equals(buttons[3].getText())) {
// System.out.println("4번 버튼이 클릭되었습니다.");
// } else {
// System.out.println("5번 버튼이 클릭되었습니다.");
// }
//for 문 변경
// for (int i = 0; i < buttons.length; i++) {
//
// }
}
}
public class EventListenerEx2 {
public static void main(String[] args) {
new MyFrame2();
}
}
MyFrame4 익명 구현 객체 사용해보기
package ch02;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MyFrame4 extends JFrame{
JButton button;
JButton button2;
//코드 수정
//1. button2 생성
//2. add ,
//3. 이벤트 리스너 등록 ---> 익명구현 객체를 사용해서 처리
//4. 실행확인
public MyFrame4() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setTitle("익명구현객체 사용해보기");
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button = new JButton("이벤트 등록 후 대기");
button2 = new JButton("이벤트 등록 후 대기2");
}
private void setInitLayout() {
setVisible(true);
add(button, BorderLayout.NORTH);
add(button2, BorderLayout.SOUTH);
}
private void addEventListener() {
ActionListener ac = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("버튼 클릭됨");
System.out.println("추후 알아서 구분 코드 작성해주세요");
}
};
//익명 구현 객체
//일회성의 인터페이스를 익명 구현 객체로 만들어서 사용할 수 있다.
button.addActionListener(ac);
button2.addActionListener(ac);
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("버튼이 클릭되었습니다.");
}
});
// button.addActionListener(new ActionListener() {
// //추상메서드를 일반 메서드로 구현했다.
// public void actionPerformed(ActionEvent e) {
//
// }
//
// });
}//end
public static void main(String[] args) {
// MyFrame4 mf = new MyFrame4();
// mf.button.setText("안녕하세요");
//익명 클래스 (인스턴스 변수가 없기 때문에 지속적으로 접근해서 사용할 수는 없다.)
new MyFrame4();
}
}//end of class
MyFrame5 마우스 리스너 (hello java~가 마우스 클릭하면 따라옴)
package ch02;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MyFrame5 extends JFrame{
JLabel label;
public MyFrame5() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setTitle("마우스 이벤트");
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
label = new JLabel("Hello java ~ ");
label.setSize(150, 50);
}
private void setInitLayout() {
setVisible(true);
setLayout(null);
add(label);
label.setLocation(12,40);
}
private void addEventListener() {
this.addMouseListener(new MouseListener() {
//마우스가 떨어졌을 때 실행되는 메서드
@Override
public void mouseReleased(MouseEvent e) {
}
//마우스가 눌러졌을 때 실행되는 메서드
@Override
public void mousePressed(MouseEvent e) {
}
//마우스가 나갔을 때 실행되는 메서드
@Override
public void mouseExited(MouseEvent e) {
}
//마우스가 들어왔을 때 실행되는 메서드
@Override
public void mouseEntered(MouseEvent e) {
}
//마우스가 클릭되었을 때 실행되는 메서드
@Override
public void mouseClicked(MouseEvent e) {
// System.out.println(e.getX() + "좌표값X");
// System.out.println(e.getY() + "좌표값Y");
label.setLocation(e.getX(),e.getY());
}
});
}//end of EventListener
//main function
public static void main(String[] args) {
new MyFrame5();
}//end of main
}
MyFrame6 어댑터 클래스 이용 (패널 클릭 시 클릭된 위치의 x, y좌표값이 출력)
package ch02;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
public class MyFrame6 extends JFrame{
//어댑터 패턴 -> 디자인 패턴의 일종
//마우스리스너 >>5개나됨 다안씀 ,내가 쓰는 메서드의 하나만 만들어서 쓰는 것
public MyFrame6() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setTitle("어댑터 클래스 이용");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 500);
}
private void setInitLayout() {
setVisible(true);
}
private void addEventListener() {
this.addMouseListener(new MyMouseListener());
}
//추상클래스는 new 키워드를 사용할 수 없다. --> 클래스의 타입으로만 존재한다.
//어댑터 패턴이란 추상메서드를 다 구현하고 (일반 메서드로 다 변환) {단, 메서드의 바디 부분을 비워놓음}
//내부 클래스 생성
//마우스 어댑터는 일반메서드만 존재하기 때문에 추상메서드가 없는 상태
private class MyMouseListener extends MouseAdapter{
//메서드 재정의
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
System.out.println("x좌표값 : " + x);
System.out.println("y좌표값 : " + y);
}
}
//main function
public static void main(String[] args) {
new MyFrame6();
}//end of main
}//end of class
MyFrame7 키 이벤트 (방향키 누르는대로 패널에 나옴)
package ch02;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class MyFrame7 extends JFrame{
JTextArea area;
//자료형 대문자 -> 클래스타입, 점연산자 사용가능
public MyFrame7() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setTitle("키 이벤트 연습");
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
area = new JTextArea();
}
private void setInitLayout() {
setVisible(true);
this.add(area);
}
private void addEventListener() {
// area.addKeyListener(this);//이 클래스 자체가 JFrame이자 KeyListener이기 때문이다.
area.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_UP) {
area.append("방향키" +" : ↑" + "\n");
}else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
area.append("방향키" +" : ↓"+ "\n");
}else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
area.append("방향키" +" : →"+ "\n");
}else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
area.append("방향키" +" : ←"+ "\n");
}
}
});
}
//문자를 눌렀을 때 호출, 문자키에만 반응 합니다.
// @Override
// public void keyTyped(KeyEvent e) {
// System.out.println("keyTyped" + e.getID());
// }
//키보드를 눌렀을 때 호출, 모든 키보드에 반응 합니다.
// @Override
// public void keyPressed(KeyEvent e) {
// System.out.println("keyPressed" + e.getID());
// }
// @Override
// public void keyPressed(KeyEvent e) {
// System.out.println("keyPressed" + e.getID());
// e.getKeyCode();
// System.out.println(e.getKeyCode());
// area.setText(e.getKeyCode() + "");
// area.append(e.getKeyCode() + "\n");
// if(e.getKeyCode() == KeyEvent.VK_UP) {
// area.append("방향키" +" : ↑" + "\n");
// }else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
// area.append("방향키" +" : ↓"+ "\n");
// }else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
// area.append("방향키" +" : →"+ "\n");
// }else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
// area.append("방향키" +" : ←"+ "\n");
// }
//위쪽 방향키
//아래쪽 방향키
//좌 방향키
//우 방향키
// }
//키보드를 뗐을 때 호출, 모든 키보드에 반응 합니다.
// @Override
// public void keyReleased(KeyEvent e) {
// System.out.println("keyReleased" + e.getID());
}
결과
package ch02;
import java.util.Scanner;
public class MainTest1 {
public static void main(String[] args) {
MyFrame7 frame7 = new MyFrame7();
//외부에서 사용
Scanner scanner = new Scanner(System.in);
System.out.println("글자를 입력하세요");
String userInput = scanner.nextLine();
frame7.area.setText(userInput + "\n");
// new MyFrame8();
}
}
MyFrame8 이미지 백그라운드 연습 (어몽어스 방향키로 움직이면 좌표값 출력)
package ch02;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MyFrame8 extends JFrame{
// Icon ic = new ImageIcon("sdf.gif");
BufferedImage backgroundImage;
BufferedImage imageIcon1;
MyImagePanel imagePanel;
int xPoint = 200;
int yPoint = 200;
int Point = 200;
// URL url = getClass().getResource("sdf.gif");
public MyFrame8() {
initData();
setInitLayout();
addEventListener();
// ic = new ImageIcon(ic);
// this.getContentPane().add(icon);
}
private void initData() {
setTitle("이미지 백그라운드 연습 2");
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
backgroundImage = ImageIO.read(new File("background1.jpg"));
imageIcon1 = ImageIO.read(new File("among1.png"));
// imageIcon1 = ImageIO.read(new File("among2.png"));
} catch (Exception e) {
System.err.println("파일이 없습니다.");
System.exit(0);//프로그램을 알아서 종료시키는 명령어
}
imagePanel = new MyImagePanel();
}
private void setInitLayout() {
this.setVisible(true);
this.setResizable(false);//크기를 줄이거나 늘리지 못하게 막는 코드
this.add(imagePanel);
}
private void addEventListener() {
//익명 구현 객체
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//삼항연산자로 사용해서 코드를 작성해주세요
// 조건식 ? 결과1 : 결과2;
int keyCode = e. getKeyCode();
if(keyCode == KeyEvent.VK_UP) {
yPoint = (yPoint < -10)? 0 : yPoint - 10;
System.out.println("yPoint : " + yPoint);
}else if (keyCode == KeyEvent.VK_DOWN) {
yPoint = (yPoint > 390)? 390 : yPoint + 10;
System.out.println("yPoint : " + yPoint);
}else if (keyCode == KeyEvent.VK_LEFT) {
xPoint = (xPoint < -10)? 0 : xPoint - 10;
System.out.println("xPoint : " + xPoint);
}else if (keyCode == KeyEvent.VK_RIGHT) {
xPoint = (xPoint > 410)? 410 : xPoint + 10;
System.out.println("xPoint : " + xPoint);
}
repaint();
//switch-case문으로 변경
}// end of KeyPressed
});
}
//내부 클래스 생성
private class MyImagePanel extends JPanel{
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImage, 0, 0, 500, 500, null);
g.drawImage(imageIcon1, xPoint, yPoint, 80, 80, null);
}
}
}//end of class
결과
package ch02;
public class MainTest1 {
public static void main(String[] args) {
new MyFrame8();
}
}