ActionEvent : 버튼이 클릭되거나 아이템을 선택한 경우 이벤트 리스너 : ActionListener AdjustmentEvent : 스크롤바를 조정한 경우 이벤트 리스너 : AdjustmentListener ItemEvent : 리스트 객체로부터 항목을 선택한 경우 이벤트 리스너 : ItemListener TextEvent : 텍스트 필드의 값이 변경된 경우 이벤트 리스너 : TextListener
저급레벨 이벤트
ComponentEvent : 컴포넌트 크기를 변경, 이동, 보이기, 숨기기한 경우 이벤트 리스너 : ComponentListener KeyEvent : 키를 누르거나 띈 경우 이벤트 리스너 : KeyListener MouseEvent : 마우스버튼이 눌리거나 띈 경우, 마우스를 움직이거나 드래그한 경우 이벤트 리스너 : MouseListener, MouseMotionListener 마우스가 x,y 좌표에서 움직이면서 키보드와 같이 작동하는 버튼을 가지고 있기 때문에. FocusEvent : 컴포넌트의 포커스를 얻거나 잃은 경우 이벤트 리스너 : FocusListener WindowEvent : 화면이 아이콘화 되거나 활성화, 비활성화, 기타 등등의 경우 이벤트 리스너 : WindowListener ContainerEvent : 컴포넌트가 컨테이너에 추가되거나 제거된 경우 이벤트 리스너 : ContainerListener PaintEvent : 리스너를 가지고 사용되지 않고 재정의될 수 있는 메소드를 포함 이벤트 리스너 : PaintListener InputEvent : 주로 Component 이벤트가 던져지지 않는 컴포넌트를 얻기 전에 이벤트를 가로채도록 사용 이벤트 리스너 : InputListener
인터페이스들은 많게는 7개에서 1개의 메소드와 관련이 있다. 여러개의 메소드를 갖고있는 리스너는 어댑터 클래스라는 특별한 클래스를 갖는다. 사용자를 위해 인터페이스를 구현하고 더미 메소드를 지공한다. ->인터페이스를 구형하기 위해 이 클래스들을 확장하고 메소드를 재정의 한다. 모든 메소드를 구현하지 않아도 어댑터 클래스가 이미 구현해 놓았기 때문에 에러는 발생하지 않는다.
public class EventConsumer implements ActionListener { JButton btnBook; JButton btnExit;
public EventConsumer() throws Exception {} //생성자 메소드
public void actionPerformed(java.awt.event.ActionEvent ae) { if(ae.getActionCommand().equals("Exit")) { System.out.println("Exit was clicked"); }
if(ae.getActionCommand().equals("Book")) { //티켓 예약 System.out.println("Book was clicked"); } } }
= 버튼을 클릭하면 JButton코드는 ActionEvent객체를 생성한다. 그리고 컴포넌트를 위한 리스너가 누군지 알아내기 위해 리스너 목록을 본다. 리스트의 리스너 중 JButton은 ActionEvent인터페이스를 구현한 리스너를 선택한다. 그리고 리스너의 actionPerformed()메소드 중에 하나를 호출한다.
이벤트리스닝을 변경하는 방법 - 그 자신이 이벤트 리스너인 단일 클래스를 만든다. - 스스로 리스너 인터페이스를 구현하는 클래스를 만든다. - 그 자신이 이벤트 처리 클래스라는 표시로 this매개변수를 전달하여 addActionListener()를 호출한다.
- 자바는 컴포넌트 크기와 레이아웃을 만들기 위해 프로그래머가 메소드를 호출하는 것 대신에 레이아웃 관리자를 제공한다.
- 레이아웃 관리자는 각 객체가 화면에 출력될 위치에 관여할수 있지만 정확한 좌표를 지정할수는 없다. └ 브라우저에 기반한 GUI를 구성하기 때문에 └ GUI가 인터넷으로 전송되고 브라우저에서 실행된다면 화면 해상도, 크기 또는 그것을 실행할 브라우저의 종류에 구애받지 않는다. └ 메소드 호출과 switch문으로 처리하기 어려우므로 간단하게 하기 위해 (자바 디자이너들은) 레이아웃관리자를 제공하여 (관리자 하나, 혹은 조합으로) 사용자가 원하는 모양을 만들수 있도록 지원한다.
- java.awt패키지에 의해 제공되는 레이아웃 관리자는 스윙에서도 사용할 수 있다. └ 스윙 애플리케이션은 모든 레이아웃 관리자를 사용할 수 있다.
1. BorderLayout
Panel객체를 생성하고 거기에 GUI객체를 추가한다. 레이아웃 방법에 따라 일정한 영역에 패널을 위치시킨다. 패널은 한 개의 영역에서 시작하여 다른 영역에서 끝나도록 다른 색으로 지정할 수 있다. BorderLayout클래스는 각 영역의 크기를 자체적으로 정한다. 사용자는 간접적인 영향만 미친다.
package TestLayout;
import java.awt.*; import java.awt.event.*;
public class TestBorderLayout extends Frame { TextField tfNorth; TextField tfCenter; TextField tfSouth; TextField tfEast; TextField tfWest; // Frame클래스의 기본 관리자 BorderLayout public TestBorderLayout() { tfNorth = new TextField("North"); //패널에 텍스트 필드 추가 tfCenter = new TextField("Center"); tfSouth = new TextField("South"); tfEast = new TextField("East"); tfWest = new TextField("West");
Panel pNorth = new Panel(); //각각의 텍스트 필드를 위한 패널 생성 pNorth.add(tfNorth); //패널에 텍스트 필드를 추가
Panel pCenter = new Panel(); pCenter.setBackground(Color.darkGray); //영역에 배경색 지정 pCenter.add(tfCenter);
Panel pSouth = new Panel(); pSouth.add(tfSouth);
Panel pEast = new Panel(); pEast.setBackground(Color.gray); pEast.add(tfEast);
Panel pWest = new Panel(); pWest.setBackground(Color.gray); pWest.add(tfWest);
addWindowListener(new WinCloser()); setTitle("Using a BorderLayout"); setBounds(100,100,300,300); setVisible(true); }
public static void main(String[] args) { TestBorderLayout tbl = new TestBorderLayout(); } }
class WinCloser extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } }
2. FlowLayout
- 레이아웃 관리자중 가장 간단하다. - 컴포넌트가 프레임에 놓일때 왼쪽을 기준으로 위치한다. - 컴포넌트는 계속 이어지면서 위치하게 되고 해당 행에 출력되지 못하면 새로운 행을 만들어 출력한다.
package TestLayout;
import java.awt.*; import java.awt.event.*;
public class TestFlowLayout extends Frame { TextField tfFirst; TextField tfSecond; TextField tfThird; TextField tfForth; TextField tfFifth;
public TestFlowLayout() { setLayout(new FlowLayout()); //Frame의 기본 레이아웃이 BorderLayout이기 때문에 레이아웃 관리자를 지정해주어야 한다. tfFirst = new TextField("First"); tfSecond = new TextField("Second"); tfThird = new TextField("Third"); tfForth = new TextField("Forth"); tfFifth = new TextField("Fifth"); //레이아웃 관리자가 선언된 다음 FlowLayout클래스는 컴포넌트 화면 배치를 처리한다. //왼쪽에서 오른쪽으로 펼쳐지면서 Frame에 객체를 위치시킬수 있다.
addWindowListener(new WinCloser()); setTitle("Using a BorderLayout"); setBounds(100,100,300,300); setVisible(true); }
public static void main(String[] args) { TestFlowLayout tfl = new TestFlowLayout(); } }
class WinCloser extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } }
3. GridBagLayout
- 가장 강력하지만 레이아웃 관리자를 구현하는데 가장 복잡하다. - 다른 행과 열에 항목을 위치시키는 스프레드시트 프로그램처럼 동작하고 또 다르게 셀의 크기를 다르게 지정할수 있다. - 레이아웃 관리자의 복잡함을 처리하기 위한 클래스 GridBagConstraints를 호출한다. └ 프로그래머가 좌표, 범위, 스페이싱, 패딩을 지정할수 있게 해준다.
- 프레임에 놓인 모든 객체는 강제적으로 지정할 필요가 있다.
gridx : 열 위치 gridy : 행 위치 gridwidth : 셀 폭 gridheigth : 셀 높이 weightx : 여분 행 공간 할당 weighty : 여분 열 공간 할당 anchor : 셀에 컴포넌트를 정렬하는 방법 지정 fill : 컴포넌트를 채우는 방법 지정 insets : 컴포넌트와 셀의 가장자리 사이의 여백 지정 ipadx : x 방향의 여백 지정 ipady : y 방향의 여백 지정
gbc = new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, i, 0, 0);
gbl.setConstraints(answerLabel, gbc);
- 이 클래스는 레이아웃을 보다 정밀하게 제어하여 셀에 객체를 위치시킬수 있다.
- 어떤 이유로 높은 행과 열 번호를 지정해도 결과에서 행, 열에 공백이 없다. └ 만약 행, 열이 비어있다면 레이아웃 관리자에 의해 무시된다.
package TestLayout;
import java.awt.*; import java.awt.event.*;
public class TestGridBagLayout extends Frame { TextField tfFirst; TextField tfSecond; TextField tfThird; TextField tfForth; TextField tfFifth;
GridBagConstraints gbc; //레이아웃에 사용되는 선택항목을 지정할 수 있는 객체 Button saveButton; Label answerLabel;
public TestGridBagLayout() { Insets i = new Insets(0,0,0,0);
saveButton = new Button("Save"); answerLabel = new Label("Answer");
tfFirst = new TextField("First"); tfSecond = new TextField("Second"); tfThird = new TextField("Third"); tfForth = new TextField("Forth"); tfFifth = new TextField("Fifth");
GridBagLayout gbl = new GridBagLayout(); //후에 사용하기 위한 이름 부여 setLayout(gbl); //레이아웃 설정
//프레임에 놓인 모든 객체를 강제적으로 지정 gbc = new GridBagConstraints(0,0,1,1,0.0,0.0, GridBagConstraints.EAST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(answerLabel, gbc);
gbc = new GridBagConstraints(1,0,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(tfFirst, gbc);
gbc = new GridBagConstraints(1,11,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(tfSecond, gbc);
gbc = new GridBagConstraints(1,8,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(tfThird, gbc);
gbc = new GridBagConstraints(2,0,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(tfForth, gbc);
gbc = new GridBagConstraints(2,1,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(tfFifth, gbc);
gbc = new GridBagConstraints(8,1,1,1,0.0,0.0, GridBagConstraints.WEST,GridBagConstraints.NONE, i,0,0); gbl.setConstraints(saveButton, gbc);
add(tfFirst); //프레임에 각 컴포넌트 추가 add(tfSecond); add(tfThird); add(tfForth); add(tfFifth); add(answerLabel); add(saveButton);
addWindowListener(new WinCloser()); setTitle("Using a BorderLayout"); setBounds(100,100,300,300); setVisible(true); }
public static void main(String[] args) { TestGridBagLayout tgbl = new TestGridBagLayout(); } }