JAVA

Swing ( Ⅰ )

choi121xx 2014. 9. 13. 07:56

 

1.  이벤트처리


-이벤트: 윈도우상에서 발생되는 여러사건--> 마우스클릭,키보드누름,마우스움직임,버튼클릭,윈도우가실행될때,윈도우가 닫힐때,..


-이벤트처리: 이벤트가 발생되었을때 적절한 처리를 하는것 예)버튼을 누르면 메시지출력,윈도우종료버튼을 누르면 프로그램종료,..



[ 자바에서의 이벤트 처리 ]


 1)이벤트가 발생되었을때 어떤 작업을 할건지에 대한 이벤트 리스너 만들기 --> 발생될 이벤트에 따라 해당 이벤트리스너가 정해져 있음


 예)키보드 누름 --> KeyListener

    마우스움직임 --> MouseMotionListener

    버튼클릭 --> ActionListener

        ..


 2) 이벤트 리스너 객체 생성하기


 3) 이벤트가 발생될 객체(이벤트소스)에 이벤트리스너 연결하기.




2

MyTest02.java

package test01;

import java.awt.GridLayout;

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.JPanel;

import javax.swing.JTextField;


class MyFrame02 extends JFrame {

    JLabel lbl1 = new JLabel("이름 입력");

    JTextField txt = new JTextField(10);

    JButton btn1 = new JButton("출력");

    JLabel lbl2 = new JLabel("입력 된 이름:");

    JPanel pan = new JPanel();

    public MyFrame02() {

        setLayout(new GridLayout(2, 1));

        pan.add(lbl1);

        pan.add(txt);

        pan.add(btn1);

        // pan.setBackground(Color.RED);

        add(pan);

        add(lbl2);

        setSize(400, 150);

        setVisible(true);


        // 1.이벤트리스너 만들기

         // 이벤트리스너 만들기

        class MyEvent implements ActionListener {

            // 버튼을 눌렀을 때 처리해야 할 일을 작성

            @Override

            public void actionPerformed(ActionEvent e) {

                // 입력 된 텍스트 얻어오기

                String str = txt.getText();


                // JLabel에 입력 된 텍스트 보이기

                lbl2.setText("당신의 이름은 " + str + "입니다.");

            }

        }


        // 2. 이벤트리스너객체 생성

        MyEvent me = new MyEvent();

        // 3. 버튼에 이벤트리스너 등록

        btn1.addActionListener(me);

    }

}

public class MyTest02 {

    public static void main(String[] args) {

        new MyFrame02();

    }

}



 

 





3. List


ex> MyTest03_List.java

package test01;

import java.awt.BorderLayout;

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;

class MyFrame03 extends JFrame implements ActionListener {

    JTextField txt = new JTextField(10);

    JButton btn = new JButton("추가");

    JButton btnDel = new JButton("삭제");

    List list = new List();

    JPanel pan = new JPanel();

    public MyFrame03() {


        // JPanel에 컴포넌트 붙이기

        pan.add(new JLabel("회원이름"));

        pan.add(txt);

        pan.add(btn);

        pan.add(btnDel);

        // 프레임 레이아웃 설정하기

        setLayout(new BorderLayout());


        // pan을 North영역에 붙이기

        add(pan, BorderLayout.NORTH);


        // list를 Center영역에 붙이기

        add(list, BorderLayout.CENTER);

        // 버튼에 이벤트 등록하기

        btn.addActionListener(this);

        btnDel.addActionListener(this);

        setSize(400, 400);

        setVisible(true);

    }

    @Override

    public void actionPerformed(ActionEvent e) {

        // 입력된 이름을 List에 추가

        if (e.getSource() == btn) {


            // 입력된 텍스트 얻어오기

            String name = txt.getText();


            // List에 입력된 텍스트 추가하기

            list.add(name);


            // 텍스트필드내용지우기

            txt.setText("");


            // 텍스트필드에 포커스주기

            txt.requestFocus();


        } else if (e.getSource() == btnDel) {

        // 선택한 항목을 List에서 제거

            // List의 선택한 항목의 index값 얻어오기

            int pos = list.getSelectedIndex();

            

            // 선택한 항목이 없는 경우

            if (pos == -1) {

                JOptionPane.showMessageDialog(this, "삭제할항목을 선택하세요!");


                // 메소드끝내기

                return;

            }

            list.remove(pos);

        }

    }

}

public class MyTest03_List {

    public static void main(String[] args) {

        new MyFrame03();

    }

}



 

 





EX> 이벤트 리스트 등록하는 3가지 방법이 존재. 결과는 동일함.

package test01;


import java.awt.GridLayout;

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.JPanel;

import javax.swing.JTextField;


class QuizFram01 extends JFrame{


    JTextField txt1 = new JTextField(5);

    JTextField txt2 = new JTextField(5);

    JTextField txt3 = new JTextField(5);

    JLabel lbl1 = new JLabel("+");

    JLabel lbl2 = new JLabel("=");

    

    JButton btn1 = new JButton("덧셈");

    JPanel pan1 = new JPanel();

    JPanel pan2 = new JPanel();

    

    public QuizFram01(){

        pan1.add(txt1);

        pan1.add(lbl1);

        pan1.add(txt2);

        pan1.add(lbl2);

        pan1.add(txt3);

        

        setLayout(new GridLayout(2, 1));

        add(pan1);

        add(btn1);


//  방법1

//        class ButtonEvent implements ActionListener{

//            public void actionPerformed(ActionEvent e){

//                int c = Integer.parseInt(txt1.getText());

//                int d = Integer.parseInt(txt2.getText());

//                

//                txt3.setText( String.valueOf(c+d) );

//            }

//        }

//        ButtonEvent be = new ButtonEvent();

//        btn1.addActionListener(be);

        

// 방법2        

//        ActionListener act = new ActionListener() {

//            @Override

//            public void actionPerformed(ActionEvent e) {

//                int c = Integer.parseInt(txt1.getText());

//                int d = Integer.parseInt(txt2.getText());

//                

//                txt3.setText( String.valueOf(c+d) );

//            }

//        };

//        btn1.addActionListener(act);

        

        // 방법3

        btn1.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                int c = Integer.parseInt(txt1.getText());

                int d = Integer.parseInt(txt2.getText());

                

                txt3.setText( String.valueOf(c+d) );

            }

        });        

        

        setSize(400,100);

        setVisible(true);

        

    }

}

public class Quiz01 {

    public static void main(String[] args) {

        new QuizFram01();

    }

}



 

 






4. JRadioButton



ex> 라디오버튼 클릭하면 색깔이 변경된다.

package test01;

import java.awt.Color;

import java.awt.Container;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;

import javax.swing.JFrame;

import javax.swing.JRadioButton;

class MyFrame04 extends JFrame implements ActionListener {

    JRadioButton rb1 = new JRadioButton("빨강");

    JRadioButton rb2 = new JRadioButton("파랑");

    JRadioButton rb3 = new JRadioButton("노랑");


    // RadioButton을 그룹으로 묶는 객체

    ButtonGroup gb = new ButtonGroup();

    Container con;

    public MyFrame04() {


        // 버튼그룹에 라디오버튼 담기

        gb.add(rb1);

        gb.add(rb2);

        gb.add(rb3);


        // 콘텐츠영역 얻어오기

        con = getContentPane();

        con.setBackground(Color.ORANGE);

        setLayout(new FlowLayout());

        con.add(rb1);

        con.add(rb2);

        con.add(rb3);

        rb1.addActionListener(this);

        rb2.addActionListener(this);

        rb3.addActionListener(this);

        setSize(400, 300);

        setVisible(true);

    }

    @Override

    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == rb1) {

            con.setBackground(Color.RED);

        } else if (e.getSource() == rb2) {

            con.setBackground(Color.BLUE);

        } else if (e.getSource() == rb3) {

            con.setBackground(Color.YELLOW);

        }

    }

}

public class MyTest04{

    public static void main(String[] args) {

        new MyFrame04();

    }

}


 

 





5. Adapter


[ 어댑터클래스 ]

- 이벤트를 처리할때 이벤트리스너를 상속받으면 리스너가 인터페이스이므로 모든 메소드를 오버라이딩해야 한다. 이는 매우 불편하므로 자바에서는 어댑터클래스를 제공한다. 어댑터클래스는 이벤트리스너를 상속받아 모든 메소드를 오버라이딩한 클래스이다. 사용자는 어댑터클래스를 상속받아 필요한 메소드만 오버라이딩하여 필요한 기능만 구현하면 된다.

 

예)

 WindowListener --> WindowAdapter

 KeyListener --> KeyAdapter

 ...




ex> MyTest05_Adapter.java

윈도우를 종료하면 종료로그를 화면에 찍는다.

package test01;

import java.awt.event.WindowEvent;

import java.awt.event.WindowListener;

import javax.swing.JFrame;

class MyFrame05 extends JFrame {

    public MyFrame05() {

        setSize(400, 400);

        setVisible(true);

        class MyWindow implements WindowListener {

            @Override

            public void windowOpened(WindowEvent e) {

            }

            @Override

            public void windowClosing(WindowEvent e) {

                System.out.println("윈도우를 종료해요!");

                System.exit(0);

            }

            @Override

            public void windowClosed(WindowEvent e) {

            }

            @Override

            public void windowIconified(WindowEvent e) {

            }

            @Override

            public void windowDeiconified(WindowEvent e) {

            }

            @Override

            public void windowActivated(WindowEvent e) {

            }

            @Override

            public void windowDeactivated(WindowEvent e) {

            }

        }

        // 프레임의 윈도우 리스너 등록하기

        addWindowListener(new MyWindow());

    }

}

public class MyTest05_Adapter{

    public static void main(String[] args) {

        new MyFrame05();

    }

}



 

  

 

     




ex> addWindowListener메소드를 바로 호출해서 사용하는 예(결과는 동일하다.)

package test01;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import javax.swing.JFrame;


class MyFrame06 extends JFrame{

    public MyFrame06() {

        setSize(400,400);

        setVisible(true);


//        WindowAdapter wa=new WindowAdapter(){

//            @Override

//            public void windowClosing(WindowEvent e) {

//                System.out.println("윈도우를 종료해요.");

//                System.exit(0);

//            }

//        };

//        addWindowListener(wa);


        addWindowListener(new WindowAdapter(){

            @Override

            public void windowClosing(WindowEvent e) {

                System.out.println("윈도우를 종료해요.");

                System.exit(0);

            }

        });

    }

}

public class MyTest06_Adapter {

    public static void main(String[] args) {

        new MyFrame06();

    }

}

 






6. MouseMotionAdapter


ex> 마우스를 움직이면 마우스의 x,y좌표가 출력된다.

MyTest07_MouseMotionAdapter.java

package test01;

import java.awt.BorderLayout;

import java.awt.Canvas;

import java.awt.Color;

import java.awt.event.MouseEvent;

import java.awt.event.MouseMotionAdapter;

import javax.swing.JFrame;

import javax.swing.JLabel;


class MyFrame07 extends JFrame {

    JLabel lbl = new JLabel("현재 마우스 좌표:");

    Canvas cvs = new Canvas();

    public MyFrame07() {

        setSize(500, 500);

        setVisible(true);

        setLayout(new BorderLayout());

        cvs.setBackground(Color.yellow);

        add(lbl, BorderLayout.NORTH);

        add(cvs, BorderLayout.CENTER);

        MouseMotionAdapter ma = new MouseMotionAdapter() {

            public void mouseMoved(MouseEvent e) {

                // 마우스 x 좌표 얻어오기

                int x = e.getX();

                int y = e.getY();

                String str = "x좌표:" + x + ",y좌표:" + y;


                // lbl에 문자열 넣기

                lbl.setText(str);

            }

        };


        // Canvas에 이벤트리스너 등록하기

        cvs.addMouseMotionListener(ma);

        // 종료버튼을 누르면 프로그램 종료하기

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

}

public class MyTest07_MouseMotionAdapter{

    public static void main(String[] args) {

        new MyFrame07();

    }

}






7. TextArea


ex> MyTest08_TextArea.java 화면 내용을 파일로 저장

package test01;

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.FileNotFoundException;

import java.io.PrintWriter;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

class MyFrame08 extends JFrame {

    JButton btn = new JButton("파일로저장");

    JButton btnEnd = new JButton("종료");

    JTextArea ta = new JTextArea();

    public MyFrame08() {

        setLayout(new BorderLayout());

        add(btn, BorderLayout.NORTH);

        add(new JScrollPane(ta), BorderLayout.CENTER);

        add(btnEnd, BorderLayout.SOUTH);

        // 종료버튼 눌렀을때

        btnEnd.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {


                // 부모컴포넌트, 보여줄메시지,  타이틀, 버튼형태

                int ch = JOptionPane.showConfirmDialog(null,

                        "종료할까요?",

                        "종료",

                        JOptionPane.YES_NO_OPTION

                        );

                 // 사용자가 '예' 버튼을 선택한 경우

                if (ch == JOptionPane.YES_OPTION) {

                     // 프로그램 종료하기

                    System.exit(0);

                }

            }

        });

        // 버튼을 눌렀을때의 이벤트 처리

        btn.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                // 텍스트에리어에 입력된 문자열 얻어오기

                String str = ta.getText();

                try {

                    String fileName = JOptionPane.showInputDialog("저장할 파일명 입력");


                    // 파일에 출력하기위한 스트림객체 얻어오기

                    PrintWriter pw = new PrintWriter(fileName);


                    // 파일로 저장하기

                    pw.println(str);


                    // 스트림닫기

                    pw.close();

                    JOptionPane.showMessageDialog(null, "파일로저장성공!");

                } catch (FileNotFoundException fe) {

                    System.out.println(fe.getMessage());

                }

            }

        });

        setSize(500, 500);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

}

public class MyTest08_TextArea{

    public static void main(String[] args) {

        new MyFrame08();

    }

}




 

 





8. Layout


ex> MyTest09_Layout.java

package test01;

import java.awt.BorderLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;


class MyFrame09 extends JFrame {

    JButton btn1 = new JButton("버튼1");

    JButton btn2 = new JButton("버튼2");

    JButton btn3 = new JButton("버튼3");

    JButton btn4 = new JButton("버튼4");

    JPanel pan = new JPanel();

    public MyFrame09() {

        // 레이아웃매니져 사용안하기

        setLayout(null);

        pan.setLayout(new BorderLayout());

        pan.add(btn4, BorderLayout.NORTH);

        // 컴포넌트의 사이즈가 위치를 일일이 지정해 줘야 한다.

        btn1.setSize(100, 50);

        btn2.setSize(100, 50);

        btn3.setSize(100, 100);

        // 버튼의 위치 설정하기

        btn1.setLocation(10, 10);

        btn2.setLocation(120, 10);

        btn3.setLocation(230, 10);

        add(btn1);

        add(btn2);

        add(btn3);

        setSize(400, 400);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

}

public class MyTest09_Layout{

    public static void main(String[] args) {

        new MyFrame09();

    }

}