gui

GUI

  • 목적
    • 그래픽 이용, 사용자에게 이해하기 쉬운 모양으로 정보 제공및 사용자는 마우스나 키보드를 이용하여 쉽게 입력할 수 있다.
  • 패키지
    • AWT 패키지와 Swing 패키지에 제공되는 메커니즘 이용
    • AWT : java.awt.*
    • Swing : javax.swing.*
    • Event : java.awt.event.*

AWT

  • AWT(Abstract Windowing Toolkit)
    • 자바가 처음 나왔을때 함께 배포된 GUI 라이브러리
    • native(운영체제)와 응용프로그램 사이의 연결 라이브러리
  • 중량 컴포넌트(Heavy weight components)
    • AWT 컴포넌트는 native(peer)에 의존적
    • OS의 도움을 받아야 화면에 출력되며 동작하는 컴포넌트. 운영체제에 많은 부담
    • 처리 속도는 빠름

Swing

  • Swing
    • AWT 기술을 기반으로 작성된 자바 라이브러리
    • 모든 AWT 기능 + 추가된 풍부하고 화려한 고급 컴포넌트
    • AWT 컴포넌트에 J자가 덧붙여진 이름의 클래스
    • 그 외 J 자로 시작하는 클래스
  • 경량 컴포넌트(Light weight components)

순수 자바 언어로 구현, JDK 1.1 부터 - javax.swing 패키지 Swing 컴포넌트는 native(peer 혹은 운영체제)에 의존하지 않는다.

Frame

JFrame을 생성하는 기본적인 방법에 대해서 배워 봅시다.

  // 생성자 없이 메인 메소드에서 생성
  public class FrameTest {
  	public static void main(String[] args) {
  		JFrame jf = new JFrame(); // 프레임 객체 생성
  		jf.setTitle("JFRAME TEST"); // 프레임 제목
  		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Exit 클릭 시 Background에서도 종료
  		jf.setSize(300, 500); // 프레임 크기
  		jf.setLocation(200, 300); // 프레임 위치
  		jf.setResizable(false); // 사이즈 조정 불가능
  		jf.setVisible(true); // 프레임 보이게 하기
  	}
  }  

  // 생성자에서 생성 : 추천 방법!!
  public class FrameTest {
    FrameTest() {
      JFrame jf = new JFrame(); // 프레임 객체 생성
      jf.setTitle("JFRAME TEST"); // 프레임 제목
      jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Exit 클릭 시 Background에서도 종료
      jf.setSize(300, 500); // 프레임 크기
      jf.setLocation(200, 300); // 프레임 위치
      jf.setResizable(false); // 사이즈 조정 불가능
      jf.setVisible(true); // 프레임 보이게 하기
    }
  public static void main(String[] args) {
    new FrameTest();
   }
  }

익명구현객체

일반적으로 실무에서는 익명구현객체를 통한 이벤트 사용을 많이 합니다.
아래는 MouseListener와 MouseMotionListener의 익명구현객체 사용 예제 입니다.

  // MouseListener 익명구현객체
  contentPane.addMouseListener(new MouseListener() {
    @Override
    public void mouseClicked(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {
      JPanel p = (JPanel)e.getSource();
      p.setBackground(Color.CYAN);
    }
    @Override
    public void mouseExited(MouseEvent e) {
      JPanel p = (JPanel)e.getSource();
      p.setBackground(Color.BLUE);
    }
    @Override
    public void mousePressed(MouseEvent e) {
      la.setText("MousePressed ("+e.getX()+","+e.getY()+")");
    }
    @Override
    public void mouseReleased(MouseEvent e) {
      la.setText("MouseReleased ("+e.getX()+","+e.getY()+")");
    }
  });

  // MouseMotionListener 익명구현객체
  contentPane.addMouseMotionListener(new MouseMotionListener() {
    @Override
    public void mouseDragged(MouseEvent e) {
      la.setText("MouseDragged ("+e.getX()+","+e.getY()+")");
    }
    @Override
    public void mouseMoved(MouseEvent e) {
      la.setText("MouseMoved ("+e.getX()+","+e.getY()+")");
    }
  });

CheckBox

다음은 익명구현객체를 사용한 체크박스 예제 입니다. 비활성화 체크박스를 클릭하면
버튼이 비활성화 되며, 해제할 시 활성화가되고, 버튼 감추기 체크박스를 클릭하면 버튼이 없어지며
해제할 시 버튼이 나타나는 간단한 프로그램입니다.

  import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;

  public class CheckBoxEvent extends JFrame {
	Container contentPane;
	JCheckBox[] cb = new JCheckBox[2];
	String[] names = {"버튼 비활성화", "버튼 감추기"};
	JButton button = null;
	CheckBoxEvent() {
		setTitle("CheckBoxEvent");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		contentPane = getContentPane();
		contentPane.setLayout(new FlowLayout());

		button = new JButton("TEST BUTTON");
		for(int i=0; i<cb.length; i++) {
			cb[i] = new JCheckBox(names[i]);
			cb[i].setBorderPainted(true);
			contentPane.add(cb[i]);
			cb[i].addItemListener(new ItemListener() {
				public void itemStateChanged(ItemEvent e) {
					if(e.getItem() == cb[0]) {
						if(button.isEnabled())
							button.setEnabled(false);
						else
							button.setEnabled(true);
					}
					else  {
						if(button.isVisible())
							button.setVisible(false);
						else
							button.setVisible(true);
					}
				}
			});
		}
		contentPane.add(button);
		setSize(250, 200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new CheckBoxEvent();
	 }
  }

Adapter

예를 들어 MouseListener를 사용하기 위해 인터페이스를 implements하여 실체 메소드를 작성할 때에는
5개 전부 작성해주어야 합니다. 자신이 마우스 클릭 이벤트만 사용하고 싶은데 5개를 모두 작성하게 되면
비효율적이기 때문에 XXXAdapter라는 클래스안에 추상메소드로 이벤트에 관한 메소드를 가지고 있고
XXXAdapter를 extends(상속)하여 필요한 메소드만 오버라이딩(재정의)을 통해 사용할 수 있습니다.

  • Adapter
  class MouseAdapter implements MouseListener {
  	public void mousePressed(MouseEvent e) {}
  	public void mouseReleased(MouseEvent e) {}
  	public void mouseClicked(MouseEvent e) {}
  	public void mouseEntered(MouseEvent e) {}
  	public void mouseExited(MouseEvent e) {}
  }

  • KeyAdapter 예제(익명구현객체 사용)
  import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;

  public class FlyingTextEx extends JFrame {
	JPanel contentPane = new JPanel();
	JLabel la = new JLabel("HELLO");
	final int FLYING_UNIT = 10;

	FlyingTextEx() {
		setTitle("상, 하, 좌, 우");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(contentPane);
		contentPane.setLayout(null);
    // 익명 구현 객체 및 KeyAdapter 사용
		contentPane.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				int keyCode = e.getKeyCode();
				switch(keyCode) {
				case KeyEvent.VK_UP :
					la.setLocation(la.getX(), la.getY()-FLYING_UNIT);
					break;
				case KeyEvent.VK_DOWN :
					la.setLocation(la.getX(), la.getY()+FLYING_UNIT);
					break;
				case KeyEvent.VK_LEFT :
					la.setLocation(la.getX()-FLYING_UNIT, la.getY());
					break;
				case KeyEvent.VK_RIGHT :
					la.setLocation(la.getX()+FLYING_UNIT, la.getY());
					break;
				}
			}
		});
		la.setLocation(50, 50);
		la.setSize(100, 20);
		contentPane.add(la);
		setSize(300, 300);
		setVisible(true);
		contentPane.requestFocus();
	}
	public static void main(String[] args) {
		new FlyingTextEx();
	 }
  }