스윙 컴포넌트

package ch11;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JComponentEx extends JFrame {
	
	private JButton b1, b2, b3;
	
	
	public JComponentEx(){
		setTitle("JComponent의 공통 메소드 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		b1 = new JButton("Magenta/Yellow Button");
		b2 = new JButton("___Disabled Button___");
		b3 = new JButton("getX(), getY()");
		
		b1.setBackground(Color.YELLOW); // 백그라운드
		b1.setForeground(Color.MAGENTA); // 포그라운드
		b1.setFont(new Font("Arial", Font.ITALIC, 20));
		b2.setEnabled(false);
		b3.addActionListener(new ActionListener() {
			
			//타겟 (콜백되는)
			@Override
			public void actionPerformed(ActionEvent e) {
				//JButton b = (JButton)e.getSource(); // Object를 리턴하기 때문에 다운캐스팅!!
				b3.setText("hello");
				//JComponentEx frame = (JComponentEx)b.getTopLevelAncestor();
				//frame.setTitle(b.getX() + "," + b.getY());
			}
		});
		
		c.add(b1); c.add(b2); c.add(b3);
		
		setSize(260, 200);
		setVisible(true);
		
		
		
	}
	
	public static void main(String[] args) {
		new JComponentEx();
	}
}

 

여러 버튼에 같은 리스너 적용

package ch11;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JComponentEx01 extends JFrame implements ActionListener{

	private JButton b1, b2, b3;
	
	// 타겟
	@Override
	public void actionPerformed(ActionEvent e) {
		JButton b = (JButton) e.getSource();
		b.setText("Hello");
	}
	
	public JComponentEx01() {
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		b1 = new JButton("b1");
		b2 = new JButton("b2");
		b3 = new JButton("b3");
		
		b1.addActionListener(this);
		b2.addActionListener(this);
		b3.addActionListener(this);
		
		c.add(b1);
		c.add(b2);
		c.add(b3);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(260, 200);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new JComponentEx01();
	}

}

.

다양한 시간 포맷팅 방법

package dateex;

import java.util.Calendar;

public class CalenderEx {
	// 2020-03-18
	public static void printCalender(String msg, Calendar cal) {
		int year = cal.get(Calendar.YEAR); // 2020 
		
		int month = cal.get(Calendar.MONTH) + 1; // 1월은 0으로 나온다. 그래서 +1해줘야함
		String mon = (month < 10)?"0" + month:"" + month;
		
		int day = cal.get(Calendar.DAY_OF_MONTH);
		String day1 = (day < 10)?"0" + day:"" + day;
		
		int hour = cal.get(Calendar.HOUR_OF_DAY);
		String hour1 = (hour < 10)?"0" + hour:"" + hour;
		
		int minute = cal.get(Calendar.MINUTE);
		String minute1 = (minute < 10)?"0" + minute:"" + minute;
		
		int second = cal.get(Calendar.SECOND);
		String second1 = (second < 10)?"0" + second:"" + second;
		
		System.out.println(msg + " " + year+"-"+mon+"-"+day+":"+hour1+":"+minute1+":"+second1);
		
	}
	
	public static void main(String[] args) {
		Calendar a = Calendar.getInstance(); // 싱글톤
		
		printCalender("현재", a);
	}
}

 

Calender

 

java.util.Date

getDay()의 빨간줄은 더 이상 사용하지 말라는 뜻(유예를 주는 것)

 

java.sql.Date

 

 

java.sql.Timestamp

 

LocalDate

 

자바에서 시간을 만들어서 DB에 넣는 것이 IO가 줄어들어서 빠르게 작동한다

HashSet // TreeSet

package dateex;

import java.util.HashSet;
import java.util.Random;

public class Lotto {
	public static void main(String[] args) {
		
		
		// HashSet 순서가 없음 (엄청빠름)
		// TreeSet 순서대로 정렬 (HashSet보다 느림)
		HashSet<Integer> lotto = new HashSet<>();
		Random r = new Random();
		
		while (lotto.size() < 6) {
			int value = r.nextInt(45) + 1;
			lotto.add(value);
		}

		System.out.println(lotto);
		
	}
}

.

StringTokenizer

package dateex;

import java.util.StringTokenizer;

public class StringTokenizer1 {
	public static void main(String[] args) {
		
		StringTokenizer st = new StringTokenizer("a=3,b=5,c=6", ","); // 구분자로 ',' 사용
		
		while (st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}
		
	}
}

.

------------------------------

클래스 구성
1. 멤버변수
2. 생성자 메서드
3. 일반 메서드
4. 내부 클래스

------------------------------

생성자의 역할

멤버변수에 대한 초기화

------------------------------

메서드의 역할

 

------------------------------

스태틱 메서드를 쓰는 이유

프로그램에서 공통적으로 사용하는 기능

공유를 위함

스태틱 멤버변수를 쓰기 위하여 사용

------------------------------

try catch를 쓰는 이유

에러에는 컴파일에러 / 런타임에러가  있다

컴파일 에러는 코드 작성시에 고칠 수 있지만
런타임 에러는 미리 예측하기가 어렵다

예측하기 어려운 런타임 에러를 대응하기 위해
try catch를 사용한다

엄밀하게는 if문 등을 이용해서 예외를 없도록 만드는 것이 좋으나
자바는 예외처리가 필요한 기능은 무조건 try catch를 써야한다

------------------------------

입력

1. System -> 자바에서 System 클래스는 Console OS를 말한다 (System.in)
2. 파일 입출력
3. 네트워크 입출력

------------------------------

ip 는 네트워크의 주소다 (랜카드 기준)

맥어드레스 - 랜카드의 고유한 번호

여러 아이피를 쓰려면 랜카드를 여러개 꽂으면 된다

------------------------------

드라이버

컴퓨터는 여러회사의 부품이 섞여있다.

그러므로 운영체제가 모든 하드웨어의 정보를 알 수 없다.
드라이버를 설치하면 운영체제가 하드웨어를 제어할 수 있게 된다.

자바에서도 마찬가지다.

자바에 오라클DB에 대한 드라이버를 설치하면
자바에서 오라클DB를 연동해서 사용할 수 있다. 

DB를 위한 자바클래스
1.Connection -> 연결
2.Statement -> 질의
3.ResultSet -> 응답 (결과 집합)

받아온 데이터를 String으로 변환

sql디벨로퍼의 폴더 안에 ojdbc.jar 를 찾는다

+ 자바 lib폴더에 넣고 빌드패스

 

'Programming Language > Java' 카테고리의 다른 글

자바 HashSet // TreeSet  (0) 2020.04.24
자바 StringTokenizer  (0) 2020.04.24
자바 그래프 만들기 (xml, json, gson, 공공데이터, SWING)  (0) 2020.04.22
자바 SWING 리스너  (0) 2020.04.22
20200421  (0) 2020.04.21

 

package jang;

import java.awt.Color;
import java.awt.Graphics;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

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

import com.google.gson.Gson;

import airplane.Air;
import org.json.XML;

public class Shrimp extends JFrame {

	int panelX = 400;
	int panelY = 180;
	
	// 공공데이터에서 받아온 값을 사용하기 위한 스태틱 변수
	static int aa = 0;
	static int bb = 0;
	static int cc = 0;
	
	static int a = 0;
	static int b = 0;
	static int c = 0;
	
	//패널 생성 및 그래프 그리기
	class MyPanel extends JPanel {

		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.BLACK);
			g.drawString("2019.10", (int) (panelX * (0.2)), (int) (panelY * (0.9)));
			g.drawString("2019.11", (int) (panelX * (0.4)), (int) (panelY * (0.9)));
			g.drawString("2019.12", (int) (panelX * (0.6)), (int) (panelY * (0.9)));

			g.setColor(Color.BLACK);
			g.drawString(Integer.toString(aa), (int) (panelX * (0.2)) + 10, (int) (panelY * (0.8) - a) - 10);
			g.drawString(Integer.toString(bb), (int) (panelX * (0.4)) + 10, (int) (panelY * (0.8) - b) - 10);
			g.drawString(Integer.toString(cc), (int) (panelX * (0.6)) + 10, (int) (panelY * (0.8) - c) - 10);

			g.setColor(Color.BLUE);
			g.fillRect((int) (panelX * (0.2)), (int) (panelY * (0.8) - a), 50, a);
			g.fillRect((int) (panelX * (0.4)), (int) (panelY * (0.8) - b), 50, b);
			g.fillRect((int) (panelX * (0.6)), (int) (panelY * (0.8) - c), 50, c);

		}
	}
	
	// 패널 인스턴스 생성
	private MyPanel mp = new MyPanel();
	
	// GUI생성자 
	public Shrimp() {
		setTitle("중국산 뱀장어(앵궐라종) 수입현황");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(mp); // 패널을 mp로 교체
		mp.setLayout(null); // 레이아웃을 absolute로 교체

		setSize(panelX, panelY + 30);
		setVisible(true);
	}

	public static String change(String date) throws Exception {
		// 1번 주소 객체 만들기
		URL url = new URL("주소 입력해야됨");

		// 2번 스트림 연결
		HttpURLConnection con = (HttpURLConnection) url.openConnection();

		// 3번 버퍼 연결 (문자열)
		BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
		
		// 4. 문자 더하기
		StringBuilder sb = new StringBuilder();
		
		String input = "";
		while ((input = br.readLine()) != null) {
			sb.append(input);
		}
		
		br.close(); // 버퍼 닫기
		con.disconnect(); // 스트림 닫기
		
		
		// XML을 JSON으로 변환 (org.json 이용)
		// https://github.com/stleary/JSON-java
		org.json.JSONObject jsonOb = XML.toJSONObject(sb.toString());
		String jsonString = jsonOb.toString();
		
		
		// 5. 자바 오브젝트로 변환
		Gson gson = new Gson();
		Jang jang = gson.fromJson(jsonString, Jang.class);
		
		// 수입량 리턴
		return jang.getResponseXml().getBody().getItem().get(0).getImxprtWt();
	}

	public static void main(String[] args) {
		
		// 3개월간의 수입량을 저장하기위한 어레이리스트
		ArrayList<String> amount = new ArrayList<>();
		
		try {
			// 월별 수입량을 리스트에 추가
			amount.add(change("201910"));
			amount.add(change("201911"));
			amount.add(change("201912"));

		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		// 월별 수입량 중 최대값 구하기
		double max = 0;
		double test = 0;
		for (String string : amount) {
			int i = Integer.parseInt(string);
			test = i;
			if(i > max) {
				max = i;
			}
		}
		
		
		// 스태틱 변수에 값 넘겨주기
		Shrimp.aa = Integer.parseInt(amount.get(0));
		Shrimp.bb = Integer.parseInt(amount.get(1));
		Shrimp.cc = Integer.parseInt(amount.get(2));
		
		Shrimp.a = (int)(Integer.parseInt(amount.get(0)) / max * 100);
		Shrimp.b = (int)(Integer.parseInt(amount.get(1)) / max * 100);
		Shrimp.c = (int)(Integer.parseInt(amount.get(2)) / max * 100);
		
		// GUI실행
		new Shrimp();
	}
}

 

버튼 클릭시 버튼 내용 바꾸기

package ch14;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;


// 외부 클래스로 리스너 타겟 생성
class MyActionListener implements ActionListener{
	
	@Override
	public void actionPerformed(ActionEvent e) {
		JButton b = (JButton) e.getSource();
		if (b.getText().equals("Action")) {
			b.setText("액션");
		} else {
			b.setText("Action");
		}
		
	}
}

public class EventEx011 extends JFrame {
	
	public EventEx011() {
		setTitle("Action 이벤트 리스너 예제");
		
		// x버튼 클릭시 이벤트 분배스레드 끄기
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		
		c.setLayout(new FlowLayout());
		
		JButton btn = new JButton("Action");
		
		// 리스너 생성
		btn.addActionListener(new MyActionListener());
		c.add(btn);
		setSize(350,150);
		setVisible(true);
	}

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


 

 

창 내에서 클릭시 라벨이 움직이도록 설정

package ch14;

import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class EventEx04 extends JFrame {
	
	private JLabel la; // new 는 생성자에서 하자
	
	public EventEx04() {
		la = new JLabel("Hello");
		setTitle("MouseEvent 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.addMouseListener(new MyMouseListener());
		c.setLayout(null); // absolute 레이아웃
		la.setSize(50, 20); // 라벨의 사이즈
		la.setLocation(30, 30); // 라벨의 위치
		c.add(la);
		setSize(250, 250);
		setVisible(true); // paint()
		
	}
	
	class MyMouseListener extends MouseAdapter{
		
		// 마우스를 클릭하고 놓았을 때
		@Override
		public void mousePressed(MouseEvent e) {
			int x = e.getX(); // x 좌표
			int y = e.getY(); // y 좌표
			la.setLocation(x, y); // 라벨 위치 변경
		}
	}

	public static void main(String[] args) {

		new EventEx04();

	}

}

 

창 내에서 클릭시 마우스가 흐르면서 움직이도록 만들기

package ch14;

import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class EventEx05 extends JFrame {

	private JLabel la; // new 는 생성자에서 하자
	int nowY = 0;
	Container c;

	public EventEx05() {

		la = new JLabel("Hello");
		setTitle("MouseEvent 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		c = getContentPane();
		c.addMouseListener(new MyMouseListener());
		c.setLayout(null); // absolute 레이아웃
		la.setSize(50, 20); // 라벨의 사이즈
		la.setLocation(30, 30); // 라벨의 위치
		c.add(la);
		setSize(250, 250);
		setVisible(true); // paint()

	}

	class MyMouseListener extends MouseAdapter {

		// 마우스를 클릭하고 놓았을 때
		@Override
		public void mousePressed(MouseEvent e) {
			int x = e.getX(); // x 좌표
			int y = e.getY(); // y 좌표
			nowY = la.getY();

			if (la.getY() < y) {
				new Thread(new Runnable() {
					@Override
					public void run() {
						while (la.getY() < y) {
							// setLocation은 repaint를 들고 있다
							la.setLocation(x, nowY + 1); // 라벨 위치 변경
							nowY = la.getY();

							try {
								Thread.sleep(10);
							} catch (InterruptedException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
						}
					}
				}).start();

			} else if (la.getY() > y) {
				new Thread(new Runnable() {

					@Override
					public void run() {
						while (la.getY() > y) {
							la.setLocation(x, nowY - 1); // 라벨 위치 변경
							nowY = la.getY();

							try {
								Thread.sleep(10);
							} catch (InterruptedException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
						}
					}
				}).start();
			}
		}
	}

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

 

 

더블클릭 리스너

package ch14;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class ClickAndDoubleClickEx extends JFrame {
	
	class MyMouseListener extends MouseAdapter{
		@Override
		public void mouseClicked(MouseEvent e) {
			if(e.getClickCount() == 2) { // 더블클릭의 경우
				int r= (int)(Math.random()*256);
				int g= (int)(Math.random()*256);
				int b= (int)(Math.random()*256);
				
				Component c = (Component)e.getSource(); // 마우스가 클릭된 컴포넌트
				c.setBackground(new Color(r,g,b));
			}
		}
	}
	
	public ClickAndDoubleClickEx() {
		setTitle("Click and DoubleClick 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		c.addMouseListener(new MyMouseListener());
		setSize(300, 200);
		setVisible(true);
	}
	
	
	public static void main(String[] args) {
		new ClickAndDoubleClickEx();
	}
}

 

 

키 리스너 구현 (키를 입력하면 아스키 코드 출력)

package ch14;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class KeyListenerEx extends JFrame {
	private JLabel[] keyMessage;

	public KeyListenerEx() {
		setTitle("keyListener");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c= getContentPane();
		c.setLayout(new FlowLayout());
		c.addKeyListener(new MyKeyListener());
		
		
		// 레이블배열을 3개 생성하고 각레이블 컴포넌트생성
		keyMessage = new JLabel[3]; // 레이블 배열 생성
		keyMessage[0] = new JLabel(" getKeyCode() ");
		keyMessage[1] = new JLabel(" getKeyCode() ");
		keyMessage[2] = new JLabel(" getKeyCode() ");
		
		// 3개의 레이블 컴포넌트를 컨텐트팬에 부착
		for (int i = 0; i < keyMessage.length; i++) {
			c.add(keyMessage[i]);
			keyMessage[i].setOpaque(true); // 배경색이 보이도록 불투명 속성 설정
			keyMessage[i].setBackground(Color.YELLOW);
		}
		
		setSize(300, 150);
		setVisible(true);
		
		// 컨텐트팬이 키입력을 받을 수 있도록 포커스 강제 지정
		c.setFocusable(true);
		c.requestFocus();
	}

	// key 리스너 구현
	class MyKeyListener extends KeyAdapter {
		@Override
		public void keyPressed(KeyEvent e) {
			int keyCode = e.getKeyCode();
			char keyChar = e.getKeyChar();
			keyMessage[0].setText("아스키코드 : " + Integer.toString(keyCode));
			keyMessage[1].setText("char : " + Character.toString(keyChar));
			keyMessage[2].setText(KeyEvent.getKeyText(keyCode));

			System.out.println("KeyPressed");
		}

		@Override
		public void keyReleased(KeyEvent e) {
			System.out.println("keyReleased");
		}

		@Override
		public void keyTyped(KeyEvent e) {
			System.out.println("KeyTyped");
		}

	}

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

}

 

사각형 그리기

package ch14;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

import ch14.EventEx06.MyPanel;

public class PaintJPanelEx extends JFrame {
	class MyPanel extends JPanel{
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.BLUE);
			g.drawRect(10, 10, 50, 50);
			g.drawRect(50, 50, 50, 50);
			g.setColor(Color.MAGENTA);
			g.drawRect(90, 90, 50, 50);
		}
	}
	
	
	private MyPanel panel = new MyPanel();
	
	public PaintJPanelEx() {
		setTitle("JPanel의 paintComponent() 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(panel);
		setSize(250, 220);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new PaintJPanelEx();
	}
}

 

선긋기

package ch14;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class GraphicsDrawLineEx extends JFrame {
	class MyPanel extends JPanel{
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.RED);
			g.drawLine(20, 20, 100, 100);
		}
	}
	
	private MyPanel panel = new MyPanel();
	
	public GraphicsDrawLineEx() {
		setTitle("drawLine 사용 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(panel);
		
		setSize(200, 170);
		setVisible(true);
	}
	
	
	public static void main(String[] args) {
		new GraphicsDrawLineEx();
	}
}

 

다양한 도형 그리기

package ch14;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class GraphicsFillEx extends JFrame {
	class MyPanel extends JPanel {
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.RED);
			g.fillRect(10, 10, 50, 50);
			g.setColor(Color.BLUE);
			g.fillRect(10, 70, 50, 50);
			g.setColor(Color.GREEN);
			g.fillRoundRect(10, 130, 50, 50, 20, 20);
			g.setColor(Color.MAGENTA);
			g.fillArc(10, 190, 50, 50, 0, 270);
			g.setColor(Color.ORANGE);
			int[] x = {30,10,30,60};
			int[] y = {250,275,300,275};
			g.fillPolygon(x,y,4);
		}
	}
	
	private MyPanel panel = new MyPanel();
	
	public GraphicsFillEx() {
		setTitle("fillXXX 사용 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(panel);
		
		setSize(100, 350);
		setVisible(true);
	}

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

 

 

 

 

 

paintComponent()

- 컴포넌트가 처음으로 그려질 때
- 컴포넌트의 크기나 위치 변경 등 컴포넌트에 변화가 생길 때
- 다른 윈도우에 의해 가려졌다가 드러날 때
- 아이콘화되었다가 본래 크기로 복구할 때
- 응용프로그램이 컴포넌트의 repaint() 메소드를 호출하여 강제로 다시 그릴 때

JFrame에서는 paintComponent()가 먹히지 않는다

 

setLocation()
setText() 등은 repaint()를 들고있다

 

이벤트 분배 스레드는 repaint를 한번만 하도록 되어있다

package ch14;

import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class EventEx05 extends JFrame {

	private JLabel la; // new 는 생성자에서 하자
	int nowY = 0;
	Container c;

	public EventEx05() {

		la = new JLabel("Hello");
		setTitle("MouseEvent 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		c = getContentPane();
		c.addMouseListener(new MyMouseListener());
		c.setLayout(null); // absolute 레이아웃
		la.setSize(50, 20); // 라벨의 사이즈
		la.setLocation(30, 30); // 라벨의 위치
		c.add(la);
		setSize(250, 250);
		setVisible(true); // paint()

	}

	class MyMouseListener extends MouseAdapter {

		// 마우스를 클릭하고 놓았을 때
		@Override
		public void mousePressed(MouseEvent e) {
			int x = e.getX(); // x 좌표
			int y = e.getY(); // y 좌표
			nowY = la.getY();

			if (la.getY() < y) {
				new Thread(new Runnable() {
					@Override
					public void run() {
						while (la.getY() < y) {
							// setLocation은 repaint를 들고 있다
							la.setLocation(x, nowY + 1); // 라벨 위치 변경
							nowY = la.getY();

							try {
								Thread.sleep(10);
							} catch (InterruptedException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
						}
					}
				}).start();

			} else if (la.getY() > y) {
				new Thread(new Runnable() {

					@Override
					public void run() {
						while (la.getY() > y) {
							la.setLocation(x, nowY - 1); // 라벨 위치 변경
							nowY = la.getY();

							try {
								Thread.sleep(10);
							} catch (InterruptedException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
						}
					}
				}).start();
			}
		}
	}

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

 

 

 

 

 

 

 

 

+ Recent posts