190508_Day21 복습

<스레드>

  • 프로세스내에서 순차적으로 동작하는 문장들의 단일집합(메소드)

  • 사용이유? 하나의 응용프로그램내에서 독립적으로 동시 실행(기다리지 않는) 하는 기능이 존재

  • 구현방법) 클래스 Thread, 인터페이스 Runnable

    class MyThread1 extends Thread { public void member() { Thread.start(); //혹은 start(); Thread내부니까 } public void run() //스레드 메소드 { //동시실행할 문장들 } } class Mythread2 implements Runnable { public void run() //스레드 메소드 { //동시실행할 문장들 } public void member() { Thread t = new Thread(this); t.start(); // new Thread(this).start(); } }
  • 호출방법) run()메소드를 직접 호출하는것이 아님!

    • start()메소드에게 위임해야 함! (thread 클래스 밑에 있음)

  • 문제) 위의 두개의 run()메소드를 start()를 통해 호출하시오!

    MyThread1 m1 = new MyThread1(); //스레드객체 MyThread2 m2 = new MyThread2(); //Runnable객체 m1.start(); //됨 m2.start(); //안됨
    • 스레드 객체를 별도로 반드시 생성!

    • Thread t = new Thread(Runnable객체의 위치);

    • Thread t = new Thread (m2);

    • t.start();

    • 위의 코드를 줄여서 : new Thread(m2).start();

package j0508; class MyThread extends Thread{ public MyThread(String name) { super(name); // 이렇게 안하면 이름 출력되지 않는다. new Thread(String name); 을 호출한것 } //스레드 특징 메소드 ---> run : start()메소드를 통해 호출해야 동시 실행이 가능!! public void run() { try { for(int i=1; i<11; i++) { Thread.sleep(500);//0.5초 대기 System.out.println(getName()+" : "+ i); } } catch (InterruptedException e) { e.printStackTrace(); } }//run } public class ThreadTest2 { public static void main(String[] args) { //스레드의 기본이름 : Thread-0 Thread-1 Thread-2 //스레드에 이름 부여하기!! MyThread t1 = new MyThread("비키스레드"); MyThread t2 = new MyThread("진주스레드"); MyThread t3 = new MyThread("용진스레드"); //스레드 우선 순위 부여 (1~10) 10:가장 높고, 기본값은 5 t2.setPriority(Thread.MAX_PRIORITY); t3.setPriority(Thread.MIN_PRIORITY); t1.setPriority(Thread.NORM_PRIORITY); t1.start(); t2.start(); t3.start(); } }

    • TVContribution.java => 방송국(main)

    • Customer.java => 경쟁적인 모금자(스레드)

    • Account.java => 모금함(저금통)

    package j0508; public class TVContribution { public static void main(String[] args) //모금자 5명을 모집 { Account account = new Account(); // Customer c1 = new Customer(account); // Customer c2 = new Customer(account); // Customer c3 = new Customer(account); // Customer c4 = new Customer(account); // Customer c5 = new Customer(account); //c1부터 c5까지는 Thread객체 //1차원 배열 객체생성식 : 자료형 []배열명 = new 자료형[배열크기]; Customer[] customers = new Customer[5]; // customers = {null, null, null, null, null}; for(int i = 0; i < customers.length; i++) { customers[i] = new Customer(account); } //모금 시작 for (int i = 0; i < customers.length; i++) { // c1.start(); == customers[0].start(); customers[i].start(); // 스레드 시작 } //실행한 스레드가 종료할때까지 return 기다리자! try { for (int i = 0; i < customers.length; i++) { customers[i].join(); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("총 모금액 : " + account.getTotal()); } }package j0508; public class Customer extends Thread//모금자 (스레드 - 경쟁적인) { Account account; public Customer(Account account) { this.account = account; } @Override public void run() { try { for( int i = 1; i <= 200; i++ ) { Thread.sleep(50);//0.05초 간격 account.deposit(1000); //모금 System.out.println(getName() + " : " + i + "회" ); if(account.getTotal() >= 500000) { break; } }//for } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }package j0508; public class Account // 모금함(저금통) { private int total; public synchronized void deposit(int account) { total += account; /* * LOAD total * ADD account * SAVE total * * 동기화 (Synchronized) * -메소드 동기화 * (메소드에 진입한 스레드가 있을 경우 다른 스레드들은 대기(LOCK)하게 하는 역할) * -블럭 동기화 ( 특정영역 동기화 ) * synchronized(동기화객체){} * * 예) synchronized(this) * { * total += account; * } 도 가능 */ } public int getTotal() { return total; } }package j0508; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; public class MoveThreadTest extends JFrame implements ActionListener, Runnable{ JLabel la; JButton bt_start,bt_stop; int x,y; Thread t1; boolean start;//기본값 false; public MoveThreadTest() { setTitle("진주푸푸가 움직인다고?!"); ImageIcon icon = new ImageIcon("src/image/jin.png"); bt_start = new JButton("시작"); bt_stop = new JButton("정지"); la = new JLabel(icon); //bt_start.setBounds(x, y, width, height); bt_start.setBounds(20,420, 80,30); bt_stop.setBounds(120,420, 80,30); la.setBounds(x, y, 80, 70); setLayout(null); add(bt_start); add(bt_stop); add(la); setBounds(200,200, 500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); bt_start.addActionListener(this); bt_stop.addActionListener(this); }//생성자 public void run() { //값 이동 // la.setLocation(5,0,56,56); try { while(true) { if(!start)break; System.out.println(x); if(x<=400) { x+=5; la.setLocation(x,0); Thread.sleep(20); }else if(y<=400) { y+=5; la.setLocation(x,y); Thread.sleep(20); } } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e) { Object ob = e.getSource(); if(ob==bt_start) { start=true; t1 = new Thread(this); t1.start(); }else if(ob == bt_stop) { start=false; // t1.stop(); } } public static void main(String[] args) { new MoveThreadTest(); } }

 


 

  • java.net.*;

    <InetAddress>

    • IP주소를 다루기 위한 클래스 XXX.XXX.XXX.XXX XXX: 0~255

    주요메소드) byte[] getAddress() static InetAddress[] getAllByName(String host) static InetAddress getByName(String host) String getHostAddress() String getHostName() <URL> Uniform Resource Location

    http://www.gildong.co.kr:80/test/hello.jsp?name=gildong&age=13&job=student#index1

    프로토콜: 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약(http) 호스트명: 자원을 제공하는 서버의 이름 www.gildong.co.kr 포트번호: 통신에 사용되는 서버의 포트번호 80 경로명: 접근하려는 자원이 저장된 서버상의 위치 /test/ 파일명: 접근하려는 자원의 이름 hello.jsp 쿼리(query): URL에서 '?'이후의 부분 name=gildong&age=13&job=student 참조(anchor): URL에서 #이후의 부분

    <URLConnection>

    • 어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 클래스

    • URLConnection을 사용해서 연결하고자 하는 자원에 접근하고 읽고 쓰기를 할 수 있다.

package j0508; import java.io.BufferedReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.MalformedURLException; import java.net.URL; public class URLTest { public static void main(String[] args) { String total = null; try { URL url = new URL("https://www.naver.com/index.html"); System.out.println("프로토콜 : " + url.getProtocol()); System.out.println("호스트 : " + url.getHost()); System.out.println("서비스파일 : " + url.getFile()); InputStream is = url.openStream(); //웹소스 읽기 => 화면 콘솔 출력 BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); String str; while((str = br.readLine()) != null) { total += str; } FileWriter fw = new FileWriter("C:\\Users\\Playdata\\Documents\\test.html"); fw.write(total); fw.close(); //미션) 읽어드린 웹소스를 파일(test.html)로 저장하고 // 탐색기에서 'test.html'을 더블클릭해서 해당 사이트를 접속하시오 //파일 생성 => File //폴더(디렉토리) 생성=> } catch (MalformedURLException e) { System.out.println("잘못된 주소입니다. 다시 한번 확인 해주세요"); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

이렇게 하면 깨지니

아래 처럼 해야 한다.

package com.encore.j0508; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.MalformedURLException; import java.net.URL; public class URLTest { public static void main(String[] args) { try { URL url = new URL("https://www.naver.com/index.html"); System.out.println("프로토콜: "+ url.getProtocol()); System.out.println("호스트: "+ url.getHost()); System.out.println("서비스파일명: "+ url.getFile()); InputStream is = url.openStream(); //웹소스 읽기 ----------> 화면 콘솔 출력 BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8") ); String str; // while( (str=br.readLine()) != null ) { // System.out.println(str); // } //미션) 읽어들인 웹소스를 파일(test.html)로 저장하고 // 탐색기에서 'test.html'을 더블클릭해서 해당 사이트를 접속하시오. //파일생성 ==> FileOutputStream, FileWriter //폴더(디렉토리)생성==> File //FileWriter fw = new FileWriter("test.html"); ---> 문자집합 설정X //new OutputStreamWriter(OuputStream out, String charsetName) FileOutputStream fos = new FileOutputStream("test.html"); OutputStreamWriter osw = new OutputStreamWriter(fos , "UTF-8"); while( (str=br.readLine()) != null ) { //fw.write(str); osw.write(str); } //fw.close(); osw.close(); System.out.println("파일(test.html)생성 성공!!"); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }//main }


190507 복습, 스레드


<데이터 읽고 쓰는 Target과 자료형의 종류!>

  1. (화면) 콘솔

    • 읽기

      • int asciiNum = System.in.read();

      • String str = br.readLine();

      • pulbic class System
        {
            pulbic static InputStream in;
            pulbic static PrintStream out;
            pulbic static PrintSream err;
        }
      • BufferedReader br;

      • BufferdReader생성자

        • BufferedReader ( Reader객체 ){}
      • br = new BufferdReader( new InputStreamReader(System.in) );

        • System.in 이 키보드 입력을 받고
        • InputStreamReader 에서 바이트스트림 => 문자 단위로 변환
        • BufferdReader 에서 변환된 문자들을 버퍼에 저장!
    • 쓰기

      • System.out.println(데이터);
      • System.out.print(데이터);
      • System.out.printf(데이터);
  2. JTextArea, JTextField

    • 읽기
      • JTextArea ta; JTextField tf;
      • ta.getText();
      • tf.getText();
    • 쓰기
      • ta.setText("문자열데이터");
      • ta.append("문자열데이터");
      • tf.setText("문자열데이터");
  3. File (==> (바이트단위) FileInputStream fis, (문자단위)FileReader fr, (바이트단위)FileOutputStream fos, (문자단위)FileWriter fw)

    • 읽기
      • int b = fis.read(바이트데이터);
      • int c = fr.read(문자데이터);
    • 쓰기
      • fos.write(바이트데이터);
      • fw.write(문자데이터);
      • fw.write(문자열데이터);

미션) Swing을 통해 SimpleNotePad를 만드시오

  • ta(JTextArea) 읽기 ===> 파일 쓰기 : 파일저장
  • 필요한 입출력 객체 FileOutputStream, FileWriter

<객체 직렬화> Serialization

  • 객체를 연속적인 데이터롤 변환하는 것(반대과정은 역직렬화라고 함)

  • 객체의 인스턴스변수들의 값을 일렬로 나열하는 것

    • 객체를 파일이나 네트워크에 전송하기 위해 바이트 형태의 데이터로 변환하는것
  • 객체를 스트림으로 파일에 저장하는 방법

  • transient키워드 : 객체 멤버변수중 직렬화 대상에 제외

    class Person
    {
        String name;
        int age;
        String job;
    }
    
    //=>> class Person [String name, int age, String job]
    • 관련 클래스) - 객체단위로 쓰고 읽자!
    • ObjectOutputStream ObjectInputStream
    • Serializable(마커 인터페이스)
package j0507;

import java.io.Serializable;

public class Person implements Serializable//객체 직렬화 하겠음! 이라는 체크를 해줘야 함. implements Serializable
{
    String name = "바보";
    int age = 13;
    transient String job = "학생"; // 직렬화 대상에서 제외 => 데이터값을 전달하지 않겠음.
}

//Person 객체를 파일에 쓸 수 있습니까? => ObjectOutputStream 사용!
package j0507;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class ObjectWriteTest //객체 쓰기 테스트
{


    public static void main(String[] args) throws Exception
    {
        FileOutputStream fos = new FileOutputStream("person.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        Person p = new Person();

        Person p2 = new Person();
            p2.name = "이진주";
            p2.age = 1;
            p2.job = "강아지";

            oos.writeObject(p);
            oos.writeObject(p2);

            oos.writeObject("직렬화 하이~!");
            oos.writeInt(300);    
            oos.writeBoolean(true);

            oos.close();
            fos.close();

        System.out.println("객체 쓰기 성공~!");

    }
}
package j0507;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectReadTest
{

    public static void main(String[] args) throws Exception
    {
        FileInputStream fis = new FileInputStream("person.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);

        Person p = (Person) ois.readObject();
        System.out.println("이름 : " + p.name);
        System.out.println("나이 : " + p.age);
        System.out.println("직업 : " + p.job);
        System.out.println("========================");

        Person p2 = (Person) ois.readObject();
        System.out.println("이름 : " + p2.name);
        System.out.println("나이 : " + p2.age);
        System.out.println("직업 : " + p2.job);
        System.out.println("========================");
        System.out.println("메세지 :" + ois.readObject());
        System.out.println("정수 :" + ois.readInt());
        System.out.println("논리 :" + ois.readBoolean());

    }

}

<스레드> Thread

  • 프로세스내에서 순차적으로 동작하는 문장들의 단일 집합.
  • 경량(light weight)의 프로세스
  • 하나의 프로세스내에 다수개의 스레드를 정의할 수 있으며 다수개의 스레드를 동시에 수행 될 수 있다.(다중스레드)
  • 자바에서는 클래스(Thread)와 인터페이스(Runnable)지원

<스레드 개념>

void a()
{
    1;
    2;
    3;
}

void b()
{
    4;
    5;
    6;
}

void c()
{
    7;
    8;
    9;
}

//===main
a();
b();
c();
//일반메소드의 경우 a()메소드의 문장을 전체 실행해야 b()메소드 실행
//일반메소드의 경우 기다림, 순차적인 실행!
//[실행결과] 1;2;3;4;5;6;7;8;9;

//만약 a,b,c()메소드가 스레드라고 한다면 기다림없이, 동시에 실행!



//[실행결과] 1;4;7;5;2;8;9;3;6;

※스레드 객체 생성

class My extends Thread
{
    //스레드 특성 메소드(오버라이딩)
    public void run()
    {
          //동시(독립) 실행코드  
    }
}




//Thread t = new Tread();
//t.start():

class My2 extends JFrame implements Runnable
{
    public void run()
    {
        //동시실행코드
    }
}

//my2 my = new My2();
//m2는 스레드 객체? X
//m2는 Runnable객체? O
//별도의 Thread객체 생성이 필요.
    //Thread t2 = new Thread(run()메소드의 위치);
    //Thread t2 = new 
  • 위에서 t를 스레드 객체라고 한다!

문제) MainView 클래스 상단(North)에 현재시간 정보를 작성하시오

Thread.sleep( );

  • package j0507;
    
    public class MyThread extends Thread
    {
    
        //스레드 특성을 갖는 메소드 (동시실행)
        @Override
        public void run()
        {
            //동시 실행할(기다리지 않는) 문장들
            try
            {
                for(int i = 1; i< 11; i++)
                {
                    //Thread.sleep(1000);
                    System.out.println("자바스레드 : " + i);
                }
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
    }//MyThread
    
  • package j0507;
    
    public class ThreadTest
    {
        public static void main(String[] args)
        {
            MyThread t = new MyThread();
    //        t.run(); //run()메소드를 직접 호출하는 일반메소드와 같은 실행을 해버림.
            t.start(); // start()메소드는 '스레드'작접 스케줄러라고 보면 된다.
        }
    }
    
궁금상자
- 왜 Thread는 Exception이 안될까? @Override때문!

190503_Day19 복습, MVC다른방법, IO


MVC Model2

전체 프로그램 제어
시각담당 분석
요청 응답 데이터 분석
View Controller

<============inputForm.setVisible(true);

=========================================

​ ==>>selectAll();

​ <=====Vector

[입력폼]입력요청 ==>> Store 저장 필요!
Person p = new Person(
tf_name.getText()
tf_age.getText()
tf_job.getText()
getText());==>> insert(Person p);
==>>selectAll()
<<==Vector
<<== JTable 갱신
DisplayTable(벡터)
<<==입력된 결과를 보여주기
메인의 JTable
mainView.setVisuable(true);
[메인뷰]수정요청 ==>> (데이터 출력된) 수정폼 필요
int row = table.getSelectedRow()
//첫행선택 : 0, 두번째 선택 1
int no = table.getValueAt(row, 0); =>> select(int no)
<== Person p
upForm.tf_name.setText(p.getName())
upForm.tf_age.setText(p.getAge())
upForm.tf_job.setText(p.getJob())
<==이전데이터를 한개 보여주기!!
upForm.setVisible(true);
[메인뷰]삭제요청==>> Store 삭제 필요!
int no = showInputDialog("삭제정보 : ")
int state = showConfirmdialog("정말삭제?")
==>>delete(int no);

IO

  • 어렵다

    • 왜? 생전보는 클래스들의 이름, 거기다가 길어..
  • 스트림!(시냇가, 파이프)이 기본!

    • 8bit(1byte)로 구성된 데이터의 흐름
  • 입출력 4대 클래스( 추상클래스 : 입출력의 특성이 되는 부모 클래스 )

    • | | byte단위 | 문자단위 | 대표메소드 |
      | ---- | ------------ | -------- | ---------- |
      | 입력 | InputStream | Reader | read() |
      | 출력 | OutputStream | Writer | write() |
      | | | | |
  • ASCIIGetBytesTest
package j0503;

public class ASCIIGetBytesTest
{

    public static void main(String[] args)
    {
        String str = "hi java Stream!!!!";
        byte []b = str.getBytes();
        for (int i = 0; i < b.length; i++)
        {
            System.out.write(b[i]);
            if(i%3==2)System.out.write('\n');
        }

    }

}
  • 출력객체들은 flush() 메도드를 갖음 ( 참조 : 입력객체들은 flush()메소드 없음)
  • flush()는 버퍼(임시저장소)가 비우는 열할(버퍼의 내용을 push하는 역할)
  • case1
    • JTable table = new JTable;
  • case2
    • DefaultTableModel dtm = new DefaultTableModel();
    • JTable table = new JTable(dtm);
  • case3
    • 나는 파일을 읽고 싶습니다.
    • FileReader fr = new FileReader( "song.txt ");
  • case4
    • 나는 파일을 읽고 싶습니다.
    • File f = new File("song.txt");
    • FileReader fr = new FileReader(f);

<경로표현방법>

  • 전체 경로(드라이브명과 중간 폴더경로 전체, 절대경로)
  • 상대 경로
  • 생략된 경로
  • 자바의 경로는 이 중 '전체경로'가 기본!
    • ImageIcon("경로");
    • ImageIcon("image/left.gif"); //이클립스 프로젝트 중 자바에서만 가능
  • 자바의 경로안의 문자는 대소문자를 구분하지 않음
//mission

package j0503;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class SimpleNotePad  extends JFrame  implements ActionListener 
{
    JTextArea ta;
    JScrollPane scroll_ta;

    JMenuBar bar;
    JMenu menu_file,menu_help;
        JMenuItem item_open;
        JMenuItem item_save;
        JMenuItem item_exit;

    JFileChooser chooser;

    public SimpleNotePad()
    {
        setTitle("자바메모장");

        chooser = new JFileChooser();

        bar = new JMenuBar();
            menu_file = new JMenu( " File " );
                item_open = new JMenuItem("열기");
                item_save = new JMenuItem("저장");
                item_exit = new JMenuItem("종료");

            menu_file = new JMenu( " File " );
            menu_help = new JMenu( " Help " );

            menu_file.add(item_open);
            menu_file.add(item_save);
            menu_file.addSeparator();//구분선 추가
            menu_file.add(item_exit);

            bar.add(menu_file);
            bar.add(menu_help);

            setJMenuBar(bar);

        ta = new JTextArea();
        scroll_ta = new JScrollPane(ta);

        add("Center", scroll_ta);

        setBounds(400, 300, 600, 600);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        item_open.addActionListener(this);
        item_save.addActionListener(this);
        item_exit.addActionListener(this);
    }//생성자


    //FROM : 파일을 읽어서 = > to : TextArea
    //채워 넣기
    public void openFile() 
    {
        chooser.showOpenDialog(this);
        String filePath = chooser.getSelectedFile().getPath();
//        System.out.println(filePath); 주소 출력 잘됨

//        FileReader fr = new FileReader(filePath);
//        FileReader fr = FileReader(address);
//        ta.setText(t);
    }


    //FROM : TextArea = > to : file에 출력
    public void saveFile() throws IOException
    {
        chooser.showSaveDialog(this);
        String copy = ta.getText();
        //FileReader fr = new FileReader("aabbcc");  (X)
        //FileReader fr = new FileReader("abc.txt"); (O)
        FileWriter fw = new FileWriter(chooser.getSelectedFile().getPath());
        //FileWriter fw = new FileWriter("c:/aa/bb/cc.txt");

        //FileWriter fw = new FileWriter(chooser.getSelectedFile());
        //FileWriter fw = new FileWriter(new File("c:/aa/bb/cc.txt"));

            fw.write(copy);

        fw.close();
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        Object ob = e.getSource();
        if(ob == item_open)
        {
            openFile();
        }else if(ob == item_save)
        {
            try
            {
                saveFile();
            } catch (IOException e1)
            {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }else if (ob == item_exit)
        {
            System.exit(0);
        }

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


}

190502_Day18 MVC Model2,


public class Person {
   //속성정의
    private int no;
    private String name;
    private int age;
    private String job;

    public Person() {

    }

    public Person(int no, String name, int age, String job) {
        this.no = no;
        this.name = name;
        this.age = age;
        this.job = job;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    @Override
    public String toString() {
        return "Person [no=" + no + ", name=" + name + ", age=" + age + ", job=" + job + "]";
    }

//  @Override
//  public String toString() {      
//      return no+": ["+name+","+age+","+job+"]";
//  }



}//class Person

import java.util.Vector;

public class Model {

    public Vector<Person> personv;//데이터 저장소
    private int no;//입력될 Person에 유일한 번호를 부여

    public Model() {
        personv = new Vector<Person>();
    }


    //---------- Vector personv를 기준으로 추가,삭제,수정,조회 작업 ------------------------

    public void insert(Person p){
        no++;
        p.setNo(no);
        personv.add(p);
    } 
    public void update(Person newp){
        //전체 벡터 조회 (일치하는 번호의 Person정보 얻기)
        for(int i=0; i<personv.size(); i++) {
          Person oldp = personv.get(i);
           if(oldp.getNo() ==  newp.getNo()) {//일치하는 번호를 찾았다면
             //수정 작업
               oldp.setAge( newp.getAge());
               oldp.setJob( newp.getJob());
           }

        }   
    } //update

    public void delete(int no){} 
    public Person select(int no){//용도: 수정폼에 출력
      //전체 벡터 조회 (일치하는 번호의 Person정보 얻기)
      for(int i=0; i<personv.size(); i++) {
          Person oldp = personv.get(i);
         if(oldp.getNo() ==  no) {//일치하는 번호를 찾았다면
             return oldp;
         }

      }
      return null;  
    }    
    public Vector<Person> selectAll( ){//용도: JTable출력
      return personv;   
    } 
}
  • View
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import com.encore.person.model.Person;

public class MainView extends JFrame{

   DefaultTableModel dtm;
   public JTable table;
   //public 명시이유? 다른 패키지에 있는 클래스(컨트롤러)에서 사용하기 때문.
   JScrollPane scroll_table;

   public JButton bt_insert, bt_del, bt_update, bt_exit;

   JPanel southp;

   public MainView() {
      setTitle("MainView");

      Object [][]rowData = new Object[0][4];
      //행 크기 0인 이유?  시작을(앞으로 JTable에 추가될 행을) 0인덱스(첫행)부터 하기 위해서

      String []columTitle = {"번호","이름","나이","직업"};

      dtm = new DefaultTableModel(rowData,columTitle);
      //dtm생성이유? dtm내의 addRow() , removeRow() 사용하기 위해서!!

      table = new JTable(dtm);
      scroll_table = new JScrollPane(table);
      //scroll_table생성이유?  1. 테이블(사이즈)을 벗어나는 데이터를 보기 위해서 (스크롤바가 필요)!!
      //                     2. 테이블의 컬럼명을 보여줄 수 있음.

      bt_insert = new JButton("입력");
      bt_update = new JButton("수정");
      bt_del = new JButton("삭제");
      bt_exit = new JButton("종료");

      southp = new JPanel();
        southp.add(bt_insert);
        southp.add(bt_update);
        southp.add(bt_del);
        southp.add(bt_exit);

      add("Center", scroll_table);
      add("South", southp);

      setBounds(300,200,350,300);
      setVisible(true);
      setDefaultCloseOperation(EXIT_ON_CLOSE);


   }//생성자


   //MainView - JTable이 원하는 타입1 : Object []rowData1= {1, "나길동", 13, "학생"};
            //- JTable이 원하는 타입2 : Vector<String> rowData2 = new Vector<>();
                                            //   rowData2.add("2");        //  0
                                            //   rowData2.add("너주원");   // 1
                                            //   rowData2.add("15");       //  2
                                            //   rowData2.add("학생");    //  3

   // rowData2.get(0)  --->  "2"
   // rowData2.get(1)  --->  "너주원"
   // rowData2.get(2)  --->  "15"
   // rowData2.get(3)  --->  "학생"
   //===========================================================================

   //Controller를 통해 전달받은 데이터 타입
   //  - Vector<Person> personv = new Vector<>();
   // personv.get(0)  ---> Person p1 = new Person(1,"홍길동",13,"학생");                   
   // personv.get(1)  ---> Person p2 = new Person(2,"너주원",15,"학생");                   
   // personv.get(2)  ---> Person p3 = new Person(3,"길라임",16,"학생");                   
   // personv.get(3)  ---> Person p4 = new Person(4,"김유신",17,"학생");                   


   //벡터안에 저장된 Person정보를 JTable에 출력하는 기능.
   public void displayTable(Vector<Person> personv) {
        dtm.setRowCount(0);//새로 addRow되는 행 데이터를 0인덱스 부터 출력하겠음!!
                           //이전에 JTable에 출력된 내용을 clear하는 역할!!

        for(int i=0; i<personv.size(); i++) {//벡터의 인덱스 수 == 사람의 수
            Person p = personv.get(i);
            Object []rowData= {p.getNo(), p.getName(), p.getAge(), p.getJob()};
            dtm.addRow(rowData);
        }
   }//displayTable


//   public void displayTable() {
//     Object []rowData1= {1, "나길동", 13, "학생"};
//     //인덱스                        0     1     2    3
//     
//     Vector<Object> rowData2 = new Vector<>();
//     //인덱스
//     rowData2.add(2);        //  0
//     rowData2.add("너주원");   // 1
//     rowData2.add(15);       //  2
//     rowData2.add("학생");    //  3
//     
//     //dtm.addRow(1차원배열);
//     dtm.addRow(rowData1);
//     //dtm.addRow(벡터);
//     dtm.addRow(rowData2);
//   }

}//MainView

package com.encore.person.view;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class UpForm extends JFrame{
   JLabel la_name, la_age, la_job;
   public JTextField tf_name, tf_age, tf_job;

   public JButton bt_submit, bt_cancel; 

   public int upNo;

   public UpForm() {
      setTitle("수정폼");//텍스트 변경

      la_name = new JLabel("이름");
      la_age = new JLabel("나이");
      la_job = new JLabel("직업");

      tf_name = new JTextField();
       tf_name.setEnabled(false);
       //수정폼에 tf_name을 비활성화한 이유?  벡터에 저장되어있는 Person내의 이름은 변경하지 않겠다!!
      tf_age  = new JTextField();
      tf_job  = new JTextField();

      bt_submit = new JButton("수정");//텍스트 변경
      bt_cancel = new JButton("취소");

      //la_name.setBounds(x, y, width, height);
      la_name.setBounds(30,30, 30,30);
      la_age.setBounds(30,80, 30,30);
      la_job.setBounds(30,130, 30,30);

      tf_name.setBounds(70,30, 120,30);
      tf_age.setBounds(70,80, 120,30);
      tf_job.setBounds(70,130, 120,30);

      bt_submit.setBounds(40,180, 70,30);
      bt_cancel.setBounds(120,180, 70,30);

      setLayout(null);
       add(la_name);
       add(la_age);
       add(la_job);
       add(tf_name);
       add(tf_age);
       add(tf_job);
       add(bt_submit);
       add(bt_cancel);

      setBounds(500,200,240,280);
      //setVisible(true);
      //setDefaultCloseOperation(EXIT_ON_CLOSE);
   }//생성자


}//UpForm
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class InputForm extends JFrame{
   JLabel la_name, la_age, la_job;
   public JTextField tf_name, tf_age, tf_job;

   public JButton bt_submit, bt_cancel; 

   public InputForm() {
      setTitle("입력폼");

      la_name = new JLabel("이름");
      la_age = new JLabel("나이");
      la_job = new JLabel("직업");

      tf_name = new JTextField();
      tf_age  = new JTextField();
      tf_job  = new JTextField();

      bt_submit = new JButton("입력");
      bt_cancel = new JButton("취소");

      //la_name.setBounds(x, y, width, height);
      //프레임에 붙는 컴포넌트에 시작좌표(location)와 사이즈를 설정하는 이유? NullLayout인 컨테이너에 부착시킬 때 필요.
      la_name.setBounds(30,30, 30,30);
      la_age.setBounds(30,80, 30,30);
      la_job.setBounds(30,130, 30,30);

      tf_name.setBounds(70,30, 120,30);
      tf_age.setBounds(70,80, 120,30);
      tf_job.setBounds(70,130, 120,30);

      bt_submit.setBounds(40,180, 70,30);
      bt_cancel.setBounds(120,180, 70,30);

      setLayout(null);
       add(la_name);
       add(la_age);
       add(la_job);
       add(tf_name);
       add(tf_age);
       add(tf_job);
       add(bt_submit);
       add(bt_cancel);

      setBounds(500,200,240,280);
      //setVisible(true);
      //setDefaultCloseOperation(EXIT_ON_CLOSE); //전체 '자바응용프로그램 종료' 의미
   }//생성자


}//InputForm
  • Control
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;

import com.encore.person.model.Model;
import com.encore.person.model.Person;
import com.encore.person.view.InputForm;
import com.encore.person.view.MainView;
import com.encore.person.view.UpForm;

public class Controller implements ActionListener{
    //ActionListener상속한 이유? 뷰내의 버튼의 눌림(액션)을 체크하기 위해서!!

    //전체뷰등록
    MainView mainView;
    InputForm form;
    UpForm  upForm;

    //모델 등록 (Vector<Person>등록)
    Model m;

    public Controller() {
        mainView = new MainView();
        form = new InputForm();
        upForm = new UpForm();

        m = new Model();

        eventUp();
    }//생성자

    private void eventUp() {//이벤트 소스 등록
       /////////// MainView이벤트 소스  ////////////////
       mainView.bt_insert.addActionListener(this);
       mainView.bt_update.addActionListener(this);
       mainView.bt_del.addActionListener(this);
       mainView.bt_exit.addActionListener(this);

       /////////// InputForm이벤트 소스  ////////////////
       form.bt_submit.addActionListener(this);
       form.bt_cancel.addActionListener(this);   
       form.addWindowListener(new WindowAdapter() {
           @Override
        public void windowClosing(WindowEvent e) {
             //입력폼  ----> 메인뷰  이동
               form.setVisible(false);
               mainView.setVisible(true);
        }
       });

       /////////// UpForm이벤트 소스  ////////////////   
       upForm.bt_submit.addActionListener(this);
       upForm.bt_cancel.addActionListener(this);
       upForm.addWindowListener(new WindowAdapter() {
           @Override
         public void windowClosing(WindowEvent e) {
             //수정폼  ----> 메인뷰  이동
               upForm.setVisible(false);
               mainView.setVisible(true);
         }
       });
    }//eventUp


    @Override
    public void actionPerformed(ActionEvent e) {//기능정의 메소드: 이벤트 핸들러
       Object ob = e.getSource();
       if(ob==mainView.bt_insert) {//[1]메인뷰: 입력요청 (데이터 입력을 위한 폼이동)
           mainView.setVisible(false);
           form.setVisible(true);
       }
       else if(ob==mainView.bt_update) {//[1]메인뷰: 수정요청  (데이터 수정을 위한 폼이동)
           int row = mainView.table.getSelectedRow();
           int no = Integer.parseInt(mainView.table.getValueAt(row, 0).toString());
           //JTable에서 선택된 행의 번호 얻기

           Person oldp = m.select(no);//no를 조건으로 벡터에 일치하는 Person 얻어오기

           //oldp : 벡터에 이미 저장되어있는 Person
           // ----> 수정폼(TextField)에 출력
           upForm.tf_name.setText(oldp.getName());
           upForm.tf_age.setText(oldp.getAge()+"");
           upForm.tf_job.setText(oldp.getJob());

           //나중에 수정을 위해 UpForm 멤버 upNo에 번호 저장
           upForm.upNo = oldp.getNo();


           mainView.setVisible(false);
           upForm.setVisible(true);
       }
       else if(ob==mainView.bt_del) {//[1]메인뷰: 삭제요청 

       }
       else if(ob==mainView.bt_exit) {//[1]메인뷰: 프로그램 종료요청

       }
       else if(ob==form.bt_submit) {
           //[1]입력폼뷰: 입력요청 (폼에 입력된 데이터를 Vector에 저장)

           String name = form.tf_name.getText();
           int age = Integer.parseInt(form.tf_age.getText());
           String job = form.tf_job.getText();

           Person p = new Person(0, name, age, job);

           m.insert(p);

           //추가된 내용을 JTable에 반영
           Vector<Person> personv = m.selectAll();
           mainView.displayTable(personv);

           //메인뷰로 이동
           form.setVisible(false);
           mainView.setVisible(true);
       }
       else if(ob==upForm.bt_submit) {
           //[1]수정폼뷰: 수정요청 (폼에 입력된 데이터를 정보로 Vector에 값을 변경)


           int age = Integer.parseInt(upForm.tf_age.getText());
           String job = upForm.tf_job.getText();

           //Person p = new Person(0, null, age, job);
           Person p = new Person();
                p.setAge(age);
                p.setJob(job);
                p.setNo(upForm.upNo);


           m.update(p);

           //수정된 내용을 JTable에 반영
           Vector<Person> personv = m.selectAll();
           mainView.displayTable(personv);

           //메인뷰로 이동
           upForm.setVisible(false);
           mainView.setVisible(true);
       }


    }//actionPerformed



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

}

190430_Day17 숫자야구게임,

<이벤트처리>

  • 사건(버튼눌림, 마우스 움직임, 체크하기, 텍스트쓰기 등) 살생시 기능( 실행문장들 기술) 추가
    1. 이벤트 소스 : bt_new, bt_clear, bt_dap, bt_exit;tf
      • 자료형
      • 사건 : 버튼눌림과 텍스트필드에 엔터가 입력
      • Action이벤트~!
    2. implements ActionListener
      • actionPerformed 구현
    3. 연결자 등록
      • 버튼명.addActionListener(this);
      • 텍스트명.addActionListener(this);
package j0430;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class BaseBallGame extends JFrame implements ActionListener
{
    JTextArea ta;
    JButton bt_new, bt_clear, bt_dap, bt_exit;
    JLabel la;
    JTextField tf;
    // JScrollPane: 범위를 벗어나는 데이터를 표현(JTextArea, JList, JTable)
    JScrollPane scroll_ta;

    JPanel panel;

    int []com, user; // 이러면 user도 배열이래... 대신 com[]은 문제발생 []가 앞에 있을때만
    Random r;

    public BaseBallGame()
    {
        setTitle("숫자야구게임");

        r = new Random();
        com = new int[3]; // 배열객체생성식! 개속 바귈거라서 고정된 값이면 그냥 {}; 이렇게 했음
        user = new int[3]; // 사용자가 입력한 데이터 초기화
        // [0][1][2]에 {0,0,0}으로 들어감

        createNum();

        ta = new JTextArea();
        // scroll_ta = new JScrollPane(스크롤바를 필요로 하는 컴포넌트);
        scroll_ta = new JScrollPane(ta);

        bt_new = new JButton("새게임");
        bt_clear = new JButton("지우기");
        bt_dap = new JButton("정답");
        bt_exit = new JButton("종료");

        la = new JLabel("입력:");
        tf = new JTextField();

        // ta.setBounds(10, 10, 350, 300);
        scroll_ta.setBounds(10, 10, 350, 300);
        bt_new.setBounds(380, 60, 90, 40);
        bt_clear.setBounds(380, 120, 90, 40);
        bt_dap.setBounds(380, 180, 90, 40);
        bt_exit.setBounds(380, 240, 90, 40);

        la.setBounds(10, 320, 30, 30);
        tf.setBounds(50, 320, 310, 30);

        panel = new JPanel();
        panel.setLayout(null);
        panel.setBackground(Color.blue);
        panel.add(scroll_ta);// (ta);
        panel.add(bt_new);
        panel.add(bt_clear);
        panel.add(bt_dap);
        panel.add(bt_exit);
        panel.add(la);
        panel.add(tf);

        add(panel);
        setBounds(300, 300, 500, 410);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        eventUp();// 이벤트소스 등록(이벤트소스와 이벤트처리부 연결)!!
    }// 생성자

    private void eventUp()
    {
        // 버튼
        bt_new.addActionListener(this); // 201호
        bt_clear.addActionListener(this); // 202호
        bt_dap.addActionListener(this); // 203호
        bt_exit.addActionListener(this);

        // 텍스트필드
        tf.addActionListener(this); // 205호
    }

    @Override
   public void actionPerformed(ActionEvent e) // EventHandler(이벤트처리부) - 기능정의
   {
       //가장 빈번한 이벤트 발생 컴포넌트를 가장 상단에 위치 하는것이 좋다.
       Object ob = e.getSource(); // 이벤트소스의 주소 얻기

       if( ob == tf) // 텍스트 필드에 enter 입력시 사용자가 입력한 String과 com배열의 값을 비교해서 화면(TextArea)에 결과 출력
       {
           String str = tf.getText(); //"369" => { 3, 6, 9 } 변환한다면 비교용이!!
           int su = Integer.parseInt(str);
//         su/100; (su%100)/10; ((su%100)%10)
//         user[0] = su/100; 이렇게 해도 되는데 문제는 숫자 아닌 문자열들이 왔을때 문제가 발생할수도!

           //Stirng str = "369"라면 인덱스를 가지고 있다 012로!
//         user[0] = str.charAt(0) - 48; //캐릭터와 인트는 호환이 되지만 아스키 코드값으로 들어가서 -48
//         user[1] = str.charAt(1) - 48;
//         user[2] = str.charAt(2) - 48;
           for (int i = 0; i < com.length; i++)
        {
            user[i] = str.charAt(i)-48;
        }
           // com배열과 비교할 수 있는 대등한 int[]user 배열 값이 생성!

           int strike = 0,ball = 0;
           // 비교 
           for(int i = 0; i < com.length; i++) // com배열 인덱스
           {
               for(int j = 0; j < com.length; j++) // user배열 인덱스
               {
                   //같은 수(값)가 존재한다면 =>> 스트라이크 또는 볼 후보!
                   if( com[i] == user[j] ) // 같은 수 발견
                   {
                    if( i == j ) // 같은 자리수 인지
                    {
                        strike++; // 같은 수 같은 자리
                    }
                    else
                    {
                        ball++; //같은 수 다른 자리
                    }
                   }
               }
           }
           if(strike == 3)
           {
               ta.append("축하합니다  정답을 맞추셨습니다.");
           }else 
           {
               ta.append(str + "은 " + strike + "스트라이크, " + ball + "볼\n");
           }

           tf.setText("");

       }
       else if( ob == bt_new)
       {
           createNum();
           ta.setText("");
       }
       else if( ob == bt_dap ) //정답버튼 클릭시 com이라는 배열값 ta에 출력
       {
//         ta.setText(t); //는 기존거 지우고 덮어쓰기
           ta.append("정답은~♥ " + com[0] + " " +  com[1] + " " +  com[2] + " 이었습니다.\n" );//기존거 유지한 상태에서 추가, append는 String받아옴
       }
       else if( ob == bt_clear) //지우기버튼 클릭시 텍스트 지우기
       {
           ta.setText("");
           tf.setText("");
       }
       else if( ob == bt_exit) //종료버튼 클릭시
       {
           System.exit(0);
       }
   }//actionPerformed


    public void createNum()
    {
        for(int i = 0; i <com.length; i++ ) // com배열 인덱스 표현
        {
            com[i] = r.nextInt(10); // 0~9
            for (int j = i - 1; j >= 0; j--)
            {
                if( com[i] == com[j] )//중복된 데이터가 발견 된다면
                {
                    i--;
                    break;
                }
            }
        }
    }

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



}

마우스모션

package j0430;

import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

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

public class MouseMotionTest extends JFrame implements MouseMotionListener
{
    JLabel green, red;

    public MouseMotionTest()
    {
        setTitle("마우스모션테스트");

        green = new JLabel("MOVE");
            green.setBackground(Color.GREEN); //라벨은 바탕색 투명이 default
            green.setOpaque(true); //불투명
        red = new JLabel("DRAG");
            red.setBackground(Color.RED);
            red.setOpaque(true);

            //green.setLocation(30,30);
            //green.setSize(80,30);

        green.setBounds(30, 30, 80, 30); // x, y좌표 가로,세로 길이
        red.setBounds(30, 80, 80, 30); // x, y좌표 가로,세로 길이

        setLayout(null);
        add(green);
        add(red);

        setBounds(300,200,600,600);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        addMouseMotionListener(this); // 프레임 위에서 마우스 움직임 관찰!
    }//생성자

    @Override
    public void mouseDragged(MouseEvent e) //마우스의 왼쪽 클릭한 상태에서 이동
    {
        System.out.println("mouseDragged");
        int x = e.getX();
        int y = e.getY();

        red.setLocation(x,y);

    }

    @Override
    public void mouseMoved(MouseEvent e) //마우스 단순 이동
    {
        System.out.println("mouseMoved");
        int x = e.getX() + -30;
        int y = e.getY() + -30;

        green.setLocation( x, y );
    }

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

}

숫자야구 개선!

package j0430;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class BaseBallGame3 extends JFrame implements ActionListener
{
    JTextArea ta;
    JButton bt_new, bt_clear, bt_dap, bt_exit;
    JLabel la;
    JTextField tf;
    // JScrollPane: 범위를 벗어나는 데이터를 표현(JTextArea, JList, JTable)
    JScrollPane scroll_ta;

    JPanel panel;

    int []com, user; // 이러면 user도 배열이래... 대신 com[]은 문제발생 []가 앞에 있을때만
    Random r;

    public BaseBallGame3()
    {
        setTitle("숫자야구게임");

        r = new Random();
        com = new int[3]; // 배열객체생성식! 개속 바귈거라서 고정된 값이면 그냥 {}; 이렇게 했음
        user = new int[3]; // 사용자가 입력한 데이터 초기화
        // [0][1][2]에 {0,0,0}으로 들어감

        createNum();

        ta = new JTextArea();
        // scroll_ta = new JScrollPane(스크롤바를 필요로 하는 컴포넌트);
        scroll_ta = new JScrollPane(ta);

        bt_new = new JButton("새게임");
        bt_clear = new JButton("지우기");
        bt_dap = new JButton("정답");
        bt_exit = new JButton("종료");

        la = new JLabel("입력:");
        tf = new JTextField();

        // ta.setBounds(10, 10, 350, 300);
        scroll_ta.setBounds(10, 10, 350, 300);
        bt_new.setBounds(380, 60, 90, 40);
        bt_clear.setBounds(380, 120, 90, 40);
        bt_dap.setBounds(380, 180, 90, 40);
        bt_exit.setBounds(380, 240, 90, 40);

        la.setBounds(10, 320, 30, 30);
        tf.setBounds(50, 320, 310, 30);

        panel = new JPanel();
        panel.setLayout(null);
        panel.setBackground(Color.blue);
        panel.add(scroll_ta);// (ta);
        panel.add(bt_new);
        panel.add(bt_clear);
        panel.add(bt_dap);
        panel.add(bt_exit);
        panel.add(la);
        panel.add(tf);

        add(panel);
        setBounds(300, 300, 500, 410);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        eventUp();// 이벤트소스 등록(이벤트소스와 이벤트처리부 연결)!!
    }// 생성자

    private void eventUp()
    {
        // 버튼
        bt_new.addActionListener(this); // 201호
        bt_clear.addActionListener(this); // 202호
        bt_dap.addActionListener(this); // 203호
        bt_exit.addActionListener(this);

        // 텍스트필드
        tf.addActionListener(this); // 205호
    }

    @Override
   public void actionPerformed(ActionEvent e) // EventHandler(이벤트처리부) - 기능정의
   {
       //가장 빈번한 이벤트 발생 컴포넌트를 가장 상단에 위치 하는것이 좋다.
       Object ob = e.getSource(); // 이벤트소스의 주소 얻기

       if( ob == tf) // 텍스트 필드에 enter 입력시 사용자가 입력한 String과 com배열의 값을 비교해서 화면(TextArea)에 결과 출력
       {
           String str = tf.getText(); //"369" => { 3, 6, 9 } 변환한다면 비교용이!!
           int su = Integer.parseInt(str);
//         su/100; (su%100)/10; ((su%100)%10)
//         user[0] = su/100; 이렇게 해도 되는데 문제는 숫자 아닌 문자열들이 왔을때 문제가 발생할수도!

           //Stirng str = "369"라면 인덱스를 가지고 있다 012로!
//         user[0] = str.charAt(0) - 48; //캐릭터와 인트는 호환이 되지만 아스키 코드값으로 들어가서 -48
//         user[1] = str.charAt(1) - 48;
//         user[2] = str.charAt(2) - 48;
           for (int i = 0; i < com.length; i++)
        {
            user[i] = str.charAt(i)-48;
        }
           // com배열과 비교할 수 있는 대등한 int[]user 배열 값이 생성!

           int strike = 0,ball = 0;
           // 비교 
           for(int i = 0; i < com.length; i++) // com배열 인덱스
           {
               for(int j = 0; j < com.length; j++) // user배열 인덱스
               {
                   //같은 수(값)가 존재한다면 =>> 스트라이크 또는 볼 후보!
                   if( com[i] == user[j] ) // 같은 수 발견
                   {
                    if( i == j ) // 같은 자리수 인지
                    {
                        strike++; // 같은 수 같은 자리
                    }
                    else
                    {
                        ball++; //같은 수 다른 자리
                    }
                   }
               }
           }
           if(strike == 3)
           {
               ta.append("축하합니다  정답을 맞추셨습니다.");
           }else 
           {
               ta.append(str + "은 " + strike + "스트라이크, " + ball + "볼\n");
           }

           tf.setText("");

       }
       else if( ob == bt_new)
       {
           createNum();
           ta.setText("");
       }
       else if( ob == bt_dap ) //정답버튼 클릭시 com이라는 배열값 ta에 출력
       {
//         ta.setText(t); //는 기존거 지우고 덮어쓰기
           ta.append("정답은~♥ " + com[0] + " " +  com[1] + " " +  com[2] + " 이었습니다.\n" );//기존거 유지한 상태에서 추가, append는 String받아옴
       }
       else if( ob == bt_clear) //지우기버튼 클릭시 텍스트 지우기
       {
           ta.setText("");
           tf.setText("");
       }
       else if( ob == bt_exit) //종료버튼 클릭시
       {
           System.exit(0);
       }
   }//actionPerformed


    public void createNum()
    {
        for(int i = 0; i <com.length; i++ ) // com배열 인덱스 표현
        {
            com[i] = r.nextInt(10); // 0~9
            for (int j = i - 1; j >= 0; j--)
            {
                if( com[i] == com[j] )//중복된 데이터가 발견 된다면
                {
                    i--;
                    break;
                }
            }
        }
    }

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



}
package com.encore.j0430;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


/*
<이벤트 처리> - 사건(버튼눌림,마우스움직임,체크하기,텍스트쓰기등) 발생시 기능(실행문장들 기술)추가
1. 이벤트 소스:  bt_new, bt_clear, bt_dap, bt_exit, tf
              ---------------------------------- ---
                    JButton                      JTextField
                   사건:      버튼눌림                                     텍스트필드에 엔터가 입력   -----> Action이벤트!!

2. implements ActionListener
    ---> actionPerformed구현

3. 연결자 등록
    버튼명.addActionListener(this);
    텍스트명.addActionListener(this);
 */

public class BaseBallGame2 extends JFrame implements ActionListener{
   JTextArea ta;
   JButton bt_new, bt_clear, bt_dap, bt_exit, bt_hint;
   JLabel la;
   JTextField tf;
   //JScrollPane: 범위를 벗어나는 데이터를 표현(JTextArea, JList, JTable)
   JScrollPane scroll_ta;

   JPanel panel;  

   int []com;
   int []user;
   Random r;
   int count;

   JFrame f;
   boolean start;//게임 시작 상태 표현

   public BaseBallGame2() {
     setTitle("숫자야구게임");

     f = this;

     com= new int[3]; //배열객체생성식!!
     user= new int[3]; //사용자가 입력한 데이터로 초기화
              //{0,0,0}

     r = new Random();

     createNum();

     ta = new JTextArea();
       ta.setFont(new Font("굴림체", Font.BOLD , 17));
       ta.setLineWrap(true);
       //TextArea에 자동 줄바꿈(가로사이즈를 벗어나는 텍스트 발견시)
       ta.setEditable(false);
       //ta.setEnabled(false);

     //scroll_ta = new JScrollPane(스크롤바를 필요로 하는 컴포넌트);
     scroll_ta = new JScrollPane(ta);

     bt_new = new JButton("새게임");
     bt_clear = new JButton("지우기");
     bt_dap = new JButton("정답");
     bt_exit = new JButton("종료");
     bt_hint = new JButton("힌트");

     la = new JLabel("입력:");
     tf = new JTextField();

     //ta.setBounds(10, 10, 350, 300);
     scroll_ta.setBounds(10, 10, 350, 300);

     bt_new.setBounds(380,40,90,40);
     bt_clear.setBounds(380,100,90,40);
     bt_dap.setBounds(380,160,90,40);    
     bt_hint.setBounds(380,220,90,40);
     bt_exit.setBounds(380,280,90,40);

     la.setBounds(10, 320, 30,30);
     tf.setBounds(50, 320, 310,30);

     panel = new JPanel();
      panel.setLayout(null);
      panel.setBackground(Color.ORANGE);
      panel.add(scroll_ta);//(ta);
      panel.add(bt_new);
      panel.add(bt_clear);
      panel.add(bt_dap);
      panel.add(bt_hint);
      panel.add(bt_exit);
      panel.add(la);
      panel.add(tf);

     add(panel);
     setBounds(300,300, 500,410);
     setVisible(true);
     setDefaultCloseOperation(EXIT_ON_CLOSE);

     setResizable(false);//프레임에 대한 사이즈 변경 불가!!

     //특정 컴포넌트에 포커스 이동
     tf.requestFocus();

     endGame();//텍스트필드, 정답버튼, 힌트버튼 비활성화

     ruleDescription();

     eventUp();//이벤트소스 등록(이벤트소스와 이벤트처리부 연결)!!
   }//생성자

   private void eventUp() {
     //버튼
     bt_new.addActionListener(this);  //201호
     bt_clear.addActionListener(this); //202호 
     bt_dap.addActionListener(this);   //203호
     bt_exit.addActionListener(this);  //204호
     bt_hint.addActionListener(this);  //206호

     //텍스트필드
     tf.addActionListener(this);  //205호


     tf.addMouseListener(new MouseAdapter() {
         @Override
        public void mousePressed(MouseEvent e) {
            //JOptionPane.showMessageDialog(f, "게임시작을 위해 [새게임]버튼을 클릭!!");
           if(!start)//start==false)
             showMsg("게임시작을 위해 [새게임]버튼을 클릭!!");  
        }
      });
     /*
      class BaseBallGame2 extends JFrame{//외부클래스 
         new MouseAdapter()
         {//익명의 내부클래스 시작      

           this  --->  JFrame X 
           this  --->  MouseAdapter O 

         }//익명의 내부클래스 끝
      }
       ===========================================================
       class My  extends MouseAdapter{
                 ---------------------
                      위의 new 다음 오는 자료형이 클래스면 extends, 인터페이스면 implements
       }

       ==> 위의 코드는 My라는 이름의 클래스명이 없으므로 익명(Anonymous)이라함.

     */




   }//eventUp

   @Override
   public void actionPerformed(ActionEvent e) {//EventHandler(이벤트처리부) - 기능정의
      //가장 빈번한 이벤트발생 컴포넌트를 가장 위에 위치.

      Object ob =  e.getSource();//이벤트소스의 주소 얻기.
      if(ob == tf) {//텍스트 필드에 enter 입력시
         //사용자가 입력한 String과 com배열의 값을 비교하여 화면(TextArea)에 결과 출력.

        String str = tf.getText();//"369" ---> {3,6,9} 변환한다면 비교용이!!

        //str의 유효성 검사!!(세자리 숫자)
        if(!str.matches("[\\d]{3}")) {//세자리 숫자가 아니라면
            showMsg("세자리숫자만 입력!!");
            tf.setText("");
            return;
        }


        /*
        int su = Integer.parseInt(str);//"369" ---> 369
        user[0]=su/100;  // 369/100 ---> 3
        user[1]=(su%100)/10;  // (369%100)/10 ---> 69/10 ---> 6
        user[2]=(su%100)%10;  // (369%100)%10 ---> 69%10 ---> 9
        */

        //String str="369";
        //     인덱스    012
        /*
        user[0]=str.charAt(0)-48; //user[0] = '3'-48  = 51-48 ?
        user[1]=str.charAt(1)-48;
        user[2]=str.charAt(2)-48;
        */
       for(int i=0; i<com.length; i++) {
         user[i]=str.charAt(i)-48;
       }

       if(duplicateNum()) {
            showMsg("중복된 숫자사용금지!!");
            tf.setText("");
            return;
        }


        count++; 


       //==> com배열과 비교할 수 있는 대등한 int[]user 배열 값이 생성


       int strike=0,ball=0;
       //비교
       for(int i=0; i<com.length; i++) {//com배열 인덱스          [0]   [1]   [2]
         for(int j=0; j<user.length; j++) {//user배열 인덱스  [0]   [1]   [2] 
            //같은 수(값)가 존재한다면 ==> 스트라이크 또는 볼 후보!!
             if(com[i] == user[j]) {//같은 수 발견!!
                 if(i==j) {//같은 자릿수(백,십,일) 라면 
                    strike++;//같은 수, 같은 자리 
                 }else {
                    ball++; //같은 수, 다른 자리
                 }
             }
         }//안쪽for
       }//바깥for

        //9번의 비교가 끝난후 결과 출력!!

       if(strike==3) {
        ta.append("♥축하합니다♥ 정답[" + str +"]을 맞추셨습니다^^*\n");
        endGame();
       }else {
        ta.append(count+": "+str+" ▶ " + strike +"Strike "+ ball+"Ball\n");
       }

        tf.setText("");

      }else if(ob == bt_new) {//'새게임'버튼 클릭시
          startGame();
      }else if(ob == bt_dap) {//'정답'버튼 클릭시
         //com배열의 값을 ta에 출력
         ta.append("▣ 정답은 ["+com[0]+com[1]+com[2]+"]입니다.\n" ); 
         endGame();
      }else if(ob == bt_clear) {//'지우기'버튼 클릭시
         //텍스트 지우기
          ta.setText("");
          tf.setText("");
      }else if(ob == bt_hint) {

          JOptionPane.showMessageDialog(this, "힌트["+ com[r.nextInt(3)]  +"]");
          bt_hint.setEnabled(false);
      }else if(ob == bt_exit) {//'종료'버튼 클릭시
         //전체프로그램종료
          System.exit(0);
      } 

   }//actionPerformed

   public void createNum() {
     for(int i=0; i<com.length; i++) {//com배열 인덱스 표현
         com[i]= r.nextInt(10);//0~9
         for(int j=i-1;  j>=0; j--) {//중복검사: i=1 --> 0번지비교
                                     //        i=2 --> 1번지, 0번지 비교
          if(com[i] == com[j]) {//중복된 데이터가 발견된다면
               i--;
               break;
          }
 }//안쪽for 
      }//바깥쪽for   
   }//번호생성

   public boolean duplicateNum() {//중복숫자 발견시 true리턴
      if(user[0]== user[1] ||
         user[0]== user[2] ||
         user[1]== user[2]) {
          return true;
      }
      return false; 
   }//duplicateNum


   public void ruleDescription() {//게임 룰 설명
     ta.append("\n\n\t<숫자야구게임>");  
     ta.append("\n1. 게임시작을 위해서 새게임버튼을 클릭");  
     ta.append("\n2. 입력에 중복되지않는 세자리수를 입력   후 엔터");  
     ta.append("\n3. 숫자와 자릿수를 맞추면 Strike, 숫자  만 맞추면 Ball이 추가됩니다.");  
     ta.append("\n4. 정답을 보고 싶으면 정답버튼을 클릭");  
     ta.append("\n5. 기타 문의사항이 있으면 관리자에게     연락바람(02-754-7302)");  
   }//ruleDescription

   public void showMsg(String message) {
       JOptionPane.showMessageDialog(this, message);
   }//showMsg

   //게임 시작
   public void startGame() {
      start=true; 

      createNum();
      tf.setEnabled(true); 
      ta.setText("");
      count=0;
      bt_dap.setEnabled(true);
      bt_hint.setEnabled(true);

      tf.requestFocus();
   }//startGame

   //게임 끝   
   public void endGame() {
      start=false;  

      tf.setEnabled(false); 
      bt_dap.setEnabled(false);
      bt_hint.setEnabled(false);
   }

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

}







JTable

package j0430;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class JTableTest extends JFrame{
   /*
 문제1)

      JFrame 'Center'에 javax.swing.JTable을 add시키시오.
           그리고 아래의 데이터를 JTable에 입력(표시)하시오. (API문서 참조)

      <데이터>
            이름        나이       직업
    ------------------------
          홍길동        13    학생                         
          길라임        15    학생                         
          김주원        17    학생            
   */

   JTable table;    
   JScrollPane scroll_table;

   public JTableTest() {
       setTitle("JTable테스트");

       Object[][] rowData = {
               // 0열            1열      2열
               { "홍길동",        13,    "학생" },
               { "길라임",        15,    "학생" },
               { "김주원",        17,    "학생" }

       };
       String[] columnTitle = {"이름","나이","직업"};

       table = new JTable(rowData, columnTitle)
               {
                    @Override
                    public boolean isCellEditable( int row, int column )
                    {
                        return false;
                    }
               };
       scroll_table = new JScrollPane(table);

       add(scroll_table);

//       add(table);

       setBounds(400,300, 300,300);
       setVisible(true);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
   }//생성자   

   public static void main(String[] args) {
       new JTableTest(); //JFrame객체 생성!!
   }

}







package j0430;

import java.awt.FlowLayout;

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

class You extends JButton
{
    public You(String text)
    {
        super(text);
    }
}

class A
{
    void hello()
    {
        System.out.println("하이");
    }
}

public class My extends JFrame
{
    JButton bt;
    You you;

    public My()
    {
        bt = new JButton("버튼1");
        you = new You("버튼2");

        setLayout(new FlowLayout());
        add(bt);
        add(you);

        setSize(300,300);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

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

        A a = new A() 
        {
            @Override
            public void hello()
            {
                System.out.println("신짜오~!"); //오버라이딩
            }
        };
        a.hello();
    }
}
package j0430;

import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class JTableTest extends JFrame{
   /*
 문제1)

      JFrame 'Center'에 javax.swing.JTable을 add시키시오.
           그리고 아래의 데이터를 JTable에 입력(표시)하시오. (API문서 참조)

      <데이터>
            이름        나이       직업
    ------------------------
          홍길동        13    학생                         
          길라임        15    학생                         
          김주원        17    학생            


     JTable, JTextArea, JList  ===> 사이즈를 벗어나는 데이터를 표현하기 위해 JScrollPane 함께 사용.     
   */

   JTable table;    
   JScrollPane scroll_table;

   public JTableTest() {
       setTitle("JTable테스트");

       //JTable(Object[][] rowData, Object[] columnNames)
       Object [][] rowData = {
                                 //  0열       1열     2열
                                  {"홍길동", 13, "학생"}, //첫째행   0행
                                  {"길라임", 15, "학생"}, //둘째행   1행
                                  {"김주원", 17, "학생"}  //셋째행   2행
                             };
       String [] columnTitle = {"이름","나이","직업"};

       //DefaultTableModel(Object[][] data, Object[] columnNames)
       DefaultTableModel dtm = new DefaultTableModel(rowData,columnTitle);
       //DefaultTableModel 클래스 사용 이유?
       // 프로그램 실행 중  '행 단위 데이터'를  추가 또는 삭제 하기 위해


      // table = new JTable(rowData,columnTitle) {
       table = new JTable(dtm) {
           @Override
         public boolean isCellEditable(int row, int column) {
            return false;
         }
       };
       scroll_table = new JScrollPane(table);

       add(scroll_table);//(table);

       setBounds(400,300, 300,300);
       setVisible(true);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
 /*
        <데이터>
            이름        나이       직업
    ------------------------
0행       홍길동        13    학생                         
1행       길라임        15    학생                         
2행       김주원        17    학생

        0열        1열        2열       

  */
 //문제2) JTable내의 '길라임'을 얻어서 (콘솔)화면에 출력하시오.
        //table.get메소드() 찾기      :  힌트 ===> 행열 인덱스를 사용!!
       Object nameValue= table.getValueAt(1, 0);
       System.out.println("nameValue="+ nameValue);

 //문제3) JTable내의 '길라임' ---> '차라임'으로 변경
        //table.set메소드() 찾기      :  힌트 ===> 행열 인덱스를 사용!!
       //table.setValueAt(Object aValue, int row, int column);//aValue: 변경할 데이터
       table.setValueAt("차라임", 1, 0);

 //문제4) JTable내의 모든 사람의 이름을 (콘솔)화면에 출력하시오.
        //힌트: 이름 ---> 0열
       System.out.println(table.getValueAt(0, 0)); 
       System.out.println(table.getValueAt(1, 0)); 
       System.out.println(table.getValueAt(2, 0)); 
       //System.out.println(table.getValueAt(3, 0)); //IndexOutOfBounds에러 발생
       System.out.println("======================");
       for(int i=0; i<table.getRowCount(); i++) {//행인덱스 표현
           System.out.println(table.getValueAt(i, 0));
       }

 //문제5) 행 추가!!  ---> ["김유신",13,"화랑"]
       //table.setValueAt("김유신", 3, 0);   (X):에러 ==> 존재하지 않는 행인덱스를 참조

       Object [] newRow = {"김유신",13,"화랑"};
       dtm.addRow(newRow);

       Vector<Object> v = new Vector<>();
          v.add("강감찬");
          v.add(28);
          v.add("장군");
       dtm.addRow(v);          


 //문제6) 김주원 행을 삭제 (힌트: 세번째행 ---> 2인덱스행)   
       dtm.removeRow(2);


   }//생성자   

   public static void main(String[] args) {
       new JTableTest(); //JFrame객체 생성!!
   }

}








190429_Day16 복습, Swing

이벤트 처리 복습


그리고 오늘은 스윙을 배워본다!

스윙도 자바 GUI, 더 기능이 많고 자바 언어로만 쓰여있어서 다른 기기에서도 바뀌지 않는다!

스윙(Swing)

  • AWT : 내부적으로 C언어로 구성

    • 운영체제에서 지원하는 컴포넌트를 얻어 옴.
    • (동일한 class가 운영체제 OS에 따라 다른 모양으로 보일 수 있음)
    • java.awt.*;
  • Swing : 순수자바언어로 구성.( 운영체제에 상관없이 동일한 컴포넌트 지원 )

    • javax.swing.*;

    • 특징 : awt와 비교하여 첫글자가 ‘J’로 시작!

    • AWT Swing
      Button JButton
      Frame JFrame
      Checkbox JCheckBox(o)JCheckbox(x)
  • package j0429;
    
    import java.awt.FlowLayout;
    import java.awt.event.WindowAdapter;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class SwingTest extends JFrame
    {
    JButton bt,bt1;
    
    public SwingTest()
    {
        setTitle("Swing테스트");
    
        bt = new JButton("<html><font size = 20 color = red face = 궁서체>나버튼</font></html>"); //html 태그 적용 가능
        bt1 = new JButton("나버튼"); 
    
        setLayout(new FlowLayout());
        add(bt);
        add(bt1);
    
        setSize(300,500);
        setVisible(true);
        //만약 프레임 우측 상단의 X버튼 클릭시 프로그램 종료만 할 것이라면 아래의 코드 사용!
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //X버튼에 기능 부여할 것이면 addWindowListener() 사용!
    }
    
    
    public static void main(String[] args)
    {
        new SwingTest();
    }
    }
    
  • 1556503089180

  • package j0429;
    
    import java.awt.GridLayout;
    
    import javax.swing.ImageIcon;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.BevelBorder;
    import javax.swing.border.TitledBorder;
    
    public class JCheckBoxTest extends JFrame
    {
    JCheckBox cb1, cb2, cb3;
    JPanel panel;
    
    public JCheckBoxTest()
    {
        ImageIcon icon1 = new ImageIcon("src/image/left.gif"); // 경로는 대소문자 구분 안함
        ImageIcon icon2 = new ImageIcon("src/image/leftrollover.gif");
        ImageIcon icon3 = new ImageIcon("src/image/leftdown.gif"); 
        ImageIcon icon4 = new ImageIcon("src/image/right.gif");
        ImageIcon icon5 = new ImageIcon("src/image/rightrollover.gif");
        ImageIcon icon6 = new ImageIcon("src/image/rightdown.gif"); 
        cb1 = new JCheckBox("첫번째 체크박스",icon1);
        cb1.setRolloverIcon(icon2);
        cb1.setSelectedIcon(icon3);
    
        cb2 = new JCheckBox("두번째 체크박스",icon4);
        cb2.setRolloverIcon(icon5);
        cb2.setSelectedIcon(icon6);
    
        cb3 = new JCheckBox("세번째 체크박스");
    
        panel = new JPanel();
            panel.setLayout(new GridLayout( 3, 1 ));
            panel.add(cb1);
            panel.add(cb2);
            panel.add(cb3);
    
    //            panel.setBorder(new TitledBorder("패널타이틀"));
    //            panel.setBorder(new BevelBorder(BevelBorder.RAISED)); //양각
    //            panel.setBorder(new BevelBorder(BevelBorder.LOWERED)); //음각
            panel.setBorder(new TitledBorder(new BevelBorder(BevelBorder.LOWERED), "패널타이틀"));
    
        setTitle("체크박스테스트");
        add(panel);
        //JFrame - BorderLayout기본레이아웃 "Center"기본위치
    
            setSize(300,200);
            setVisible(true);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    public static void main(String[] args)
    {
        new JCheckBoxTest();
    }
    }
    
  • 1556505751843

  • package j0429;
    
    import java.awt.GridLayout;
    
    import javax.swing.ButtonGroup;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.border.BevelBorder;
    import javax.swing.border.TitledBorder;
    
    public class JRadioButtonTest extends JFrame
    {
    JRadioButton radio1, radio2, radio3;
    JPanel panel;
    
    public JRadioButtonTest()
    {
        ImageIcon icon1 = new ImageIcon("src/image/left.gif");
        ImageIcon icon2 = new ImageIcon("src/image/leftRollover.gif");
        ImageIcon icon3 = new ImageIcon("src/image/leftdown.gif");
    
        radio1 = new JRadioButton("라디오1", icon1);
        radio2 = new JRadioButton("라디오2", icon2);
        radio3 = new JRadioButton("라디오3", icon3);
    
        ButtonGroup group = new ButtonGroup();
        group.add(radio1);
        group.add(radio2);
        group.add(radio3);
    
        panel = new JPanel();
        panel.setLayout(new GridLayout( 3, 1 ) );
            panel.add(radio1);
            panel.add(radio2);
            panel.add(radio3);  
        panel.setBorder(new TitledBorder(new BevelBorder(BevelBorder.RAISED), "라디오그룹" ) );
    
        setTitle("라디오 버튼 테스트");
        add(panel);
    
        setSize(200,300);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    
    public static void main(String[] args)
    {
        new JRadioButtonTest();
    }
    }
    
    
  • 1556506893675

  • //JList 안쓴것 
    
    package j0429;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.GridLayout;
    import java.awt.List;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    
    public class ItemMoveTest extends JFrame
    {
    
       JButton bt_right,bt_right_all, bt_left, bt_left_all;
    
    JPanel leftp, centerp, rightp;
    
    //    JList<String> left_list = new JList<String>();
    //    JList<String> right_list = new JList<String>();
    List left_list, right_list;
    
    JTextField left_tf, right_tf;
    
    public ItemMoveTest()
    {
    
    //        ImageIcon icon1 = new ImageIcon();
    //        ImageIcon icon2 = new ImageIcon();
    //        ImageIcon icon3 = new ImageIcon();
    //        ImageIcon icon4 = new ImageIcon();
    
          left_list = new List();
          right_list = new List();
    
          left_tf = new JTextField();      
          right_tf = new JTextField();
    
          bt_right = new JButton("▷");
          bt_right_all = new JButton("▶");
          bt_left = new JButton("◁");
          bt_left_all = new JButton("◀");
    
          leftp = new JPanel();
            leftp.setLayout(new BorderLayout());
            leftp.add("Center",left_list);
            leftp.add("South",left_tf);
    
          rightp = new JPanel();
            rightp.setLayout(new BorderLayout());
            rightp.add("Center",right_list);
            rightp.add("South",right_tf);
    
          centerp = new JPanel();
            centerp.setBackground(Color.YELLOW);
            centerp.setLayout(new GridLayout(6,3));
            centerp.add(new JLabel());
            centerp.add(bt_left);
            centerp.add(bt_left_all);
            centerp.add(bt_right);
            centerp.add(bt_right_all);
    
            setTitle("Item움직이기");
            setLayout(new GridLayout(1,3));
            add(leftp);
            add(centerp);
            add(rightp);
    
        setSize(300,400);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    }
    
    public static void main(String[] args)
    {
        new ItemMoveTest();
    }
    
    }
    
  • //=== 그냥 리스트
    package j0429;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.GridLayout;
    import java.awt.List;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    
    public class ItemMoveTest extends JFrame implements ActionListener
    {
    // JList<String> left_list, right_list;
    List left_list, right_list;
    
    JTextField left_tf, right_tf;
    JButton bt_right, bt_right_all, bt_left, bt_left_all;
    
    JPanel leftp, centerp, rightp;
    
    public ItemMoveTest()
    {
    //      left_list = new JList<String>();
    //      right_list = new JList<String>();
        left_list = new List();
        right_list = new List();
    
        left_tf = new JTextField();
        right_tf = new JTextField();
    
        // 'ㅁ'한글입력 - 한자키 누름
        // 확장된 부호찾기 - ▷ ▶ ◁ ◀
        bt_right = new JButton("▷");
        bt_right_all = new JButton("▶");
        bt_left = new JButton("◁");
        bt_left_all = new JButton("◀");
    
        leftp = new JPanel();
        leftp.setLayout(new BorderLayout());
        leftp.add("Center", left_list);
        leftp.add("South", left_tf);
    
        rightp = new JPanel();
        rightp.setLayout(new BorderLayout());
        rightp.add("Center", right_list);
        rightp.add("South", right_tf);
    
        centerp = new JPanel();
        centerp.setBackground(Color.YELLOW);
        centerp.setLayout(new GridLayout(6, 3, 10, 10));
        centerp.add(new JLabel());
        centerp.add(new JLabel());
        centerp.add(new JLabel());
        centerp.add(new JLabel());
        centerp.add(bt_left);
        centerp.add(new JLabel());
        centerp.add(new JLabel());
        centerp.add(bt_left_all);
        centerp.add(new JLabel());
        centerp.add(new JLabel());
        centerp.add(bt_right);
        centerp.add(new JLabel());
        centerp.add(new JLabel());
        centerp.add(bt_right_all);
        centerp.add(new JLabel());
        // centerp.add(new JLabel());centerp.add(new JLabel());centerp.add(new
        // JLabel());
    
        setTitle("Item움직이기");
        setLayout(new GridLayout(1, 3));
        add(leftp);
        add(centerp);
        add(rightp);
    
        setSize(600, 300);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    
        eventUp();
    }// 생성자
    private void eventUp() //이벤트 소스 등록
    {
        //버튼
        bt_left.addActionListener(this); // bt_left에 액션을 감지하다가 핸들러 호출.
        bt_left_all.addActionListener(this); // bt_left에 액션을 감지하다가 핸들러 호출.
        bt_right.addActionListener(this); // bt_left에 액션을 감지하다가 핸들러 호출.
        bt_right_all.addActionListener(this); // bt_left에 액션을 감지하다가 핸들러 호출.
    
        //텍스트필드
        left_tf.addActionListener(this);
        right_tf.addActionListener(this);
    
    }
    @Override
    public void actionPerformed(ActionEvent e) // 핸들러(기능추가)
    {
        //액션 : 버튼누르기 , 텍스트필드에 enter입력
    //        System.out.println("테스트");
        Object ob = e.getSource();  //이벤트 발생시킨 이벤트소스의 주소 얻기
    
        if(ob == left_tf) //주소 비교
        {
            //1. 데이터 얻기
            String str = left_tf.getText();
            if(str.trim().length()<1) //str이 공백과 같다면
            {
    
                return;
            }
            //2. 데이터 복사
            left_list.add(str);
            //3. 원본데이터 삭제
            left_tf.setText("");
        }
        else if(ob == right_tf) //주소 비교
        {
            //1. 데이터 얻기
            String str = right_tf.getText();
            if(str.trim().length()<1)
            {
                return;
            }
            //2. 데이터 복사
            right_list.add(str);
            //3. 원본데이터 삭제
            right_tf.setText("");
        }
        else if(ob == bt_left) //주소 비교 , 첫번째 버튼(bt_left) 클릭시
        {
            String str = right_list.getSelectedItem();
    
            if(str == null)
            {
    //                JOptionPane.showMessageDialog(Component parentComponent, Objectmessage);
    //                parentComponent : 대화상자가 올려지는 바탕(기준) 콤포넌트
                //messate : 전달메세지
                JOptionPane.showMessageDialog(right_list, "이동할 아이템 선택!");
                return; // 현재 메소드 종료
            }
            left_list.add(str);
            right_list.remove(str);
        }
    
        else if(ob == bt_left_all) //주소 비교
        {
            for(int i = 0; i<right_list.getItemCount(); i++)
            {
                System.out.println(" getItem ( " + i + " )  = "  +right_list.getItem(i));
                left_list.add(right_list.getItem(i));
            }
            right_list.removeAll(); // 복사가 전체 끝난 후 원본 리스트 전체 데이터 지우기
        }
        else if(ob == bt_right) //주소 비교
        {
            String str = left_list.getSelectedItem();
            if(str == null)
            {
    //                JOptionPane.showMessageDialog(Component parentComponent, Objectmessage);
    //                parentComponent : 대화상자가 올려지는 바탕(기준) 콤포넌트
                //messate : 전달메세지
                JOptionPane.showMessageDialog(right_list, "이동할 아이템 선택!");
                return; // 현재 메소드 종료
            }
            right_list.add(str);
            left_list.remove(str);
        }
        else //주소 비교
        {
            for(int i = 0; i<left_list.getItemCount(); i++)
            {
                System.out.println(" getItem ( " + i + " )  = "  +left_list.getItem(i));
                right_list.add(left_list.getItem(i));
            }
            left_list.removeAll(); // 복사가 전체 끝난 후 원본 리스트 전체 데이터 지우기
        }
    
    }//actionPerformed
    
    public static void main(String[] args)
    {
        new ItemMoveTest();
    }
    
    }
    
  • //JList 사용
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.GridLayout;
    import java.awt.List;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Vector;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    
    public class ItemMoveTest2 extends JFrame implements ActionListener{
     JList<String> left_list, right_list;
    
     JTextField left_tf, right_tf;
     JButton bt_right,bt_right_all, bt_left, bt_left_all;
    
     JPanel leftp, centerp, rightp;
    
     JScrollPane left_scrol, right_scrol;
     //스크롤바가 지원되는 패널 --->  보통 JList, JTextArea, JTable과 함께 사용
    
     //JList는 데이터를 String[] 또는 Vector로 따로 분리해서 저장!!
     Vector<String> leftV;//좌측 JList가 담을 데이터를 표현   
     Vector<String> rightV;//우측 JList가 담을 데이터를 표현   
    
     public ItemMoveTest2() {
      leftV = new Vector<String>();
      rightV = new Vector<String>();
    
        left_list = new JList<String>();
        //left_scrol = new JScrollPane(스크롤바를 필요로 하는 컴포넌트);
        left_scrol = new JScrollPane(left_list);
        /*
    
        <JList에 데이터 추가방법>
        left_list.setListData(String[] listData);
        left_list.setListData(Vector listData);
    
        */
    
    //      String[] listData = {"홍길동","길라임","김주원",
    //              "홍길동","길라임","김주원",
    //              "홍길동","길라임","김주원",
    //              "홍길동","길라임","김주원",
    //              "홍길동","길라임","김주원",
    //              "홍길동","길라임","김주원",
    //              "홍길동","길라임","김주원",
    //              "홍길동","길라임","김주원"              
    //                           };
    //      left_list.setListData(listData);
    
    
    
    
        right_list = new JList<String>();
        right_scrol = new JScrollPane(right_list);
    
    //      Vector<String> v = new Vector<>();
    //       v.add("김유신");
    //       v.add("이순신");
    //       v.add("강감찬");
    //      right_list.setListData(v);  
    
    
        left_tf = new JTextField();     
        right_tf = new JTextField();
    
        //'ㅁ'한글입력 - 한자키 누름
        //확장된 부호찾기 - ▷ ▶ ◁ ◀
        bt_right = new JButton("▷");
        bt_right_all = new JButton("▶");
        bt_left = new JButton("◁");
        bt_left_all = new JButton("◀");
    
        leftp = new JPanel();
          leftp.setLayout(new BorderLayout());
          //leftp.add("Center",left_list);//JList붙이기
          leftp.add("Center",left_scrol);//스크롤바가 있는 JList붙이기
          leftp.add("South",left_tf);
    
        rightp = new JPanel();
          rightp.setLayout(new BorderLayout());
          //rightp.add("Center",right_list);
          rightp.add("Center",right_scrol);
          rightp.add("South",right_tf);
    
        centerp = new JPanel();
          centerp.setBackground(Color.YELLOW);
          centerp.setLayout(new GridLayout(6,3,10,10));
          centerp.add(new JLabel());centerp.add(new JLabel());centerp.add(new JLabel());
          centerp.add(new JLabel());centerp.add(bt_right);     centerp.add(new JLabel());
          centerp.add(new JLabel());centerp.add(bt_right_all); centerp.add(new JLabel());
          centerp.add(new JLabel());centerp.add(bt_left);    centerp.add(new JLabel());
          centerp.add(new JLabel());centerp.add(bt_left_all);centerp.add(new JLabel());
          //centerp.add(new JLabel());centerp.add(new JLabel());centerp.add(new JLabel());
    
    
        setTitle("Item움직이기");
        setLayout(new GridLayout(1,3));
        add(leftp);
        add(centerp);
        add(rightp);
    
        setSize(600, 300);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    
        eventUp();
     }//생성자
    
     private void eventUp() {//이벤트 소스 등록
      //버튼
      bt_left.addActionListener(this);//bt_left에 액션을 감지하다가 핸들러 호출.
      bt_left_all.addActionListener(this);
      bt_right.addActionListener(this);
      bt_right_all.addActionListener(this);
    
      //텍스트필드
      left_tf.addActionListener(this);
      right_tf.addActionListener(this);
     }
    
    @Override
     public void actionPerformed(ActionEvent e) {//핸들러(기능추가)
        //액션: 버튼누르기, 텍스트필드에 enter입력
      //System.out.println("action");   
      Object ob = e.getSource();//이벤트 발생시킨 이벤트소스의 주소 얻기.
        if(ob==left_tf) {//좌측 텍스트필드에 엔터입력시
         //1.데이터 얻기
          String str = left_tf.getText();
    
          if(str.trim().equals("")) {//str이 공백과 같다면!!
              left_tf.setText("");
              return;
          }       
    
         //2.데이터 복사
          leftV.add(str);//벡터에 담고
          left_list.setListData(leftV);//벡터 데이터를 JList에 반영
    
         //3.원본데이터 삭제
          left_tf.setText("");
      }else if(ob==right_tf) {//우측 텍스트필드에 엔터입력시
         //1.데이터 얻기
          String str = right_tf.getText();
    
          if(str.trim().length()<1) {//str이 공백과 같다면!!
              right_tf.setText("");
              return;
          }
    
         //2.데이터 복사   
    
         //3.원본데이터 삭제
          right_tf.setText("");
      }else if(ob==bt_right) {//첫번째버튼(bt_left) 클릭시
         //1.(선택된아이템) 데이터 얻기
          String str = left_list.getSelectedValue();
                      //선택된 아이템이 없을시 null 리턴!!
    
          if(str==null) {
            //JOptionPane.showMessageDialog(Component parentComponent,Object message);
            //parentComponent: 대화상자가 올려지는 바탕(기준) 컴포넌트
            //message: 전달 메시지
              //JOptionPane.showMessageDialog(left_list,"이동할 아이템 선택!!");  
              JOptionPane.showMessageDialog(this,"이동할 아이템 선택!!");  
             return;//현재 메소드 종료!!
          }
    
         //2.데이터 복사 (우측 Vector에 전달)
            rightV.add(str);//오른쪽 벡터에 데이터 추가
            right_list.setListData(rightV);//벡터값을 오른쪽리스트에 전달(반영)
    
         //3.원본데이터 삭제
            leftV.remove(str);//왼쪽 벡터에 데이터 삭제
            left_list.setListData(leftV);//벡터값을 왼쪽리스트에 전달(반영)
    
    
      }else if(ob==bt_right_all) {//두번째버튼(bt_left_all) 클릭시
          //벡터 사이에서 데이터 전달
            //왼쪽벡터 데이터   ---------->  오른쪽벡터 데이터
          for(int i=0; i<leftV.size(); i++) {
             rightV.add(leftV.get(i));
          }
    
          //왼쪽벡터 데이터 전체 삭제
          leftV.clear();
          //--------------------------------------------
    
    
          //각 리스트는 변경된 벡터내용을 refresh!!
          left_list.setListData(leftV);
          right_list.setListData(rightV);
    
    
    
      }else if(ob==bt_left) {//세번째버튼(bt_right) 클릭시
        //1.(선택된아이템) 데이터 얻기
          String str = "";
    
          if(str==null) {//선택된 아이템이 없다면
              JOptionPane.showMessageDialog(this,"이동할 아이템 선택!!");  
              return;//현재 메소드 종료!!
          }
    
         //2.데이터 복사   
    
         //3.원본데이터 삭제
    
    
      }else {//if(ob==bt_left_all) {//네번째버튼(bt_right_all) 클릭시
    //          for(int i=0; i<right_list.getItemCount(); i++) {
    //              left_list.add(right_list.getItem(i));//1,2
    //          }       
          right_list.removeAll();//3.복사가 전체 끝난 후  원본 리스트 전체 데이터를 지우기.
    
      }
    
     }//actionPerformed
    
     public static void main(String[] args) {
      new ItemMoveTest2();
     }
    }
  • awt는 자동 스크롤바 지원, 스윙에서는 JScrollPane 사용해 주어야 한다.

궁금상자
    - 스윙 어디서 쓰이는걸까?
    - setBounds
    - GridLayout, BorderLayout

190426_Day15 복습, 이벤트 처리

복습

class Child
{
    Child()
    {
        My m = new My();
        m.goodChoice( this );
    }
    public void hello()
    {
        System.out.print("hi");
    }
    public static void main(String[] args)
    {
        Child c = new Child();
    }
}
Class My
{
    void goodChoice(Child c)
    {
        Child c = new Child();
        c.hello();
    }
}
  • <이벤트처리>

    • 사건이 발생했을 때 기능을 부여하는 것

    • 컴포넌트에서 사건(버튼, 스크롤바, 체크박스, 마우스 움직임) 발생시 기능 부여하는것

    • 이벤트 처리는 어떻게? 내가 기능부여할 컴포넌트 선정!

    class My
    {
        Frame f;
        Button bt_hello, bt_exit;
        Checkbox cb_apple;
    }
    • bt_hello, bt_exit list

    • 자료형은 Button, List 컴포넌트

    • API 문서 찾기 (각 클래스내에서 메소드 add Listener 찾기)

    • Button : addActionListener(ActionListener l)

    • List : addItemListener(ItemListener l)

    • 인터페이스 상속!!

    • 인터페이스 내의 선언된 메소드를 My클래스에서 구현(오버라이딩)

    • class My implements ActionListener, ItemListener
      {
        //implements 구현의 약속
        public void actionPerformed(ActionEvent e)
        {
      
        }
      }
    • -
package j0426;

import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class WindowCloseTest extends Frame implements WindowListener
{
    public WindowCloseTest()
    {
        setTitle("창닫기 테스트");
        setSize(300,300);
        setVisible(true);

        addWindowListener(this);
    }//생성자

    //우리는 얘만 필요해!
    public void windowClosing(WindowEvent e)
    {
        System.out.println( "X버튼 클릭" );
        //프로그램 종료 => System.exit(정수); 정수:0 양수[정상] 또는 음수[비정상종료]
//      System.exit(0);
    }

    public void windowOpened(WindowEvent e){}
    public void windowClosed(WindowEvent e){}
    public void windowIconified(WindowEvent e){}
    public void windowDeiconified(WindowEvent e){}
    public void windowActivated(WindowEvent e){}
    public void windowDeactivated(WindowEvent e){}

    public static void main(String[] args)
    {
        new WindowCloseTest();
    }
}
package j0426;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class WindowCloseTest2 extends WindowAdapter
{
    Frame f; // extends 저걸 했으니 Frame 이렇게 해줘야 함

    public WindowCloseTest2()
    {
        f = new Frame("창닫기 테스트2");
        f.setSize(300,500);
        f.setVisible(true);

        f.addWindowListener(this); // f : 이벤트소스, windowClosing() : 이벤트 핸들러
    }

    @Override
    public void windowClosing(WindowEvent e)
    {
        System.out.println("프레임 창 닫기");
        System.exit(0);
    }

    public static void main(String[] args)
    {
        new WindowCloseTest2();
    }
}
package com.encore.j0426;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import com.encore.j0425.ButtonEventTest;

//프레임창 우측상단의 X버튼 구현
public class WindowCloseTest3 extends Frame {


   public WindowCloseTest3() {
      setTitle("창닫기테스트3"); 

      setSize(300,300);
      setVisible(true);

      //My m = new My();
      //addWindowListener(m);//프레임과 밑에 추가된 핸들러를 연결!!

      //addWindowListener(new My());


      //익명의 내부클래스(Anonymous InnerClass)
      /*
       addWindowListener(             
               //extends WindowAdapter
                new WindowAdapter()
               {//클래스 시작

                    @Override
                    public void windowClosing(WindowEvent e) {
                      System.out.println("X버튼클릭(세번째)~!!");
                      System.exit(0);
                    }
                }//클래스 끝
        );
       */
       addWindowListener(new WindowAdapter() {//익명의 내부클래스 시작!!
           @Override
           public void windowClosing(WindowEvent e) {
             System.out.println("쉬었다 합시다~!!^^");  
             System.exit(0);
           }
       });

   }//생성자




   public static void main(String[] args) {
      new WindowCloseTest3();//프레임 객체 생성
   }

}
package j0426;


import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;


//프레임창 우측상단의 X버튼 구현
public class WindowCloseTest3 extends Frame {


   public WindowCloseTest3() {
      setTitle("창닫기테스트3"); 

      setSize(300,300);
      setVisible(true);

      //My m = new My();
      //addWindowListener(m);//프레임과 밑에 추가된 핸들러를 연결!!

      //addWindowListener(new My());


      //익명의 내부클래스(Anonymous InnerClass)
      /*
       addWindowListener(             
               //extends WindowAdapter
                new WindowAdapter()
               {//클래스 시작

                    @Override
                    public void windowClosing(WindowEvent e) {
                      System.out.println("X버튼클릭(세번째)~!!");
                      System.exit(0);
                    }
                }//클래스 끝
        );
       */
       addWindowListener(new WindowAdapter() {//익명의 내부클래스 시작!!
           @Override
           public void windowClosing(WindowEvent e) {
//           System.out.println("쉬었다 합시다~!!^^");  
//           System.exit(0);
              //현재 프레임의 타이틀을 '불타는 금요일'로 변경하시오
               setTitle("불타는 금요일");

           }
       });

   }//생성자




   public static void main(String[] args) {
      new WindowCloseTest3();//프레임 객체 생성
   }

}
package j0426;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

//CardLayout테스트( 컴포넌트를 같은 위치에 부착)
public class CardTest implements ActionListener{
   Frame f;

   Panel redp, bluep, yellowp;//색깔패널
   Button bt1,bt2,bt3;//다음 버튼

   Panel card1,card2,card3;//카드

   CardLayout card;

   public CardTest() {
      f = new Frame("카드레이아웃");

      redp = new Panel();
       redp.setBackground(Color.RED);
      bluep = new Panel();
       bluep.setBackground(Color.BLUE);
      yellowp = new Panel();
       yellowp.setBackground(Color.YELLOW);

      bt1 = new Button("다음"); //301호
      bt2 = new Button("다음"); //302호
      bt3 = new Button("다음"); //303호

      card1 = new Panel();
        card1.setLayout(new BorderLayout(0, 10));
        card1.add("Center",redp);
        card1.add("South",bt1);

      card2 = new Panel();
        card2.setLayout(new BorderLayout(0, 10));
        card2.add("Center",bluep);
        card2.add("South",bt2);

      card3 = new Panel();
        card3.setLayout(new BorderLayout(0, 10));
        card3.add("Center",yellowp);
        card3.add("South",bt3);

      card =  new CardLayout();
      f.setLayout(card);
        f.add(card1,"first");//처음에 보이는 카드!!
        f.add(card2,"second");
        f.add(card3,"third");
      //f.add(붙일 컴포넌트, 별명);   alias별명

      //card.show (Container parent, String name);  
      // 를    보여라                 어디에                  무엇을(별명)
      card.show(f, "third");

      f.setSize(250,300);  
      f.setVisible(true);

      f.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
              System.exit(0);
           }
       });

      bt1.addActionListener(this);
      bt2.addActionListener(this);
      bt3.addActionListener(this);

   }//생성자

   @Override
   public void actionPerformed(ActionEvent e) {//이벤트 핸들러
      Object ob = e.getSource();//이벤트 소스의 주소(bt1 또는 bt2 또는 bt3의 주소)  
      //ob=301호 

      //첫번째버튼 눌렀을때 - 두번째 카드보이기
      if(ob == bt1) 
       card.show(f,"second");
      //두번째버튼 눌렀을때 - 세번째 카드보이기
      else if(ob == bt2)
       card.show(f,"third");
      //세번째버튼 눌렀을때 - 첫번째 카드보이기
      else //if(ob == bt3)
       card.show(f,"first");
   }
   public static void main(String[] args) {
       new CardTest();
   }

}
package j0426;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class HelloEventTest extends Frame implements ActionListener
{

    Button bt_hello, bt_clear, bt_exit;
    Checkbox cb1, cb2, cb3;
    TextField tf;
    Panel northp, centerp, southp;
    CheckboxGroup cg;

    public HelloEventTest()
    {
        setTitle("안녕이벤트");

        cg = new CheckboxGroup();
        bt_hello = new Button("안녕");
        bt_clear = new Button("지우기");
        bt_exit = new Button("종료");
        cb1 = new Checkbox("자바초급", cg, true );
        cb2 = new Checkbox("자바중급", cg, false );
        cb3 = new Checkbox("자바고급", cg, false );
        tf = new TextField(15);
        northp = new Panel();
        southp = new Panel();
        centerp = new Panel();


        northp.setLayout(new FlowLayout());
        northp.add(tf);
        northp.setBackground(Color.YELLOW);

        centerp.setLayout(new GridLayout(3, 1));
        centerp.add(cb1);
        centerp.add(cb2);
        centerp.add(cb3);

        southp.setLayout(new FlowLayout());
        southp.add(bt_hello);
        southp.add(bt_clear);
        southp.add(bt_exit);
        southp.setBackground(Color.RED);




        setLayout(new BorderLayout(3,1));
        add("North",northp);
        add("Center",centerp);
        add("South",southp);

        setSize(500,300);
        setVisible(true);


        eventUp();


    }//생성자

    private void eventUp()//이벤트 등록( 이벤트 소스의 수가 많을 때 )
    {
        //=======버튼=============
        bt_hello.addActionListener(this);
        bt_clear.addActionListener(this);
        bt_exit.addActionListener(this);

        //=======프레임============

        addWindowListener(new WindowAdapter() 
        {
           @Override
           public void windowClosing(WindowEvent e) 
           {
              System.exit(0);
           }
       });


    } //eventUp

    @Override
    public void actionPerformed(ActionEvent e)
    {   
        Object ob = e.getSource();

        //<데이터문자열> => String Label Text
        if(ob == bt_hello) {
            tf.setText("안녕");
        }else if(ob == bt_clear) {
            tf.setText("");
        }else {
        System.exit(0);
        }
    }

    public static void main(String[] args)
    {
        new HelloEventTest();   
    }
}
package com.encore.j0426;

import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class HelloEventTest extends Frame implements ActionListener{
  TextField tf;
  Checkbox cb1, cb2, cb3;
  Button bt_hello, bt_clear, bt_exit;

  Panel northp, centerp, southp;

  CheckboxGroup grade;

  public HelloEventTest() {
    setTitle("안녕이벤트");

    tf = new TextField(15);

    grade = new CheckboxGroup();


    cb1 = new Checkbox("자바초급",grade,true);
    cb2 = new Checkbox("자바중급",grade,false);
    cb3 = new Checkbox("자바고급",grade,false);

    bt_hello = new Button("안녕");
    bt_clear = new Button("지우기");
    bt_exit = new Button("종료");

    northp = new Panel();
    northp.setBackground(Color.YELLOW);
      northp.add(tf);

    centerp = new Panel();
    centerp.setLayout(new GridLayout(3,1));
      centerp.add(cb1);
      centerp.add(cb2);
      centerp.add(cb3);

    southp = new Panel();
    southp.setBackground(Color.PINK);
      southp.add(bt_hello);
      southp.add(bt_clear);
      southp.add(bt_exit);

    add("North",northp);
    add("Center",centerp);
    add("South",southp);

    setSize(300,300);
    setVisible(true);


    eventUp();
  }//생성자

  private void eventUp() {//이벤트 등록(이벤트 소스의 수가 많을 때)
      //============버튼==========================
      bt_hello.addActionListener(this);
      bt_clear.addActionListener(this);
      bt_exit.addActionListener(this);

      //============프레임==========================
      addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
              System.exit(0);            
           }});
  }//eventUp

  @Override
  public void actionPerformed(ActionEvent e) {//이벤트 핸들러 (기능 추가)
     //System.out.println("action!!");
     Object ob = e.getSource();//이벤트를 발생시킨 소스의 참조변수(주소)를 얻어오기
     //ob= (bt_hello 또는 bt_clear 또는 bt_exit의 주소)


     //<데이터 문자열> ---> String, Label, Text

     //(메모리)주소비교  :  ==   !=
     if(ob==bt_hello) {//안녕 버튼클릭시
         //System.out.println("텍스트값:"+tf.getText());
        /* 
        if(cb1.getState()) //자바초급 Checkbox가 선택되었다면
         tf.setText("자바초급안녕~!!");
        else if(cb2.getState())
         tf.setText("자바중급안녕~!!");
        else //if(cb3.getState())
         tf.setText("자바고급안녕~!!");
        */
      Checkbox cb = grade.getSelectedCheckbox();//체크박스 그룹안에서 선택된 체크박스 얻어오기;  
        //cb = 선택에 따라  cb1, cb2, cb3
           tf.setText(cb.getLabel()+"안녕~!!!");
       /*
        if(cb==cb1) //자바초급 Checkbox가 선택되었다면
             tf.setText("자바초급안녕~!!");
        else if(cb==cb2)
             tf.setText("자바중급안녕~!!");
        else //if(cb==cb3)
             tf.setText("자바고급안녕~!!");
        */

     }else if(ob==bt_clear) {//지우기 버튼 클릭시
         //tf.setText(null);
         tf.setText("");

     }else {//if(ob==bt_exit)  종료 버튼 클릭시
         System.exit(0);
     }
  }//actionPerformed

  public static void main(String[] args) {
      new HelloEventTest();
  }
}
package j0426;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Scrollbar;
import java.awt.TextArea;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

//이벤트 소스: Scrollbar
// API  ----> addAdjustmentListener(AdjustmentListener l)

public class ColorChange extends Frame implements AdjustmentListener{
   Scrollbar sb_red, sb_blue, sb_green; 
   TextArea ta; 

   Panel bigp, p1,p2,p3;


   public ColorChange() {
     setTitle("색바꾸기");     

     //new Scrollbar(orientation, value, visible, minimum, maximum)
     sb_red = new Scrollbar(Scrollbar.HORIZONTAL,0,10,0,265);
     sb_blue = new Scrollbar(Scrollbar.HORIZONTAL,0,10,0,265);
     sb_green = new Scrollbar(Scrollbar.HORIZONTAL,0,10,0,265);

     ta = new TextArea();
      ta.setBackground(Color.black);

     p1 = new Panel();
     p2 = new Panel();
     p3 = new Panel();

     bigp = new Panel();

     //속성지정
     p1.setLayout(new BorderLayout());
      p1.add("West",new Label("빨강"));
      p1.add("Center",sb_red);

     p2.setLayout(new BorderLayout());
      p2.add("West",new Label("파랑"));
      p2.add("Center",sb_blue);

     p3.setLayout(new BorderLayout());
      p3.add("West",new Label("초록"));
      p3.add("Center",sb_green);

     bigp.setLayout(new GridLayout(5,1,0,10));
      bigp.setBackground(Color.orange);
      bigp.add(new Label());
      bigp.add(p1);
      bigp.add(p2);
      bigp.add(p3);

     setLayout(new GridLayout());
      add(bigp);
      add(ta);

     setSize(600,300);
     setVisible(true);

     eventUp();
   }//생성자 

   private void eventUp() {//이벤트 소스 등록
      sb_red.addAdjustmentListener(this); 
      sb_blue.addAdjustmentListener(this); 
      sb_green.addAdjustmentListener(this); 

      addWindowListener(new WindowAdapter(){//익명의 내부클래스 
           public void windowClosing(WindowEvent e) {
               System.exit(0);}});

   }

   @Override
   public void adjustmentValueChanged(AdjustmentEvent e) {//이벤트 핸들러
      System.out.println("adjust!!");
      //기능 추가
      int r = sb_red.getValue(); //빨강 스크롤바의 조절바 위치값 얻어오기
      int b = sb_blue.getValue(); //파랑 스크롤바의 조절바 위치값 얻어오기
      int g = sb_green.getValue(); //초록 스크롤바의 조절바 위치값 얻어오기

      System.out.println("red="+ r+", green="+g+", blue="+b);
      /*
        <TextField tf에게  텍스트 주기>
           tf.setText("전달문자열");
        <TextAread ta에게  텍스트 주기>
           ta.setText("전달문자열"); - 이전텍스트 clear, 새로운 텍스트를 덮어쓰기
           ta.append("전달문자열");  - 이전텍스트에 이어쓰기
       */

      //ta.setText("red="+ r+", green="+g+", blue="+b);
      ta.append("red="+ r+", green="+g+", blue="+b+"\n");

      ta.setBackground(new Color(r,g,b));

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

}

190425_Day14 복습,

버튼

  • checkbox

  • GUI => AWT => SWING


package Mission;

import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;


public class CheckboxTest extends Frame
{
    Checkbox cb1, cb2, cb3, cb4;
    Label la;
    TextArea ta;

    Panel northp, southp;

    CheckboxGroup genderGroup;


    public CheckboxTest(String title)
    {
        super(title);

        genderGroup = new CheckboxGroup();

        cb1 = new Checkbox("사과");
        cb1.setBackground(new Color(10, 200, 30));
        cb2 = new Checkbox("딸기");
        cb2.setBackground(new Color(10, 200, 30));

        cb3 = new Checkbox("남자", genderGroup, true);
        cb3.setBackground(new Color(220, 100, 30));
        cb4 = new Checkbox("여자", genderGroup, false);
        cb4.setBackground(new Color(220, 100, 30));

        la = new Label("성별  :  ");
        ta = new TextArea();

        Panel northp = new Panel();
        //northp.setLayout( new FlowLayout ( ) ); // 기본이 Flow라 생략 가능
        Panel southp = new Panel();

        northp.add("사과",cb1);
        northp.add("딸기",cb2);
        northp.setBackground(new Color(10, 200, 30));

        southp.add(la);
        southp.add("남자",cb3);
        southp.add("여자",cb4);
        southp.setBackground(new Color(220, 100, 30));


//      setLayout(new BorderLayout()); //기본이라 생략 가능
        //보더 레이아웃의 경우에는 컴포넌트를 붙일 위치를 지정.
        add("North", northp);
        add("Center", ta);
        add("South", southp);

        //마무리( 프레임사이즈, 보이기 )
        setSize(300,300);
        setVisible(true);   
    }

    public static void main(String[] args) 
    {
        new CheckboxTest("체크박스테스트");
    }
}

package j0425;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//Frame에 FlowLayout을 설정
//Frame에 두개의 버튼을 배치하시오
//두개의 버튼의 변수명 : bt1(라벨 : "안녕"), bt2(라벨 : "잘가")
//bt1클릭시 화면 콘솔에 "안녕"을 출력하시오
//bt2클릭시 화면 콘솔에 "잘가"를 출력하시오



public class ButtonEventTest extends Frame implements ActionListener
{
    Button bt1,bt2;
    Label la1,la2;

    public ButtonEventTest()
    {
        bt1 = new Button("버튼1");
        bt2 = new Button("버튼2");
        la1 = new Label("안녕");
        la2 = new Label("잘가");

        setLayout(new FlowLayout());

        add(la1);
        add(bt1);
        add(la2);
        add(bt2);


        setSize(300,300);
        setVisible(true);

        //소스 <= 연결자 => 핸들러
        bt1.addActionListener(this);
        bt2.addActionListener(new C());
    }
        /*
         * public class Button
         * {
         *      public void addActionListener(ActionListener 1)
         *      {
         *          while(true)
         *          {
         *              if(버튼이 눌렸다면)
         *              {
         *                  l.actionPerformed();
         *              }
         *          }
         *      }
         * }
         */
    //생성자

    @Override
    public void actionPerformed(ActionEvent e) // 이벤트 핸들러 
    {//사건 발생시 실행할 기능 정의 

            System.out.println("안녕~!!");
//          System.out.println("잘가~!!");

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

    }


}

/===
package j0425;

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

public class C implements ActionListener
{

    @Override
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("잘가~!!");

    }

}
//이렇게도 가능 문자열 비교
package j0425;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//Frame에 FlowLayout을 설정
//Frame에 두개의 버튼을 배치하시오
//두개의 버튼의 변수명 : bt1(라벨 : "안녕"), bt2(라벨 : "잘가")
//bt1클릭시 화면 콘솔에 "안녕"을 출력하시오
//bt2클릭시 화면 콘솔에 "잘가"를 출력하시오



public class ButtonEventTest extends Frame implements ActionListener
{
    Button bt1,bt2;
    Label la1,la2;

    public ButtonEventTest()
    {
        bt1 = new Button("버튼1");
        bt2 = new Button("버튼2");
        la1 = new Label("안녕");
        la2 = new Label("잘가");

        setLayout(new FlowLayout());

        add(la1);
        add(bt1);
        add(la2);
        add(bt2);


        setSize(300,300);
        setVisible(true);

        //소스 <= 연결자 => 핸들러
        bt1.addActionListener(this);
//      bt2.addActionListener(new C());
        bt2.addActionListener(this);
    }
        /*
         * public class Button
         * {
         *      public void addActionListener(ActionListener 1)
         *      {
         *          while(true)
         *          {
         *              if(버튼이 눌렸다면)
         *              {
         *                  l.actionPerformed();
         *              }
         *          }
         *      }
         * }
         */
    //생성자

    @Override
    public void actionPerformed(ActionEvent e) // 이벤트 핸들러 
    {//사건 발생시 실행할 기능 정의 
        String str = e.getActionCommand();
        if(str.equals("버튼1"))
        {
            System.out.println("안녕~!!");
        }
        if(str.equals("버튼2")) 
        {
            System.out.println("잘가~!!");
        }
    }
    public static void main(String[] args)
    {
        new ButtonEventTest();

    }


}
//선생님 추천 코드
package com.encore.j0425;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/*
   <이벤트처리> ---> 컴포넌트에 기능을 정의하자!!

  1. 이벤트소스(컴포넌트)에 적용할 이벤트 분석  
         Button  bt    ------> ActionEvent 

  2. ActionListener(인터페이스)  ------>  implements ActionListener 
  3. public void actionPerformed(ActionEvent e){}  ===> 오버라이딩

  4. 연결자메소드 등록         [이벤트소스]  <------- 연결 ------->  [이벤트처리부]
          이벤트소스명.add인터페이스명(이벤트처리부의 위치);
           bt.addActionListener(this);

  <이벤트처리 방법>
  1. 기능을 적용할 컴포넌트 찾기(이벤트 소스 찾기!!): bt1, bt2
                                          ---------- 
                                                                          자료형  Button

  2. Button(이벤트소스)클래스의 메소드 중 add~Listener()메소드 찾기!!
                                ==> addActionListener() !!

  3. 인터페이스 (add제거) ==> ActionListener  : implements 하기!!
                                              ===> 메소드 오버라이딩 (이벤트 핸들러:기능정의)

  4. 연결자 등록!!  (2번의 add~Listener()메소드!! )                                                                                                                                                           
*/


public class ButtonEventTest extends Frame  implements ActionListener{
   Button bt1,bt2;//[이벤트 소스]

   public ButtonEventTest() {
      setTitle("버튼이벤트"); 
      bt1 = new Button("안녕");//203호
      bt2 = new Button("잘가");//303호


      setLayout(new FlowLayout());
      add(bt1);
      add(bt2);

      setSize(300,300);
      setVisible(true);

      //  소스  <----연결----> 핸들러
      //이벤트소스명.add~Listener(핸들러위치);
      bt1.addActionListener(this);
      //C c = new C();
      //bt2.addActionListener(new C());//(c);
      bt2.addActionListener(this);


      /*
         public class Button{

            public void addActionListener(ActionListener l){
                while(true){

                    if(버튼이 눌렸다면){
                        l.actionPerformed(이벤트소스의 정보);  
                    }

                }           
            }
         }    
      */


   }//생성자

   @Override
   public void actionPerformed(ActionEvent e) {//[이벤트 핸들러]
      //사건 발생시 실행할 기능 정의. 

      String str = e.getActionCommand(); //버튼의 라벨 문자열 얻기 
      //System.out.println("STR="+ str); 

      Object ob = e.getSource();
      //==> 이벤트를 발생시킨 컴포넌트(EventSource)의 주소를 리턴하는 메소드
      //'안녕'버튼 클릭시 Object ob = 203호;  Object ob = bt1;
      //'잘가'버튼 클릭시 Object ob = 303호;  Object ob = bt2;

      //if(str.equals("안녕"))
      if(ob==bt1) //주소를 비교
          System.out.println("안녕~!!");//0,1
      //if(str.equals("잘가"))
      else if(ob==bt2)
          System.out.println("잘가~!!");//0,1
   }

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

}

190424_Day13 복습, 예외처리, 오버라이딩, 내부클래스

복습

  • 예외

    • 프로그램 실행 중 발생하는 예기치 않은 사건 => 예외

    • 예외가 발생시 어떤 처리(대응)를 할지 추가코드 작성

    • 예외처리 : 자바언어를 더욱 강하게(robust)만드는 요소

    • 개발자 입장 : 코드량 증가

    • 사용자 입장 : 신뢰성 증가

    void hello() throws Exception
    {
        문장1;
        문장2;
        문장3;
    }
    //예외처리 전가!
    public static void main( String [] args)
    {
        hello();
    }
    • 예외처리 구문1 : try catch문
    void hello()
    {
        try
        {
        문장1;//AException 발생 가능성
        문장2;
        문장3;//BException 발생 가능성
    
        }catch(AException e)
        {
        } catch( )
        {
    
        }
    }
    //마치 if문 같은 느낌
    //e는 식별자이름규칙처럼 그냥 임의로 정해준다.
    //catch문 뒤에 이어서 catch문 작성 가능
    • 예외처리 구문2 : finally블럭

    • 혼자 사용 못하고 try catch랑 같이 사용

      void hello()
      {
        try
        {
            문장1;
            AException발생 가능 문장2;
            문장3;
            BException발생 가능 문장 4;
            문장5;
        }catch(AException e){문장6;}
        catch(BException e){문장 7;}
      }
      
      //예외발생 안함 (정상실행!) : 1;2;3;4;5;
      //AException발생! : 1; 6;
      //BException발생! : 1; 2; 3;
      //BException 발생시 만약 상속관계이고 A가 부모, B가 자식이라면 ... 안열림!
      //미션 문장5를 반드시 실행!
      //=> 이럴때 finally{} 사용한다.
      finally // catch문 뒤에
      {
        문장; // 보장해줄게!
      }
    • 에외종류

    • 체크(Checked) 예외

      public ststic void main(String[] args)
      {
        System.in.read();
      }
      //IOEception에러 발생!
      • 컴파일 에러 발생
      • 명시적으로 발생할 수 있는 예외에 대한 처리를 강요!
      • 반드시 try ~ catch 또는 throws를 사용해야함
    • 언체크(UnChecked) 예외

      public static void main( String[] args)
      {
        String []names = { "길동" , "주원" };
        System.out.println(names[3])
      };
      • 개발자실수 또는 사용자 입력데이터 예외

      • 컴파일시 에러가 발생하지 않는다.

      • 특징은 RuntimeException을 상속받는 예외 (자식)클래스!

      • try ~ catch 또는 throws 사용 가능

      • if문을 통해 처리 가능

      • 예)

      String []names = {"길동", "주원"}; //=> 배열 인덱스 0,1 생성
      System.out.println(names[2]); //=>컴파일 시에는 에러가 발생하지 않고 런타임 시 에러 발생
      • 퀴즈) 아래에서 에러가 발생하는 출력문은 무엇일까요?
      int a;
      void method()
      {
          int b;
          int c,d = 0;
          System.out.println(a); //O
          System.out.println(b); //X(에러발생), 변수를 초기화 하지 않았음
          System.out.println(c); //X, 변수를 초기화 하지 않았음
          System.out.println(d); //O
      
          int d,e;
          if(조건식) {d=100;}
          if(조건식) {e=200;}
          else {e = 300}
      
          System.out.println(e); //X, if문 실행 안할수도 있잖아, 초기화 하지 않았음
          System.out.println(f); //O, if문이나 else문 둘 중 하나는 반드시 값에 들어오기 때문에!  
      
          inf g;
      
          try
          {
              f=400;
          }catch(예외클래스명 변수명) {}
      
          System.out.println(names[2]); //X, 컴파일러 입장에서는 try도 if나 마찬가지임, 초기값 없어서 에러
      
      }
      package j0424;
      
      public class UncheckedExceptionTest 
      {
      public static void main(String[] args)
      //예외발생에 대해서 try~catch문 또는 throws를 사용하지 않고 처리하는 방법
      //=>> RuntimeException의 자식 Exception의 경우에만 가능
      {
          String names[] = { "길동", "주원" };
      
          int idx = 1;
          if (idx >= names.length)
          {
              System.out.println("인덱스를 확인하세요");
              return;
          }
      
          System.out.println(names[idx]);
      }
      }
      
      package j0424;
      
      public class UncheckedExceptionTest2
      {
      /*
       * String[] args = {"10", "4"};
       * 
       * su1 su2
       * =======
       * 10   5
       * ab   cd ==> NumberFormatException
       * 10   X ==> ArrayIndexOutofBoundsException
       * 10   0 ==> ArithmeticException
       * 
       */
      
      public static void main(String[] args)
      {
          try
          {
              System.out.println("매개변수로 받은 두개의 수");
              int su1 = Integer.parseInt(args[0]);
              int su2 = Integer.parseInt(args[1]);
              System.out.println("su1 = " + su1 + ", su2 = " + su2 );
              System.out.println("su1의 값을 su2로 나눈 몫" + (su1/su2));
              System.out.println("나눗셈을 잘 실행했니다~!");
          }
              catch (NumberFormatException e) 
          {
              //e : 에러메시지 객체
              e.printStackTrace(); // 문제가 발생한 코드와 연관된 메소드들의 호출 관계를 호출
              System.out.println("-------");
              System.out.println(e.toString()); //e.toString은 자체 프린트 기능은 없다, 예외 종류와 원인을 출력
              System.out.println("-------");
              System.out.println(e.getMessage()); //예외가 발생한 원인만 출력, 
              System.out.println("## 숫자만 입력하세요~!");
              return; // 메소드의 끝괄호 역할
          }catch (ArrayIndexOutOfBoundsException e) 
          {
              System.out.println(" ## 두개의 숫자를 반드시 입력하세요~!! ");
          }catch (ArithmeticException e) 
          {
              System.out.println(" ## 0으로 나눌 수 없습니다~!!");
          }
          //이렇게 안하고?! 이렇게 할 수도 있다!
      
          catch(Exception e)
          {
              System.out.println("모든에외처리" + e );
          }
          finally
          {
              System.out.println("Finally블록 (try 블럭내에서) 예외발생과 상관없이 반드시 실행!");
              //보통 FileSystem객체 또는 DataBase관련된 객체에 대한 반환
              //fr.close();   conn.close();
          }
      
          System.out.println("마지막 문장"); // 굳이 finally 안써도 이렇게 실행이 되네?, 단 리턴등의 값 넣었을때는 안나온다.
          //저런 ArithmeticException 이나 NUmberFormatException 모두 다 Exception에게 상속된것이기에!
          //다만 상황에 따라 다르게 쓰는것, Exception만 쓰면 간결하지만 자세하게 안됨
          //다중catch장점 : 다양한 예외에 대해 각각 알맞은 처리를 할 수 있다
      }//main
      
      }
      
    • < 사용자 정의 예외 >

    • 예외의 발생은 JVM에 의해 실행중 발생할 수도 있지만 사용자 프로그램에서 인위적으로 예외를 발생시킬 수 있다.(throw문을 제공)

    • 형식

      throw 예외객체;
      throw new 예외객체타입(매개변수);
      
      class MyException extends Exception
      {
        public ststic void main(String[] args)
        {
            super(msg);
        }
      }

<오버라이딩(메소드 재정의) 규칙>

class Parent
{
   접근제한자 void hello() throws A,B,C // throws는 책임전가!
   {

   }
}


class Child extends Parent
{
    //오버라이딩 메소드
    //오버라이딩시 주의할 점
    //  1.접근제한자는 부모와 동일한거나 확장해야 한다!
    //  2.throws는 부모와 동일하거나 또는 축소해야 합니다.

   접근제한자 void hello() throws A,B,C 
   {

   }
}
//=================
부모가 public hello(){} // 라면 
자식은 public hello(){} // 자식도 퍼블릭이어야 한다. 퍼블릭 이상은 없으니까!

부모가 protected hello(){} //라면
자식은 protected, public hello(){} //protected 이상이어야 한다.

부모가 hello(){} //라면 자식은 default(생략가능), protected, public
부모가 private 라면 상속 안되니 무효!

부모가 public hello() throws AException, BException, CException {} 이라면

[정상 오버라이딩 throws]
자식 public hello() throws AException, BException, CException {}
자식 public hello() throws AException, BException{}
자식 public hello() throws AException{}
자식 public hello(){}

[에러나는 오버라이딩 throws]
자식 public hello() throws AException, BException, CException, DException {}// 처럼 다 넣어버리면....
자식 public hello() throws Exception{}// 도 마찬가지

<내부클래스(중첩클래스)>

  • 중첩클래스, 포함, Nested

  • 클래스 내에 또 다른 클래스를 구성하는 것.

  • 마치 뻐꾸기 같아,, 남의 집에 터를 잡고 아우터클래스(밖에 있는 클래스)의 메소드를 자기것처럼 써버리는것!

    [public/final/abstract] class A //외부클래스, Outer클래스, Top-level클래스
    {
      //필드
      //생성자
      //메소드
      //1차 자원 정의
    
      [protected, static가능]class B //내부클래스, Inner클래스, [protected, static가능] 외부는 불가
      {
          //2차 자원 정의
      }
    }
  • 보통 이와 같은 경우, 사용자가 내부로 바로 호출하는것이 아니라 외부를 거쳐서 내부를 호출함.

    • 외부 호출할때에는
    A a = new A();
    a.hello();
    • 내부 호출할때에는
    B b = new B();
    b.print();
    package j0424;
    
    
    
    class NestingClass
    {
        int i = 11;
    
        void hello()
        {
            System.out.println( "하이" );
            //외부클래스에서 내부클래스 자원 사용
    //      print();// 바로 에러남!, 내부클래스 직접접근 불가!
            NestedClass Nested = new NestedClass();
            Nested.print();
        }
    
    
        //===============
        class NestedClass //내부(inner) 클래스
        {
            int j = 22;
            void print()
            {
                System.out.println( "프린트~" );
            }
    
            //내부클래스에서 외부클래스 자원 사용!
            void callTest()
            {
                hello();
                System.out.println("i = " + i);
            }
        } //Nested
    }
    
    public class NestedCalssTest
    {   
        public static void main(String[] args)
        {
            //외부클래스에 정의되어있는것 int i , hello(), 내부클래스
            //내부클래스에 정의되어있는것 int j, print()
    
            //외부 클래스의 메소드 호출
            NestingClass nesting = new NestingClass();
            nesting.hello(); // 하이, 프린트~ 같이 출력됨
            System.out.println("=====================");
    
            //내부클래스의 메소드를 main()에서 직접호출 ~! 체크체크~!★
            //=>> 객체생성 : 외부클래스명.내부클래스명 참조변수명 = new 외생성자().new 내부생성자();
            NestingClass.NestedClass nested = new NestingClass().new NestedClass();
            nested.print();
        }
    
    }

인터페이스

  • TUI ( Text User Interface )

    • 프로그램 실행을 Text에 의존해서 실행.
    • ex) 메뉴에서 1을 누르면 추가, 2를 누르면 검색, 3을 누르면 종료
  • AWT( Abstract Window Toolkit )

    • GUI( Graphic User Interface ) 환경을 구축하기 위한 class들의 묶음

    • GUI와 관련된 class들의 묶음. java.awt.*;

      1. Component : Menu, Button, Label, Choice, Checkbox, List, TextField, TextArea, Scrollbar… (전부 앞문자 대문자?! 클래스네!)

      2. Container : Component의 객체를 생성한 후에 그 객체를 배치한다. (여기서는 도화지 판 정도로 생각!, 다른곳에서는 서버 관련 단어로 쓰인다.)

      Object

    ​ |

    ​ Component

    ​ |

    ​ Container

    | |

    Panel Window

    | |

    Applet Frame

    | |

    FlowLayout BorderLayout (Default)

    Panel : display(x) , 한 영역에 두개 이상의 컴포넌트를 붙일때 사용.
    컴포넌트 속성을 지정하기위해 사용.
    Frame : display(o)

    1. Event 처리: Component에 기능을 실제로 부여하는 것.

      • Container의 배치방법(LayoutManager)
        —-> 컴포넌트를 컨테이너에 어떻게 위치시킬지 방법을 정의.
      FlowLayout(가운데 정렬)
    가운데를 기준으로 해서 Component들이 배치.
    (Frame크기에 따라 배치가 변경)
      BorderLayout(방위정렬)
    방위에 따라 사용자가 임의 배치 가능 (동,서,남,북, 중앙)
    상대적으로 큰 영역데 강조할 컴포넌트를 배치.
      GridLayout(같은 크기 정렬, 행열표현 정렬)
    Container의 크기를 같은 크기로 나누어 Component를 붙인다.
      CardLayout(같은 위치 정렬)

    같은 위치에 여러개의 Component를 배치할 때 사용.

    package j0424;
    
    import java.awt.BorderLayout;
    import java.awt.Button;
    import java.awt.Frame;
    
    //BorderLayout : "Center"(주된 데이터, 컴포넌트를 표현)를 기준으로 동서남북 위치를 설정하는것.
    public class BorderTest extends Frame//필요한 객체 ( 컴포넌트, 컨테이너 ) 선언
    {
    Button b1, b2, b3, b4, b5;
    
    public BorderTest(String title)
    {
        //상위클래스 생성자 호출
        super(title); //유의할 점 super는 항상 맨 윗라인에!
        setTitle(" 새로운 타이틀 "); // 위처럼 상위 클래스 생성자 안 부르더라도 괜찮아! setTitle사용하면 위치도, 횟수도 상관이 없어!
    
        //멤머 객체 생성
        b1 = new Button("1");
        b2 = new Button("2");
        b3 = new Button("3");
        b4 = new Button("4");
        b5 = new Button("5");
    
        //속성설정 ( 프레임에 대한 레이아웃, 붙이기 )
    //        this.setLayout( new BorderLayout() );
        setLayout(new BorderLayout());
    
    //        this.add(b1);
        //BorderLayout (방위정렬)의 경우 컴포넌트를 붙일 위치( 동서남북 중앙 ) 를 함께 설정.
        //주의 ) 위치 문자열을 표현 할 때 첫글자 대문자 사용, 철자가 틀리면 에러!
        add("North", b1); //this생략 가능
        add("East",b2);
        add("South",b3);
        add("West",b4);
        add("Center",b5);
    
        //마무리 2개 ( 프레임 사이즈, 프레임 보이기 )
        setSize( 300, 300 );
        setVisible(true);
    
    }//생성자
    
    public static void main(String[] args)
    {
        new BorderTest("Border테스트");
    }
    }
    
    //상속은 부모가 갖는 속성을 다 가져오는것인데 생성자는 안따라 옴! 그래서 super사용 14번 line처럼! 상위클래스 생성자 호출
    
    • mission
    package j0424;
    
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Frame;
    import java.awt.Label;
    import java.awt.Panel;
    import java.awt.TextArea;
    import java.awt.TextField;
    
    public class TextFieldAreaTest extends Frame
    {
        TextField tf1, tf2;
        TextArea ta;
        Label la;
    
            public TextFieldAreaTest(String title)
            {
                super(title);
                tf1 = new TextField("기본값", 10); //상단
    //          new TextField(int columns); // columns 는 열이지만 여기서는 글자수가 들어가는 너비
    //          tf2 = new TextField(10); 
                tf2 = new TextField("하이.txt", 10);//하단
    
                ta = new TextArea();
                la = new Label ("파일 이름 : ");
    
                Panel northP,southP; //1. 작은 도화지, 언제사용? 한 영역에 두개 이상의 컴포넌트를 붙일 때
                         //2. 컴포넌트 속성을 지정하기 위해 사용
    
    
                northP = new Panel();
    
    //          northP.setLayout(new FlowLayout()); //한번 안쓰고 작업 해봄 밑에, Panel의 기본 레이아웃이 FlowLayout이기에 생략 가능
                northP.add(tf1);
                Color c1 = new Color(90,225,90); //매개변수의 각 정수는 0~255의 값
                northP.setBackground(c1);
                northP.setBackground(Color.pink);
                northP.setForeground(new Color(240,90,90));
    
    
    
                southP = new Panel(); //컨테이너
                southP.setLayout(new FlowLayout());
                southP.add(la);
                southP.add(tf2);
                southP.setBackground(new Color(240,90,90));
                southP.setForeground(Color.pink);
    
    //          setLayout(new BorderLayout()); //Frame의 기본 레이아웃 : BorderLayout이기에 생략 가능
                //BorderLayout의 경우, '위치설정;을 함께
    
    
                add("North", northP);
                add("Center", ta);
    //          add("South", tf2);
    //          add("South", la);
                add("South", southP);
    
                setSize(300,300);
                setVisible(true);
            }
    
    
        public static void main(String[] args)
        {
            new TextFieldAreaTest("TextFieldArea테스트");
        }//main
    
    }
    
궁금상자
    - 레이아웃에서 NorthSouth가 윈단 다 먹는데 좌우가 영역 다 먹으려면 어떻게 해야 할까

190423_Day12 복습, Vector실습, 예외처리


복습

  • Vector

    • 데이터를 담는 바구니

    • 가변길이배열, 저장할 데이터 수 일정치 않을 때

    • 객체(데이터)에 대한 참조를 갖는 배열(모든 자료형을 담을 수 있음)

    • Vector v = new Vector();

    • 클래스 Person =>> 데이터 저장(저장되는 곳 주목)

    • public class Person
      {
      public getName()
      {
          return "나길동"
      }
      }
      Person p = new Person();
      System.out.print(p.getName());
      //으로 출력하면 된다.
      Person [] person = {p};
      System.out.print(person[0].getName());
      //person[0]
      Vecrot<Person> v = new Vector<>();
      v.add(p);
      System.out.print(v.get(0).getName())
  • Vector를 이용하여 사람의 번호, 이름, 나이, 직업 =>> 저장, 조회, 수정, 삭제

    package mission;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    /*
    *  - 반복적인 메뉴출력
    *    - Vector에 추가할 사람정보 입력, 수정할 번호와 사람정보, 삭제할 번호의 입력을 받는다.
    *    - 선택된 언어에 따라 PersonMenu의 메소드를 호출.
    */
    public class PersonMenuTest
    {
    public static void main(String[] args) throws IOException 
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PersonMenu menu = new PersonMenu();
    
    
        String num;
        do 
        {
            System.out.println( " < 사 람 메 뉴 > " );
            System.out.println( "1.추가 2.검색 3.수정 4.삭제 5.종료" );
            System.out.print( "번호 입력 =>>" );
            num = in.readLine();//1~5까지의 문자열 입력
    
            switch ( num ) 
            {
                case "1":
                { 
                    System.out.println( "#추가할 사람" );
                    System.out.print("이름 : ");
                    String name = in.readLine();
                    System.out.print("나이 : ");
                    int age = Integer.parseInt(in.readLine()); 
                    System.out.print("직업 : ");
                    String job = in.readLine();
    
    
    //                    menu.insert(name, age, job); // 메소드 호출 , ()안에는 데이터 넣기//데이터 나열해서 호출
    //                    String []arr = {name, age, job};
    //                    menu.insert(arr); 로 할 수도 있었다~! 문자열들을 배열로 묶어서 전달 호출
    
                    Person p = new Person(0, name, age, job); //no넣을수 없어서 아직...
                    //관련있는 4개의 데이터를 p변수로 묶고
                    menu.insert(p);
                }   
                    break;
                case "2": 
                    menu.select();
    
                    break;
                case "3": 
                    System.out.print("수정할 번호 : ");
                    int no = Integer.parseInt(in.readLine());
                    System.out.print("나 이 : ");
                    int age = Integer.parseInt(in.readLine());
                    System.out.print("직 업 : ");
                    String job = in.readLine();
    
                    //세개의 변수(no,age,job)를 변수명 한개로 묶어주기
    //                    Person p = new Person(no, null, age, job); //이렇게 해도 되고!
                    Person p = new Person(); // 0, null, 0, null
                        p.setNo(no); //no, null, 0, null
                        p.setAge(age); // no, null, age, null
                        p.setJob(job); // no, null, age, job
    
                    menu.update(p);//p넣으면 묶여서 전달된다.
                    break;
                case "4": 
                    System.out.println("#삭제하기");
                    int delNo = Integer.parseInt(in.readLine());
    
                    menu.delete(delNo);
    
    
                    break;
            }
            System.out.println();
    
        }while(!num.equals("5"));
        {
            System.out.println(" == E N D == ");
        }
    }
    
    
    }
    
    /===
    
    package mission;
    
    import java.util.Vector;
    
    /*
    *    - 기능을 정의하는 클래스
    *    - 멤머변수 Vector<Person> persons; // 사람정보를 저장
    *    - int no; // Vector에 입력되는 Person내에 순차적인 번호 부여
    *  - 멤버 메소드(기능메소드) : 추가(insert, create) , 조회(select, find) , 수정(update, modify) , 삭제(delete, remove) <== 데이터 단위[사람]
    *            
    */
    public class PersonMenu 
    {
    Vector<Person> personV; //Person 데이터를 받겠습 ( 데이터 단위는 Person단위로 ), 기본값 null
     int no;
    
    public PersonMenu()
    {
        personV = new Vector<>(); //기본값 null
        //PMT에 넣어도 괜춘, 기본값 0
    }
    
    public void insert(Person p)
    //public void insert(String []arr)
    {
        //벡터에 사람정보를 저장하기 전에, 유일한 번호(no)를 생성해서 p에 전달
    
        p.setNo(++no); // 유일한 번호 부여
        personV.add(p);
    }
    
    public void select()
    {
        System.out.println("사람목록");
        for (int i = 0; i < personV.size(); i++) 
        {
    //            Person p = persons.get(i);
    //            System.out.println(p); //를 줄여서 밑에 껄로
            System.out.println(personV.get(i));
        }
    }
    
    public void update(Person newP)
    {
        for(int i = 0; i < personV.size(); i++)//일치하는 번호 찾기
        {
            //=====
            //Person p.getNo()
    
            //일치하는 번호 ( 수정할 번호 ) 찾기
            Person oldP = personV.get(i); //벡터(데이터저장소)에 저장된 개개의 사람정보
            if( oldP.getNo() == newP.getNo()) // 일치 번호 찾았다면
            {
                //여기다가 set을 해버리면 완전 지워지고 다시 새로 써버리는것이다...
                //수정작업 ( 나이, 직업만 )
                oldP.setAge(newP.getAge());
                oldP.setJob(newP.getJob());
            }
        }
    }
    
    public void delete(int delNo)
    {
        for (int i = 0; i < personV.size(); i++) 
        {
            Person oldP = personV.get(i);
            if(oldP.getNo() == delNo)
            {
                personV.remove(i);
                break;
            }
        }
    }
    }
    
    /===
    
    package mission;
    
    /*
    * 자바빈즈, (서로 관련있는 속성들을 표현, 저장 하는 클래스
    *    - private속성 : 번호 이름 나이 직업
    *    - 생성자(선택사항)
    *    - public 게터메소드 세터메소드
    */
    
    public class Person {
     //속성정의
    private int no;
    private String name;
    private int age;
    private String job;
    
      public Person() {
    
    }
    
    public Person(int no, String name, int age, String job) {
        this.no = no;
        this.name = name;
        this.age = age;
        this.job = job;
    }
    
    public int getNo() {
        return no;
    }
    
    public void setNo(int no) {
        this.no = no;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    public String getJob() {
        return job;
    }
    
    public void setJob(String job) {
        this.job = job;
    }
    
    @Override
    public String toString() {      
        return no+": ["+name+","+age+","+job+"]";
    }
    
    
    }//class Person

예외처리 < Exception >

  • 프로그램 실행 중에 발생하는 예기치 않은 사건
  • 자바는 프로그램 실행 중 발생할 수 있는 예외를 처리할 수 있는 기법 제공
  • 발생하는 모든 예외를 객체로 취급, 예외 관련 클래스 제공
  • 예)
    • 배열의 첨자가 음수값을 가지는 경우
    • 배열 첨자가 배열의 크기를 벗어나는 경우
    • 부적절한 형변환이 일어나는 경우
    • int su = 3.14 // 에러 -> int형에서는 0.14에 대한 표현 불가
    • int su = (int)3.14 // 실행가능, su변수에 3저장
    • double d = 30;
    • double d = 30; //묵시적인 형변환! d변수에 30.0dl wjwkd
    • double d = (double)30; //명시적인 형변환, 값은 같다.
    • (int)”홍길동” //에러발생 : String과 int자료형은 공통점이 없다.
    • (B)A //에러발생한다면 : A클래스와 B클래스간의 상속관계가 없다.
    • (Object)String // 가능하다, 모든 데이터는 최상위 클래스인 Object로 형변환 가능
    • Object ob = (Object)”나길동”; //가능
    • => 부모캐스팅은 보통 생략, Object ob = “나길동”; 이렇게!
    • ob.length() ? (안된다!) , ob는 부모… 자식 레퍼런스 호출 불가!
    • ob.toString() ? (), toString() Object에도 있는걸?, 그럼 toString()메소드는 어떤 클래스의 메소드일까? String!! (오버라이딩메소드이다!)
    • (String)Object =>> 자식캐스팅 : 반드시 명시를 해야 하는 부분!
    • String str = (String)ob;
    • str.length() =>> 3 (O)
    • (Parent)Child데이터 (Child)Parent데이터 =>> 상속관계가 있었을 때만 캐스팅이 가능
  • 입축력시 인터럽트가 발생하는 경우
    • 입출력하기 위해 지정한 파일이 존재하지 않거나 파일 이름이 틀린 경우.
  • throws 는 책임전가… !

<예외처리 구문 형식>

  • 이전의 throws 문은 예외가 발생시 할일에 대해 전가의 뜻을 가짐.

    void gildong() throws IOException
    {
    readLine(); //에러 발생하니 throws추가  
    }
    /*
    =>> gildong()메소드를 실행하다가 만약 IOException이 발생하면 그 상황에 대한 처리를 lime()메소드가 하시오!!
    */
    void lime()
    {
      readLine();
    }
  • try ~ catch문

    • 형식
    try
    {
        1;//1번에서 에러 발생시 2,3번 실행 안함!
        2;
        3;
    //예외가 발생할 가능성이 있는 문장; =>>대체적으로 메소드 호출 문장
    }catch(예외타입 변수명)//변수선언이 들어간다.(int이런 기본타입 말고 , 클래스 타입)
    {
        실제 예외가 발생 한다면 처리할 문장
    }finally{
        //예외발생과 상관 없이 반드시 실행할 문장;
    }
    
    //예외처리 case1) 각각 처리
    try
    {
        AException이 발생할 가능성 있는 문장1;
    }catch(AException e)
    {
        AException 발생시 처리할 문장
    }
    
    try
    {
        BException이 발생할 가능성 있는 문장2;
    
    }catch(BException e)
    {
        BException 발생시 처리할 문장
    }
    
    try
    {
        CException이 발생할 가능성 있는 문장1;
    }catch(CException e)
    {
        CException발생시 처리할 문장
    }
    
    //예외처리 case2) 다중catch를 사용 : 일반적으로 많이 사용
    try
    {
        AException이 발생할 가능성 있는 문장1;
        BException이 발생할 가능성 있는 문장2;
        CException이 발생할 가능성 있는 문장3;
    }catch(AException e){
        AException발생시 처리할 문장;
    }catch(BException e){
        BException발생시 처리할 문장;
    }catch(CException e){
        CException발생시 처리할 문장
    }
    • 다중 catch사용시 주의할 점!

      • 부모 자식 클래스 정의하는 순서에 주의~!

      • 자식클래스에 대한 catch문을 먼저 정의를 해야함!

      • 1번

      • catch(ParentException pe){} //ParentException pe = new ParentException(); , ParentException pe = new ChildException();
      • catch(ChildException ce){} =>> x

      • 2번

      • catch(ChildException ce){}
      • catch(ParentException pe){} =>> o
      • 위에서 1번에서 에러 발생, 결국 Parent에서 자식 에러까지 캐치해버림, 그래서 밑에 캐치문이 실행이 안됨!
      • 차일드와 차일드 비교하고, 넘어감
package j0423;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/*
 * < 자바 I/O 의 4대 클래스 > =>> 추상클래스
 * 
 *          byte단위              문자단위
 * -----------------------------------------------
 *  읽기      InputStream         Reader          =>> 대표 메소드 : read()
 *  쓰기      OutputStream        Writer          =>> 대표 메소드 : write() 
 *  
 */
public class ExceptionTest 
{
    public static void main(String[] args) 
    {
        //텍스트 파일 (a.txt)를 읽어서 그 내용을 콘솔(모니터)에 출력

        try {
            FileReader fr = new FileReader("bin/mission/b.txt"); // src좌표보다는 bin이 더 좋다! 최상위 경로에 넣어놓은 a.txt, FileNotFoundException 에러 발생(자식)
//          System.out.println(fr.read()); //IOException에러 발생 (부모)
//          System.out.println(fr.read()); //IOException에러 발생 (부모)
//          System.out.println(fr.read()); //IOException에러 발생 (부모)
//          System.out.println(fr.read()); //IOException에러 발생 (부모)
//          System.out.println(fr.read()); //IOException에러 발생 (부모) // -1 이 나오면 읽을 문자가 없다는 뜻
            int i ;
            while( ( i=fr.read() ) != -1 )
            {
                System.out.print((char)i);
            }
            System.out.println("\n파일 읽기 성공 :)");
        } catch (FileNotFoundException e) 
        {
            System.out.println("파일경로를 확인하시와요");
//          e.printStackTrace();
        } catch (IOException e) 
        {
            System.out.println("입출력에러가 발생했아와요");
//          e.printStackTrace();
        }

    }
}
궁금상자
    - 벡터안에 배열 ?
    - switch문에 fianl String?

+ Recent posts