Develop/JAVA

JAVA GUI

soleil.ardent 2011. 12. 13. 09:09

[자바 GUI]

Head First Java 의 GUI 예제입니다. ^^

GUI 소스에서 자바의 이벤트 처리까지 있는 좋은 소스입니다.


이벤트 처리를 내부 클래스를 이용하여 처리합니다.


설명은 주석이 있으니 패스 하고 소스로 바로 넘어가죠~

public class simpleUI3  {

    JFrame frame; // 간단하게 창틀이라고 생각하면 쉽습니다.
    JLabel label; // frame 의 작은 배경이라 생각하세요.  

    public static void main (String[] args) {
       simpleUI3 gui = new simpleUI3();
       gui.go();
    }

 

    public void go() {
       frame = new JFrame();
     //frame 창 닫히는 기능추가
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       JButton labelButton = new JButton("Change Label");
       // 버튼이 하나면 btn.addActionListener(this) 
       //리스너(this)를 버튼에 추가하여 사용 
       // 여기서는 버튼의 리스너 등록 메소드에 this 가 아닌 
       // 다른 리스너 클래스(내부 클래스) 를 가지고 만든 객체를 전달
       labelButton.addActionListener(new LabelButtonListener());

       JButton colorButton = new JButton("Change Circle");
       colorButton.addActionListener(new ColorButtonListener());

       label = new JLabel("I'm a label"); 
       MyDrawPanel drawPanel = new MyDrawPanel();
       
       // button & label 을 frame 에 추가
       
       // 인자가 하니인 add 는 편법
       //frame.getContentPane().add(colorButton); 
       frame.getContentPane().add(BorderLayout.SOUTH ,  colorButton);
       frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
       frame.getContentPane().add(BorderLayout.EAST, labelButton);
       frame.getContentPane().add(BorderLayout.WEST, label);

       frame.setSize(420,300); // 창 크기 설정
       frame.setVisible(true); // frame 화면이 보이도록
    }
    
    // 내부 클래스를 이용하여 ActionListener를 한 클래스안에 2개를 넣을 수 있습니다.
    // 버튼이 눌렸을때 이벤트 처리
     class LabelButtonListener implements ActionListener { 
        public void actionPerformed(ActionEvent event) {
            label.setText("Ouch!"); // 내부 클래스에서 label 변수 사용가능
        }
     } // close inner class

     class ColorButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            frame.repaint(); 
            // 내부 클래스에서는 외부 클래스 객체에 대한 헤퍼런스 없이 
            // 그냥 frame 인스턴스 변수를 사용 할 수 있다.
        }
     }  // close inner class
}


// 여기서 그림이 다시 그려지는 원리는  colorButton 이 눌리면  repaint() 매소드가 호출되고 
// frame 에 들어있는 모든 위젯의 아래 paintComponent() 매소드가 호출됩니다.


class MyDrawPanel extends JPanel {
      public void paintComponent(Graphics g) {
         
         g.fillRect(0,0,this.getWidth(), this.getHeight());

         // make random colors to fill with
         int red = (int) (Math.random() * 255);
         int green = (int) (Math.random() * 255);
         int blue = (int) (Math.random() * 255);

         Color randomColor = new Color(red, green, blue);
         g.setColor(randomColor);
         g.fillOval(70,70,100,100);
      }

}