EventSourceHandleApp (방법 1)
package xyz.itwill.awt;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
// EXIT 버튼을 누른 경우 프로그램을 종료하는 기능의 프로그램 작성
// > 디자인 클래스와 이벤트 처리 클래스를 하나의 클래스로 작성
// > 이벤트 처리 메소드에서 디자인 클래스의 컴퍼넌트 사용 가능
public class EventSourceHandleApp extends Frame implements ActionListener {
private static final long serialVersionUID = 1L;
public EventSourceHandleApp(String title) {
super(title);
setLayout(new FlowLayout());
Button exit = new Button("Exit"); // 이벤트 소스
exit.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 30));
add(exit);
// 컴퍼넌트에서 발생된 이벤트를 this 키워드를 사용하여 현재 클래스의 객체로 이벤트 처리
exit.addActionListener(this); // exit란 버튼에
setBounds(800, 200, 300, 300);
setVisible(true);
}
public static void main(String[] args) {
new EventSourceHandleApp("이벤트처리");
}
public void actionPerformed(ActionEvent e) {
}
}
EventInnerHandleApp (방법2)
package xyz.itwill.awt;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
// [EXIT] 버튼을 누른 경우 프로그램을 종료하는 기능의 프로그램 작성
// > 이벤트 처리 클래스를 디자인 클래스의 내부 클래스로 작성
// > 이벤트 처리 메소드에서 디자인 클래스의 컴퍼넌트 사용 가능
public class EventInnerHandleApp extends Frame {
private static final long seriVerionUID = 1L;
public EventInnerHandleApp (String title) {
super(title);
setLayout(new FlowLayout());
Button exit = new Button("EXIT");
exit.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 30));
add(exit);
// 외부 클래스의 메소드에서는 내부클래스로 객체 생성가능
exit.addActionListener(new EventHandle());
setBounds(800, 200, 300, 300);
setVisible(true);
}
public static void main(String[] args) {
new EventSourceHandleApp("이벤트처리");
}
// 내부클래스(이벤트 처리 클래스)는 외부클래스(디자인 클래스)의 필드와 메소드를
// 접근제한자에 상관없이 사용 가능
public class EventHandle implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
}
EventAnnoymousHandleApp (방법3 / +최종완성)
package xyz.itwill.awt;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
// [EXIT] 버튼을 누른 경우 프로그램을 종료하는 기능의 프로그램 작성
// => 이벤트 처리 클래스를 익명의 내부클래스(Anonymous InnerClass)로 작성
public class EventAnnoymousHandleApp extends Frame {
private static final long serialVersionUID = 1L;
public EventAnnoymousHandleApp(String title) {
super(title);
setLayout(new FlowLayout());
Button exit=new Button("EXIT");//이벤트 소스
exit.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 30));
add(exit);
// 이벤트 처리 객체를 익명의 내부클래스를 사용하여 생성
exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
setBounds(800, 200, 300, 300);
setVisible(true);
}
public static void main(String[] args) {
new EventAnnoymousHandleApp("이벤트처리");
}
}
WindowListenerApp (방법1)
package xyz.itwill.awt;
import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
// 프레임의 [닫기] 버튼을 누른 경우 프로그램을 종료하는 기능의 프로그램 작성
// > 프레임에서는 WindowEvent 발생 - WindowListener 인터페이스를 상속받은 자식클래스로 이벤트 처리
public class WindowListenerApp extends Frame {
private static final long serialVersionUID = 1L;
public WindowListenerApp(String title) {
super(title);
//프레임에서 WindowEvent가 발생될 경우 이벤트 처리할 객체 등록
addWindowListener(new WindowEventHandleOne());
setBounds(800, 200, 300, 300);
setVisible(true);
}
public static void main(String[] args) {
new WindowListenerApp("윈도우이벤트");
}
// Listener 인터페이스를 상속받은 자식클래스(이벤트 처리 클래스)는 무조건 인터페이스의
// 모든 추상메소드 오버라이드 선언
// > 불필요한 추상메소드도 오버라이드 선언
public class WindowEventHandleOne implements WindowListener {
@Override
public void windowOpened(WindowEvent e) {
//System.out.println("windowOpened 메소드 호출");
}
@Override
public void windowClosing(WindowEvent e) {
//System.out.println("windowClosing 메소드 호출");
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) {
//System.out.println("windowClosed 메소드 호출");
}
@Override
public void windowIconified(WindowEvent e) {
//System.out.println("windowIconified 메소드 호출");
}
@Override
public void windowDeiconified(WindowEvent e) {
//System.out.println("windowDeiconified 메소드 호출");
}
@Override
public void windowActivated(WindowEvent e) {
//System.out.println("windowActivated 메소드 호출");
}
@Override
public void windowDeactivated(WindowEvent e) {
//System.out.println("windowDeactivated 메소드 호출");
}
}
}
WindowAdapterApp (방법2)
package xyz.itwill.awt;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
// 프레임의 [닫기]를 누른 경우 프로그램을 종료하는 기능의 프로그램 작성
// > 프레임에서는 WindowEvent 발생 - WindowAdapter 클래스를 상속받은 자식클래스로 이벤트 처
public class WindowAdapterApp extends Frame {
private static final long serialVersionUID = 1L;
public WindowAdapterApp(String title) {
super(title);
//addWindowListener(new WindowEventHandleTwo());
//프레임의 [닫기]를 누른 경우 프로그램을 종료하는 기능의 명령 - 익명의 내부클래스 사용
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setBounds(800, 200, 300, 300);
setVisible(true);
}
public static void main(String[] args) {
new WindowAdapterApp("윈도우 이벤트");
}
/*
//Adapter 클래스를 상속받은 자식클래스(이벤트 처리 클래스)는 필요한 메소드만 오버라이드 선언
//Adapter 클래스 : Listener 인터페이스 중 추상메소드가 2개이상 선언된 경우 Listener
//인터페이스 대신 이벤트 처리 위해 제공하는 클래스
public class WindowEventHandleTwo extends WindowAdapter {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
*/
}
EventSourceGetApp
package xyz.itwill.awt;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
// 색상 버튼을 누르면 캔버스의 배경색을 변경하는 프로그램 작성
public class EventSourceGetApp extends Frame {
private static final long serialVersionUID = 1L;
// 이벤트 처리 클래스의 메소드에서 사용될 컴퍼넌트 또는 컨테이너는 필드 선언
// > 내부클래스의 이벤트 처리 메소드에서 필드 사용 가능
Button red, green, blue, white;
Canvas canvas;
public EventSourceGetApp(String title) {
super(title);
red = new Button("RED");
green = new Button("GREEN");
blue = new Button("BLUE");
white = new Button("WHITE");
canvas=new Canvas();
Panel panel = new Panel();
panel.setLayout(new GridLayout(1, 4));
panel.add(red);
panel.add(green);
panel.add(blue);
panel.add(white);
add(panel, BorderLayout.NORTH);
add(canvas, BorderLayout.CENTER);
panel.setFont(new Font(Font.DIALOG, Font.BOLD, 20));
// 프레임의 [닫기]를 누른 경우 프로그램을 종료하는 이벤트 처리 객체 등록
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
/*
// 컴퍼넌트마다 이벤트를 처리하는 클래스를 다르게 설정
red.addActionListener(new RedButtonHandle());
green.addActionListener(new GreenButtonHandle());
blue.addActionListener(new BlueButtonHandle());
white.addActionListener(new WhiteButtonHandle());
*/
// 컴퍼넌트마다 이벤트를 처리하는 클래스를 동일하게 설정
// > 이벤트 처리 메소드에서 이벤트가 발생된 컴퍼넌트를 구분하여 명령을 선택 실행
red.addActionListener(new ColorButtonHandle());
green.addActionListener(new ColorButtonHandle());
blue.addActionListener(new ColorButtonHandle());
white.addActionListener(new ColorButtonHandle());
setBounds(800, 200, 400, 400);
setVisible(true);
}
public static void main(String[] args) {
new EventSourceGetApp("이벤트처리");
}
/*
public class RedButtonHandle implements ActionListener {
public void actionPerformed(ActionEvent e) {
canvas.setBackground(Color.RED);
}
}
public class GreenButtonHandle implements ActionListener {
public void actionPerformed(ActionEvent e) {
canvas.setBackground(Color.GREEN);
}
}
public class BlueButtonHandle implements ActionListener {
public void actionPerformed(ActionEvent e) {
canvas.setBackground(Color.BLUE);
}
}
public class WhiteButtonHandle implements ActionListener {
public void actionPerformed(ActionEvent e) {
canvas.setBackground(Color.WHITE);
}
}
*/
public class ColorButtonHandle implements ActionListener {
// 이벤트 처리 메소드의 매개변수에는 이벤트 관련 정보를 Event 객체로 제공받아 사용
public void actionPerformed(ActionEvent e) {
// Event.getSource() : 이벤트가 발생된 컴퍼넌트(컨테이너)를 반환하는 메소드
// > 컴퍼넌트(컨테이너)가 Object 타입의 객체로 반환
Object eventSource = e.getSource();
// 참조변수에 저장된 객체의 메모리 주소 비교
if (eventSource == red) {
canvas.setBackground(Color.RED);
} else if(eventSource == green) {
canvas.setBackground(Color.GREEN);
} else if(eventSource == blue) {
canvas.setBackground(Color.BLUE);
} else if(eventSource == white) {
canvas.setBackground(Color.WHITE);
}
}
}
}
// javax.swing 패키지의 클래스를 이용하여 GUI 프로그램을 작성하는 방법
// 1. java.awt 패키지의 컴퍼넌트 또는 컨테이너 관련 대신 javax.swing 패키지의 컴퍼넌트와
// 컨테이너 관련 클래스를 사용하여 UI구현
// > AWT 컴퍼넌트(컨테이너) 관련 클래스 이름 앞에 J를 붙이면 SWING 컴퍼넌트와 동일
// 2. 프레임의 [닫기]를 누른 경우 동작되는 기능을 기본적으로 제공
// > JFrame. setDefaultCloseOperation(int operation) 메소드를 호출하여 프레임의 [닫기를] 누른경우
// 동작되는 기능을 변경 - operation 매개변수에서는 WindowConstans 클래스의 상수
// > DO NOTHING_ON_CLOSE : 아무런 동작도 실행되지 않도록 설정하는 상수 - 기본값
// > DISPOSE_ON_CLOSE : 메모리를 정리하고 프로그램을 종료하는 상수
// > EXIT_ON_CLOSE : 프로그램을 종료하는 상수
// 3.프레임을 직접 변경하지 않고 프레임의 Container 객체를 반환받아 변경 처리
// > 프레임의 배치관리자 변경, 프레임의 배경색 변경, 프레임의 컴퍼넌트 배치 등
// JTextField 컴퍼넌트에서 메세지를 입력 후 엔터를 누르면 JTextArea 컴퍼넌트에 메세지를
// 추가하여 출력되도록 프로그램 작성
// > JTextField 컴퍼넌트에서 메세지를 입력 후 엔터를 누르면 ActionEvent 발생
// 1. java.awt 패키지의 컴퍼넌트 또는 컨테이너 관련 대신 javax.swing 패키지의 컴퍼넌트와
// 컨테이너 관련 클래스를 사용하여 UI구현
// > AWT 컴퍼넌트(컨테이너) 관련 클래스 이름 앞에 J를 붙이면 SWING 컴퍼넌트와 동일
// 2. 프레임의 [닫기]를 누른 경우 동작되는 기능을 기본적으로 제공
// > JFrame. setDefaultCloseOperation(int operation) 메소드를 호출하여 프레임의 [닫기를] 누른경우
// 동작되는 기능을 변경 - operation 매개변수에서는 WindowConstans 클래스의 상수
// > DO NOTHING_ON_CLOSE : 아무런 동작도 실행되지 않도록 설정하는 상수 - 기본값
// > DISPOSE_ON_CLOSE : 메모리를 정리하고 프로그램을 종료하는 상수
// > EXIT_ON_CLOSE : 프로그램을 종료하는 상수
// 3.프레임을 직접 변경하지 않고 프레임의 Container 객체를 반환받아 변경 처리
// > 프레임의 배치관리자 변경, 프레임의 배경색 변경, 프레임의 컴퍼넌트 배치 등
// JTextField 컴퍼넌트에서 메세지를 입력 후 엔터를 누르면 JTextArea 컴퍼넌트에 메세지를
// 추가하여 출력되도록 프로그램 작성
// > JTextField 컴퍼넌트에서 메세지를 입력 후 엔터를 누르면 ActionEvent 발생
SwingApp
package xyz.itwill.swing;
public class SwingApp extends JFrame {
private static final long serialVersionUID = 1L;
JTextField jTextField;
JTextArea jTextArea;
public SwingApp(String title) {
super(title);
jTextField = new JTextField();
jTextArea = new JTextArea("[홍길동]님이 입장 하였습니다.\n");
// Swing 프로그램에서는 운영체제에서 제공되는 모든 글꼴 사용 가능
jTextField.setFont(new Font("굴림체", Font.BOLD, 20));
jTextArea.setFont(new Font("굴림체", Font.BOLD, 20));
jTextArea.setBackground(Color.YELLOW);
// JTextArea 컴퍼넌트에 입력촛점을 제공하지 않도록 설정 - 출력 컴퍼넌트로만 사용
jTextArea.setFocusable(false);
// JFrame.getContentPane() : 프레임의 컨테이너 기능을 객체를 반환하는 메소드
Container container=getContentPane();
// JScrollPane : 컴퍼넌트에 스크롤을 제공하는 컨테이너
JScrollPane jScrollPane=new JScrollPane(jTextArea);
// container.add(jTextArea, BorderLayout.CENTER);
container.add(jScrollPane, BorderLayout.CENTER);
container.add(jTextField, BorderLayout.SOUTH);
// JTextField 컴퍼넌트에서 ActionEvent가 발생될 경우 이벤트 처리할 클래스로 객체를 생성하여 이벤트 처리 기능 등록
jTextField.addActionListener(new TextEventHandle());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(800, 200, 400, 500);
setVisible(true);
}
public static void main(String[] args) {
new SwingApp("Swing");
}
public class TextEventHandle implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TextComponenet.getText() : JTextField 컴퍼넌트 또는 JTextArea 컴퍼넌트에 입력된 문자열을 반환하는 메소드
String text = jTextField.getText();
if(!text.equals("")) { // 입력된 문자열이 있는 경우
// JTextArea.append(String text) : JTextArea 컴퍼넌트에 문자열을 추가하여 출력하는 메소드
jTextArea.append("[홍길동]"+text+"\n");
// JTextArea.setCaretPosition(int position) : JTextArea 컴퍼넌트의 스크롤을 이동하는 메소드
jTextArea.setCaretPosition(jTextArea.getText().length());//스크롤을 맨아래로 이동
// TextComponenet.setText(String text) : JTextField 컴퍼넌트 또는 JTextArea
// 컴퍼넌트에 입력된 문자열을 변경하는 메소드
jTextField.setText("");
}
}
}
}
DigitalClockApp
package xyz.itwill.swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
// 시스템 현재 날짜와 시간을 제공받아 출력하는 GUI 프로그램 작성
// > 새로운 스레드를 생성하여 날짜와 시간을 1초마자 제공받아 컴퍼넌트 변경
public class DigitalClockApp extends JFrame {
private static final long serialVersionUID = 1L;
// 날짜와 시간을 출력할 JLabel 컴퍼넌트를 저장하기 위한 필드
JLabel clockLabel;
JButton startButton, stopButton;
// 날짜와 시간을 변경하는 스레드의 실행상태를 저장하기 위한 필드
// > true : 스레드 동작 상태 / false : 스레드 중지 상태
private boolean isRun;
public DigitalClockApp (String title) {
super(title);
isRun = true;
/*
Date now = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초");
String printDate = dateFormat.format(now);
*/
// clockLabel=new JLabel(printDate, JLabel.CENTER);
clockLabel = new JLabel("", JLabel.CENTER); // JLabel.CENTER) 가운대로 출력됨
clockLabel.setFont(new Font("굴림체", Font.BOLD, 30));
clockLabel.setForeground(Color.DARK_GRAY);
startButton = new JButton("다시 실행");
stopButton = new JButton("일시 중지");
startButton.setFont(new Font("굴림체", Font.BOLD, 20));
stopButton.setFont(new Font("굴림체", Font.BOLD, 20));
JPanel jPanel = new JPanel();
jPanel.add(startButton);
jPanel.add(stopButton);
startButton.setEnabled(false);
getContentPane().add(clockLabel, BorderLayout.CENTER);
getContentPane().add(jPanel, BorderLayout.SOUTH);
// 스레드 객체로 새로운 스레드를 생성해 run() 메소드를 호출하여 명령 실행
new ClockThread().start();
// 컴퍼넌트에서 이벤트가 발생될 경우 이벤트 처리 객체를 제공받아 이벤트 처리
// > JVM에 의해 Event-Queue 스레드를 생성하여 이벤트가 발생되면 이벤트 처리
startButton.addActionListener(new ClockEventHandle());
stopButton.addActionListener(new ClockEventHandle());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(700, 200, 600, 200);
setVisible(true);
}
public static void main(String[] args) {
new DigitalClockApp("디지털 시계");
}
// 시스템의 현재 날짜와 시간을 1초마다 제공받아 JLabel 컴퍼넌트를 변경하는 기능을 제공하는 스레드 클래스
public class ClockThread extends Thread {
public void run() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초");
while (true) {
if(isRun) {
/*
Date now=new Date();
String printDate=dateFormat.format(now);
// JLabel.setText(String text) : JLabel 컴퍼넌트의 문자열을 변경하는 메소드
clockLabel.setText(printDate);
*/
//시스템의 현재 날짜와 시간을 제공받아 JLabel 컴퍼넌트의 문자열 변경
clockLabel.setText(dateFormat.format(new Date()));
}
try {
// 스레드를 1초동안 일시중지
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 버튼을 누른 경우 실행될 이벤트 처리 클래스
public class ClockEventHandle implements ActionListener {
public void actionPerformed(ActionEvent e) {
Object eventSource = e.getSource();
if (eventSource == startButton) {
startButton.setEnabled (false);
stopButton.setEnabled (true);
isRun = true;
} else if (eventSource == stopButton) {
startButton.setEnabled (true);
stopButton.setEnabled (false);
isRun = false;
}
}
}
}
JTableApp
package xyz.itwill.swing;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.util.Vector;
public class JTableApp extends JFrame {
private static final long serialVersionUID = 1L;
public JTableApp(String title) {
super(title);
String[] columnName = {"학번", "이름", "전화번호"};
String[][] rowData = {{"1000", "이명헌", "010-2134-5343"}
,{"2000","신현필", "010-1234-7611"}, {"3000", "최동오","010-7213-3499"}
,{"4000", "신현철", "010-3247-6121"}, {"5000", "정우성", "010-8781-0111"}};
// DefaultTableModel 클래스 : 테이블 관련 정보를 저장하기 위한 클래스
// > 테이블의 행 또는 열(셀 : Cell)을 조작할 수 있는 메소드 제공
DefaultTableModel defaultTableModel = new DefaultTableModel(rowData, columnName);
//Vector 클래스 : 다수의 객체를 저장하기 위한 콜렉션 클래스 - List 인터페이스 상속
Vector<String> vector=new Vector<>();
vector.add("6000");
vector.add("홍경래");
vector.add("010-3213-1233");
//DefaultTableModel.addRow(Vector vector) : 테이블에 행을 추가하는 메소드
defaultTableModel.addRow(vector);
//JTable 클래스 : 값을 행과 열로 구성된 표 형식으로 출력하기 위한 컴퍼넌트
//JTable jTable=new JTable(rowData, columnName);
JTable jTable=new JTable(defaultTableModel);
JScrollPane jScrollPane=new JScrollPane(jTable);
getContentPane().add(jScrollPane, BorderLayout.CENTER);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(700, 200, 500, 300);
setVisible(true);
}
public static void main(String[] args) {
new JTableApp("JTable 컴퍼넌트");
}
}
PaintApp
package xyz.itwill.swing;
import javax.swing.*;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
// 프레임에서 마우스 버튼을 클릭하면 클릭한 위치의 좌표값을 출력하는 프로그램 작성
public class PaintApp extends JFrame {
private static final long serialVersionUID = 1L;
// 마우스 버튼을 클릭한 위치의 좌표값을 저장하기 위한 필드
private int x, y; // private Point point;
public PaintApp(String title) {
super(title);
// 프레임에서 마우스 관련 이벤트가 발생될 경우 이벤트 처리 객체로 이벤트 처리되도록 등록
// > MouseAdapter 클래스를 상속받은 익명의 내부클래스를 사용하여 이벤트 처리 객체
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// MouseEvent.getX() : 마우스를 클릭한 X 좌표값을 반환하는 메소드
// MouseEvent.getY() : 마우스를 클릭한 Y 좌표값을 반환하는 메소드
x = e.getX();
y = e.getY();
//Window.repaint() : paint() 메소드를 수동으로 호출하는 메소드
repaint();
}
});
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(800, 200, 300, 400);
setVisible(true);
}
public static void main(String[] args) {
new PaintApp("Paint");
}
//Window.paint(Graphics g) : 컨테이너(JFram, JWindow, JDialog 등)를 출력하는 메소드
// => paint() 메소드는 컨테이너 관련 이벤트가 발생된 경우 자동 호출
// => 1.프로그램이 실행되어 컨테이너 보여질 경우, 2.프로그램이 아이콘에서 해제되어
//컨테이너가 보여질 경우, 3.컨테이너의 크기가 변경될 경우
// => Graphics 객체 : 컨테이너에 그림을 그리기 위한 기능을 제공하는 객체
//paint() 메소드를 오버라이드 선언하여 컨테이너에 필요한 명령을 실행
@Override
public void paint(Graphics g) {
//System.out.println("paint() 메소드 호출");
//부모클래스의 숨겨진 메소드 호출 - 컨테이너 초기화
super.paint(g);
/*
//Graphics.setColor(Color c) : 그림을 그리기 위한 색을 변경하는 메소드
g.setColor(Color.RED);
g.drawRect(20, 40, 50, 50);
g.fillRect(20, 100, 100, 50);
g.setColor(Color.GREEN);
g.drawOval(125, 175, 50, 50);
g.fillOval(100, 250, 100, 50);
g.setColor(Color.BLUE);
g.drawLine(100, 320, 200, 320);
g.drawString("홍길동", 100, 350);
*/
g.drawString("[" + x + "," + y + "]", x, y);
}
}
PenguinMoveAPP (펭귄게임)
package xyz.itwill.swing;
public class PenguinMoveAPP extends JFrame {
private static final long serialVersionUID = 1L;
// 프레임의 폭과 높이를 지정한 상수
private static final int JFRAME_WODTH = 646;
private static final int JFRAME_HEIGHT = 461;
// 펭귄의 폭과 높이를 지정한 상수
private static final int PENGUIN_SIZE = 60;
// 배경이미지를 저장하기위한 필드
// Image 클래스 : 그림파일의 정보를 저장하기 위한 클래스
private Image backImage;
// 펭귄이미지를 저장하기 위한 플드 - 배열
private Image[] penguins;
// 펭귄이미지를 선택하기 위한 필드 - 배열 첨자
private int penguinNo;
// 펭귄이미지가 출력될 좌표값을 저장하기 위한 필드
private int penguinX, PenguinY;
public PenguinMoveAPP(String title) {
super(title);
// ImageIcon 클래스 : 그림파일 정보를 저장하기 위한 클래스
// > ImageIcon(URL location) : 그림파일의 URL 주소를 제공받아 ImageIcon 객체 생성
// Object.getClass() : 메모리에 저장된 현재 실행 클래스의 Class 객체를 반환하는 메소드
// Class.getResource(String name) : 현재 실행 클래스를 기준으로 리소스 파일을 읽어
// URL 객체를 반환하는 메소드
// ImageIcon.getImage() : ImageIcon 객체에 저장된 그림파일의 Image 객체를 반환하는 메소드
// 배경이미지 파일을 읽어 배경 이미지를 필드에 저장
backImage = new ImageIcon(getClass().getResource("/images/back.jpg")).getImage();
//penguinNo = 0;
// 펭귄이미지 파일을 읽어 필드(배열) 요소에 저장
penguins = new Image[3];
for(int i = 0; i < penguins.length; i++) {
penguins[i]=new ImageIcon(getClass().getResource("/images/penguin"+(i+1)+".gif")).getImage();
}
// penguinNo=0;
// 펭귄이미지가 출력될 좌표값을 계산하여 저장
penguinX = JFRAME_WIDTH/2 - PENGUIN_SIZE/2;
penguinY = JFRAME_HEIGHT - PENGUIN_SIZE;
setResizable(false);
//프레임에서 키보드 관련 이벤트가 발생될 경우 이벤트 처리 객체를 사용하여 이벤트 처리
addKeyListener(new PenguinMoveHandle());
setDefaultCloseOperation(EXIT_ON_CLOSE);
//setBounds(700, 200, 646, 461);
setBounds(700, 200, JFRAME_WIDTH, JFRAME_HEIGHT);
setVisible(true);
}
public static void main(String[] args) {
new PenguinMoveApp("펭귄 이동");
}
@Override
public void paint(Graphics g) {
//Graphics.drawImage(Image image, int x, int y, int width, int height, ImageObserver observer)
// > 이미지를 출력하는 메소드
g.drawImage(backImage, 0, 0, JFRAME_WIDTH, JFRAME_HEIGHT, this);
g.drawImage(penguins[penguinNo], penguinX, penguinY, PENGUIN_SIZE, PENGUIN_SIZE, this);
}
public class PenguinMoveHandle extends KeyAdapter {
// 키보드를 누르고 있는 경우 호출되는 메소드
@Override
public void keyPressed(KeyEvent e) {
// KeyEvent.getKeyCode() : 이벤트가 발생된 키보드의 고유값을 반환하는 메소드
int keyCode=e.getKeyCode();
switch(keyCode) {
case KeyEvent.VK_LEFT:
penguinX -= 10;
if(penguinX <= 0) {
penguinX = 0;
}
penguinNo++;
penguinNo%=3;
repaint();
break;
case KeyEvent.VK_RIGHT:
penguinX += 10;
if(penguinX >= JFRAME_WIDTH-PENGUIN_SIZE) {
penguinX = JFRAME_WIDTH-PENGUIN_SIZE;
}
penguinNo++;
penguinNo %= 3;
repaint();
break;
}
}
}
}