본문 바로가기

3월 ~ 5월) 자바/java

19Day - EventSourceHandleApp or EventInnerHandleApp + EventAnnoymousHandleApp / WindowListenerApp or WindowAdapterApp / EventSourceGetApp / SwingApp / DigitalClockApp / JTableApp / PaintApp /PenguinMoveAPP

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("이벤트처리");
        }
    }

EXIT 클릭하면 종료됨.

 


 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);
		}
	}
	*/

}

 

X클릭하면 닫혀짐

 


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 발생

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 컴퍼넌트");
    }
}

표로 작성됨. (x누르면 실행종료)


 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;
            }
        }
    }
}