GUI 프로그래밍과 AWT 컴퓨터 공학실험(I) 인공지능 연구실
GUI 프로그래밍 AWT(Abstract Window Toolkit) Component GUI program을 하는 데 필요한 Component들을 제공하는 set 기본적인 GUI와 관련된 class의 모임 Component 화면에 표시될 수 있는 그래픽 엔터티를 AWT에서는 Component라고 부른다 Component 속성 position=> (x,y) name => String size => 너비, 넓이 foreground color, background color, font, visible, valid
Container component를 담을 수 있는 class Container class는 Component class의 자손이다. Frame, Panel, Applet은 Component를 담을 수 있는 Container이다. Window 와 Frame object =>Container로서, 화면에 단독으로 display될 수 있는 Component이다. Panel object => Container로서, 화면에 단독으로 보여질 수 없다. 따라서 Frame같은 Container에 포함되어 display된다
Frame import java.awt.*; //반드시 import 한다. public class MyFrame extends Frame { //Frame Class를 상속 받아서 사용 public MyFrame (String str) { super(str); } public static void main (String args[]) { MyFrame fr = new MyFrame(“Frame사용 예제"); fr.setSize(300,300); fr.setBackground(Color.red); fr.pack(); // Layout을 알아서 정렬해줌. fr.setVisible(true); // Frame은 화면에 보이지 않게 지정되어 있다. setVisible(true)를 이용해 화면에 나타나게 한다. }
Layout Manager(1) Layout Manager : container안의 component의 배치를 담당한다. FlowLayout : Panel, Applet의 default Layout manager BorderLayout : Window, Frame의 default Layout manager GridLayout CardLayout GridBagLayout
Layout Manager(2) FlowLayout Panel의 default layout manager이다. component를 왼쪽에서 오른쪽으로 배치한다. default로 component를 중앙에 위치시킨다. component의 size는 layout manager가 결정한다. Layout Manager의 Constructor를 이용하면 Manager의 속성을 변경할 수 있다.
Layout Manager(3) BorderLayout Frame의 default layout manager 중요한 컴포넌트를 중심으로 보조 컴포넌트들을 주변에 배치할 때 사용 f = new Frame("Border Layout"); bn = new Button("B1"); bs = new Button("B2"); bw = new Button("B3"); be = new Button("B4"); bc = new Button("B5"); f.add(bn, BorderLayout.NORTH); f.add(bs, BorderLayout.SOUTH); f.add(bw, BorderLayout.WEST); f.add(be, BorderLayout.EAST); f.add(bc, BorderLayout.CENTER);
FlowLayout 과 BorderLayout 응용
Layout Manager(4) GridLayout GridLayout은 격자를 만들고 그 안에 component를 위치시키는 방법 add()를 통해 component를 추가하면 왼쪽에서 오른쪽으로, 위에서 아래로 추가된다 f = new Frame("GridLayout"); f.setLayout (new GridLayout(3,2)); b1 = new Button("1"); b2 = new Button("2"); b3 = new Button("3"); b4 = new Button("4"); b5 = new Button("5"); b6 = new Button("6"); f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5); f.add(b6); f.pack(); f.setVisible(true);
Layout Manager(5) CardLayout GridBagLayout 여러 화면을 겹쳐 두었다가 특정한 화면만 보이도록 할 때 사용한다. GridBagLayout 다른 Layout 매니저 보다 융통성이 좋으나, 사용하기가 복잡하다. 임의의 직사각형 격자에 컴포넌트를 배열하는 방식을 사용한다.
AWT Event Model Java의 Event Model Event : 사용자가 Program에 가한 행동 Event Source : Event가 일어난 근원 Event Handler : 발생된 Event object를 받아 적당한 행동을 취 하는method
Event Handler(1) import java.awt.*; public class ButtonTest { public static void main(String args[]) { Frame f = new Frame("Button Test"); //Frame 생성 Button b = new Button("버튼이닷!!"); //Button 생성 b.addActionListener(new ButtonHandler()); //addActionListener() method는 이 Button에 Event Handler를 지정 f.add(b, "Center"); f.pack(); f.setVisible(true); } }
Event Handler(2) import java.awt.event.*; public class ButtonHandler implements ActionListener { // interface 안에 있는 특정한 abstract method를 구현 public void actionPerformed(ActionEvent e) { System.out.println("Button이 눌려졌당"); System.out.println("Button에 적힌 글은 " + e.getActionCommand()); } } Event Handler를 만들 때는 반드시 적당한 Event Handler Interface를 implements해야 한다 addXXXListener()의 argument로 올 Event Handler class는 반드시 XXXListener interface를 implements 해야 한다.
Method Categories and Interfaces
Event Handler(3) Event를 처리하는 방법 Event를 발생시킬 Event Source를 찾는다. Event Source에 addXXXListener()를 적용한다. 이 때 Event Handler도 지정한다. 실제 Event Handler를 구현한다 f.addWindowListener(new WindowHandler()); // 앞 예제에서 생성한 버튼에 Listener 추가 public void windowClosing(WindowEvent e) { // WindowHandler class Event Handler 구현 setVisible(false); // Frame을 화면에서 없앤다. dispose(); // 모든 자원을 반납한다. System.exit(0); // Program을 종료한다. } public void windowOpened(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowActivated(WindowEvent e) { } public void windowDeactivated(WindowEvent e) { } }
Multiple Listener 하나의 Event source에 여러 개의 Event Handler를 붙일 수 있다. 2개의 Event Handler를 구현한다(interface의 모든 method를 구현한다. 이때 필요 없는 method는 빈 body로 구현한다.) tf = new TextField (30); // 앞 소스에 TextField 추가 f.addMouseMotionListener(this); // MouseMotionListener 추가 f.addMouseListener (this); // MouseListener 추가 public void mouseEntered (MouseEvent e) { String s = "The mouse entered"; tf.setText (s); } public void mouseMoved(MouseEvent e) { String s = "Mouse Position: X = "+ e.getX() +" Y = " +e.getY(); public void mouseExited (MouseEvent e) { } // 나머지는 빈 body()로 정의 public void mousePressed (MouseEvent e) { } …………..
Event Adapter 해당 Event Listener를 대신 implements한 class이다. 상속을 통해 사용된다. Event Handler interface를 구현할 때, 사용하지 않는 method까지 구현해야 하는 불편을 보완. multiple listener를 adapter만으로는 구현하기 불가능하다( java는 다중상속을 허용하지 않으므로 여러 class들을 상속 받을 수 없다. f.addWindowListener (new WindowAdapter() { //object 생성 및 재정의 (overriding)를 동시에 한다. public void windowClosing(WindowEvent e) { f.setVisible(false); f.disopose(); System.exit(0); } } );