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

 

 

 

 

 

 

 

 

GUI - 윈도우와 같이 그림으로 이루어진 인터페이스

CLI - DOS와 같이 글자를 입력하는 인터페이스

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

Z인덱스

최상위 컨테이너

웹브라우저에서 경고창이 뜨면 경고창이 최상위 컨테이너가된다

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

SWING

SWING은  AWT와 달리 순수 자바 언어로 작성되었다.

스윙은 AWT에 구현된 이벤트 처리나 GUI 컴포넌트의 기본 원리를 바탕으로 작성되었기 때문에,

스윙을 사용하기 위해 AWT패키지가 필요하다.

 

SWING을 배워두면 안드로이드도 배우기 쉬워진다

 

모니터 자체를 창(window) - OS관할

그안의 화면 전체를 도화지(canvas)

도화지의 좌측최상단을 X = 0 , Y = 0

각각의 좌표값을 픽셀이라고한다

 

SWING의 기본 레이아웃은 border레이아웃

border안에 panal을 넣어서 플로우를 그 안에 넣어서 위치를 정한다

 

GUI 컴포넌트들은 다른 컴포넌트를 포함할 수 있는지 여부에 따라 순수 컴포넌트와 컨테이너로 분류된다.

컨테이너란 다른 GUI 컴포넌트를 포함할 수 있는 컴포넌트이다.

최상위 컨테이너는 JFrame, JDialog, JApplet이 있다

 

컴포넌트 (위젯)

Button, TextField, TextArea 등

자주쓰는 기능 (버튼 등)은 재사용을 하기 위해 미리 클래스화 하여 만들어 놓는 것

특징 - 이벤트가 달려있다 (클릭이나 건들였을 때 반응이 일어나도록 하는 것)

변형을 주고 싶으면 상속을 받아서 오버라이딩 하여 사용한다

컴포넌트는 컨테이너 안에서 존재 할 수 있다

 

컨테이너

컨테이너는 컴포넌트를 포함 할 수 있는 컴포넌트를 말한다

자바의 컨테이너는 Frame, Panel, Scrollpane

HTML의 BODY는 컨테이너, 도화지 역할

자바의 Frame은 HTML의 BODY와 같은 역할

자바의 panel은 HTML의 DIV역할

 

이벤트

컴포넌트를 건들이는 것을 알아차리는 주체는 OS이다

알아차린 OS의 리스너는 우리에게 Callback해준다

Callback시 context(해당 컴포넌트가 가진 모든 정보)를 돌려준다 

자바 이벤트분배스레드(Queue)는 context를 가지고 있다

리스너 - OS - 자바 이벤트분배스레드(Queue)

 

ex)
1.사용자가 마우스로 화면의 버튼을 클릭한다

2.이벤트 분배 스레드에게 마우스 클릭에 관한 정보를 보낸다

3.이벤트 분배 스레드는 이벤트 객체를 생성한다
이벤트 객체는 이벤트에 관한 여러 정보(context)를 담은 객체이다
이벤트 객체 내의 이벤트 소스는 위에서 클릭한 버튼자체이다

4.이벤트 분배 스레드는 타겟을 호출한다

 

 

 

 

커스터마이징

 

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

Paint

setVisible시 그림을 그려줌

 

RePaint

setVisible상태에서 다른 것을 입력하거나 화면을 바꾸게 되면

RePaint로 해당 컴포넌트만 다시 그린다

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

1. 컨테이너 vs 컴포넌트

2. 레이아웃 4가지

3. 스윙 동작 구조

4. 리스너 등록 3가지 방법
    - 익명 클래스 만들기
    - 클래스 만들기(내부, 외부)
    - this

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

리스너 등록 3가지 방법

1. - 익명 클래스 만들기

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;


// 익명 클래스로 타겟 생성
public class EventEx01 extends JFrame {
	
	public EventEx01() {
		setTitle("Action 이벤트 리스너 예제");
		
		// x버튼 클릭시 이벤트 분배스레드 끄기
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		
		c.setLayout(new FlowLayout());
		
		JButton btn = new JButton("Action");
		
		// 리스너 생성
		btn.addActionListener(new ActionListener() {
			
			// 타겟 (이벤트 분배 스레드가 콜백)
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("버튼클릭됨");
				
				// e는 context, e.getSource()는 이벤트 소스
				JButton b = (JButton) e.getSource();
				System.out.println(b.getText());
				b.setText("액션"); // RePaint()
			}
		});
		c.add(btn);
		setSize(350,150);
		setVisible(true);
	}

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

 

2. 클래스 만들기(내부, 외부)

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


 

3. this

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;


// 메인 클래스에 ActionListener를 구현하고 this로 객체를 리스너의 타겟으로 만든다
public class EventEx012 extends JFrame implements ActionListener {
	
	public EventEx012() {
		setTitle("Action 이벤트 리스너 예제");
		
		// x버튼 클릭시 이벤트 분배스레드 끄기
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		
		c.setLayout(new FlowLayout());
		
		JButton btn = new JButton("Action");
		
		// 리스너 생성
		btn.addActionListener(this);
		c.add(btn);
		setSize(350,150);
		setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("버튼 클릭됨");
	}
	
	public static void main(String[] args) {
		EventEx012 ex012 = new EventEx012();
	}
}


 

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

Frame

 

AWT는 아무것도 하지 않으면 프레임만 있는데
SWING은 기본적으로 프레임 안에 패널이 하나 들어가 있다

기본적으로 SWING은 border속성이기때문에 설정을 안해주면 버튼이
화면을 꽉 채운다 

 

플로우 레이아웃을 생성하고 그 곳에 버튼을 넣으면 아래와 같이 나온다

현재 X버튼을 눌러도 창만 꺼질 뿐 프로그램 자체는 꺼지지 않는 상태이다

 

X버튼 설정, FlowLayout

 

 

 

 

 

WindowBuilder (SWING 대신)

 

 

 

 

 

 

next next accept

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

자바 SWING 리스너  (0) 2020.04.22
20200421  (0) 2020.04.21
자바 문자 보내기  (0) 2020.04.17
자바 String, StringBuilder, StringBuffer  (0) 2020.04.17
자바 GUI  (0) 2020.04.17

 

COOLSMS 서비스에 가입하고 API 또는 SDK를 사용하여 문자를 보내본다

 

SDK 중 자바 코드를 다운로드

 

 

ZIP파일을 풀어서 IDE의 라이브러리 폴더에 넣고 빌드패스를 해준다

 

사이트의 EXAMPLE을 보고 복붙하여 조금만 수정하면 사용이 가능하다

 

 

package sms;

import java.util.HashMap;
import org.json.simple.JSONObject;
import net.nurigo.java_sdk.api.Message;
import net.nurigo.java_sdk.exceptions.CoolsmsException;

/**
 * @class ExampleSend
 * @brief This sample code demonstrate how to send sms through CoolSMS Rest API PHP
 */

// Message 객체 생성하여 send 메서드 사용하면 됨
public class ExampleSend {
  public static void main(String[] args) {
    String api_key = "";
    String api_secret = "";
    Message coolsms = new Message(api_key, api_secret);

    // 4 params(to, from, type, text) are mandatory. must be filled
    HashMap<String, String> params = new HashMap<String, String>();
    params.put("to", "");
    params.put("from", "");
    params.put("type", "LMS");
    params.put("text", "나의 첫번째 메시지 전송 프로그램 테스트");
    params.put("app_version", "test app 1.2"); // application name and version

    try {
      JSONObject obj = (JSONObject) coolsms.send(params);
      System.out.println(obj.toString());
    } catch (CoolsmsException e) {
      System.out.println(e.getMessage());
      System.out.println(e.getCode());
    }
  }
}

 

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

20200421  (0) 2020.04.21
자바 SWING, WindowBuilder  (0) 2020.04.20
자바 String, StringBuilder, StringBuffer  (0) 2020.04.17
자바 GUI  (0) 2020.04.17
오라클 SQL 문제 및 정답 / 상관쿼리, DML  (0) 2020.04.17

 

package simple;

public class Stringtest {
	
	// 배열 아님
	String str;
	
	// 스트링 배열
	String[] strArr;
	
	// 스트링을 배열로 저장해서 하나로 출력 동시접근가능
	StringBuilder sb;
	
	// 스트링을 배열로 저장해서 하나로 출력하고 동시접근 불가(임계구역)
	StringBuffer sbf;
}

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

자바 SWING, WindowBuilder  (0) 2020.04.20
자바 문자 보내기  (0) 2020.04.17
자바 GUI  (0) 2020.04.17
오라클 SQL 문제 및 정답 / 상관쿼리, DML  (0) 2020.04.17
자바 채팅 프로그램2  (0) 2020.04.14

CLI : 윈도우 cmd창, git창 같은 것

GUI : 그래픽 유저 인터페이스

자바 GUI

AWT
- 버튼과 메뉴 등을 OS의 디자인을 빌려와서 사용
- 운영체제에 따라 화면이 달라진다

SWING
- 자바 자체디자인

X버튼에 대한 기능을 만들지 않았으므로 콘솔창에서 종료해야한다

 

 

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

자바 문자 보내기  (0) 2020.04.17
자바 String, StringBuilder, StringBuffer  (0) 2020.04.17
오라클 SQL 문제 및 정답 / 상관쿼리, DML  (0) 2020.04.17
자바 채팅 프로그램2  (0) 2020.04.14
자바 finally  (0) 2020.04.14

문제

 

-- 박지성이 구매한 도서의 출판사와 같은 출판사에서 도서를 구매한 고객의 이름
SELECT DISTINCT C.NAME
FROM customer C, ORDERS O, BOOK B
WHERE c.custid = o.custid 
        AND o.bookid = b.bookid 
        AND b.publisher IN (
                            SELECT b.publisher
                            FROM customer C, ORDERS O, BOOK B
                            WHERE c.custid = o.custid AND o.bookid = b.bookid AND C.NAME = '박지성')
        AND C.NAME NOT LIKE '박지성';


-- 두 개 이상의 서로 다른 출판사에서 도서를 구매한 고객의 이름
SELECT C.NAME, COUNT(DISTINCT b.publisher)
FROM customer C, ORDERS O, BOOK B
WHERE c.custid = o.custid AND o.bookid = b.bookid
GROUP BY C.NAME
HAVING COUNT(DISTINCT b.publisher) >= 2;


-- 두 개 이상의 서로 다른 출판사에서 도서를 구매한 고객의 이름 - 상관쿼리
-- GROUP BY 를 사용한 쿼리는 상관쿼리로 바꿀 수 있다
    SELECT C1.NAME
    FROM customer C1 -- 하위쿼리에 C.NAME LIKE C1.NAME 이렇게 연결하면 GROUP BY를 안쓰고도 그룹함수를 쓸 수 있다.
    WHERE 2 <= (SELECT COUNT(DISTINCT B.PUBLISHER)
                FROM customer C, ORDERS O, BOOK B
                WHERE c.custid = o.custid AND o.bookid = b.bookid AND C.NAME = C1.NAME);


-- 전체 고객의 30% 이상이 구매한 도서
SELECT b.bookname, COUNT(b.bookname)
FROM ORDERS O, BOOK B
WHERE o.bookid = b.bookid
GROUP BY b.bookname
HAVING COUNT(b.bookname) >= (
                            SELECT (COUNT(*) * 0.3)
                            FROM customer
                            );
                        
                        
-- 전체 고객의 30% 이상이 구매한 도서 - 상관쿼리
SELECT B1.BOOKNAME
FROM BOOK B1
WHERE (SELECT COUNT(b.bookname)
        FROM ORDERS O, BOOK B
        WHERE o.bookid = b.bookid AND B.BOOKID = B1.BOOKID) >= ( SELECT (COUNT(*) * 0.3) FROM customer);


--새로운 도서 ('스포츠 세계', '대한미디어', 10000원)이 마당서점에 입고되었다. 삽입이 안될 경우 필요한 데이터가 더 있는지 찾아보자
-- PRIMARY KEY 가 필요함 31로 임의 삽입
INSERT INTO book(BOOKID, BOOKNAME, PUBLISHER, PRICE)
VALUES(31, '스포츠 세계', '대한미디어', 10000);


-- '삼성당'에서 출판한 도서를 삭제해야 한다
DELETE FROM BOOK
WHERE publisher = '삼성당';


-- '이상미디어'에서 출판한 도서를 삭제해야 한다. 삭제가 안 될 경우 원인을 생각해보자
DELETE FROM BOOK
WHERE publisher LIKE '이상미디어'; -- 자식 레코드가 있어서 삭제불가


--출판사 '대한미디어'가 '대한출판사'로 이름을 바꾸었다.
UPDATE book
SET publisher = '대한출판사' -- 값을 넣는것이기 때문에 LIKE쓰면 안된다
WHERE publisher LIKE '대한미디어'; -- 비교하는 것이기 때문에 LIKE써도 된다

 

 

 

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

자바 String, StringBuilder, StringBuffer  (0) 2020.04.17
자바 GUI  (0) 2020.04.17
자바 채팅 프로그램2  (0) 2020.04.14
자바 finally  (0) 2020.04.14
자바 채팅 프로그램  (0) 2020.04.14

+ Recent posts