[신세계I&C KDT][Java 프로그래밍] #19 Java GUI - Swing (0409)

박현아·2024년 4월 10일
0

신세계아이앤씨 KDT

목록 보기
23/42

1. Java의 GUI 구현 (Graphic User Interface)

1) AWT (Abstract Window Toolkit)

  • 초창기 버전
  • OS 자원을 이용해서 GUI 랜더링됨 -> OS에 따라 화면이 달라짐

2) Swing

  • Swing 자신의 자원을 이용해서 GUI 랜더링됨 -> 모두 동일한 화면으로 보여짐
  • 일반 pc (desktop) 위주

3) JavaFX

  • Swing보다 가볍고 더 강력함
  • 일반 pc보다는 모바일 (핸드폰, pda, 임베디드) 환경의 GUI 제공

2. Swing API 계층 구조

                       Object
                          |
                      Component
                         |
         Container                  일반컴포넌트 (JButton, JLabel, JList, JTable)
            |
    Panel      Window
                 |
           Frame   Dialog
  • 일반 컴포넌트 : 반드시 Container에 담겨야 랜더링이 가능
  • Panel : 다른 컴포넌트를 담을 수 있는 Container지만 독자적으로 랜더링이 안 됨
    -> 독자적으로 랜더링이 가능한 Window 계열 Frame에 담겨서 랜더링 해야됨
  • Frame : 독자적으로 랜더링이 가능
    독자적으로 랜더링이 가능

3. 레이아웃 (Layout)

1) 역할 및 특징

  • 컴포넌트 (JButton)의 위치와 크기를 관리하는 컴포넌트
  • 기본 레이아웃을 포기하고 특정 레이아웃으로 변경 가능

2) 종류

- BorderLayout

: Frame의 기본 레이아웃
5개의 정해진 위치에 배치 (각 영역에 하나씩만 배치 가능)
NORTH, WEST, CENTER, EAST, SOUTH 상수값 제공 (BorderLayout.NORTH)

- GridLayout

: 행과 열로 구성된 격자로 배치

- CardLayout

: 카드가 겹치는 형태로 배치
한 번에 단 하나의 컴포넌트만 보여준다

- FlowLayout

: Panel의 기본 레이아웃
왼쪽에서 오른쪽으로, 위에서 아래로 배치

- AbsoluteLayout ★

: 사용자가 원하는 위치에 배치

4. 이벤트 처리 방법 (event handling)

1) 이벤트 소스 (event source)

  • 이벤트가 발생된 컴포넌트
    예> JButton btnOk = new JButton("ok");

2) 이벤트 소스와 이벤트 핸들러 연결

문법 : 이벤트소스.addXXXListener(값);
예> btnOk.addActionListener(new MyButtonEvent());

3) 이벤트 핸들러 (event handler)

: 이벤트 소스에서 발생된 이벤트를 처리하는 클래스
인터페이스로 제공됨 (JButton 인터페이스는 ActionListener)

  • 문법 적용

(1) 이름있는 클래스

- GUI 클래스 자신이 implements 받는 경우

public class JComponent01_JButton extends JFrame implements ActionListener {
	
    JButton btnOk;
    // 이 부분은 자동 생성
    private JPanel contentPane;
    
    public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					JComponent01_JButton frame = new JComponent01_JButton;
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	} // 자동 생성
	
    // 생성자 형태로 메인에서 불러서 사용
    // 자동 생성
	public JComponent01_JButton() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

		setContentPane(contentPane); // 자동 생성
        
		btnOk = new JButton("ok"); 
		contentPane.add(btnOk); // Design에서 버튼 추가하면 코드 자동 추가됨
		
		// GUI 자신 클래스로 이벤트 처리 (문법 : 이벤트소스.addXXXListener(값);)
		btnOk.addActionListener(this);
		
	}
    
    // 인터페이스 메서드 상속
    @Override
	public void actionPerformed(ActionEvent e) {
		System.out.prinltln("ok"); // ok 버튼 눌렀을 때의 이벤트 설정
	}
}

- GUI 클래스와 별개의 클래스가 implements 받는 경우

public class JComponent01_JButton extends JFrame { 

	// 이 부분은 자동 생성
	private JPanel contentPane;
    
    public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					JComponent01_JButton frame = new JComponent01_JButton();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	} // 자동 생성
    
    // 생성자 형태로 메인에서 불러서 사용
    // 자동 생성
	public JComponent01_JButton1_gui와다른클래스() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

		setContentPane(contentPane); // 자동 생성
		
		JButton btnOk = new JButton("ok");
		contentPane.add(btnOk); // Design에서 버튼 추가하면 코드 자동 추가됨
		
		// 다른 클래스로 이벤트 처리 (문법 : 이벤트소스.addXXXListener(값);)
		btnOk.addActionListener(new MyButtonEvent());
	}
}

이벤트 처리 클래스 따로 만들기 (implements ActionListener하는 클래스)

public class MyButtonEvent implements ActionListener {

	// 인터페이스 메서드 상속
	@Override
	public void actionPerformed(ActionEvent e){
		System.out.prinltln("ok"); // ok 버튼 눌렀을 때의 이벤트 설정
	}
}

(2) 익명클래스

public class JComponent01_JButton extends JFrame { 

	// 이 부분은 자동 생성
	private JPanel contentPane;
    
    public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					JComponent01_JButton frame = new JComponent01_JButton();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	} // 자동 생성
    
    // 생성자 형태로 메인에서 불러서 사용
    // 자동 생성
	public JComponent01_JButton1_gui와다른클래스() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

		setContentPane(contentPane); // 자동 생성
		
		JButton btnOk = new JButton("ok");
		contentPane.add(btnOk); // Design에서 버튼 추가하면 코드 자동 추가됨
		
		// 익명 클래스로 이벤트 처리 (문법 : 이벤트소스.addXXXListener(값);)
		btnOk.addActionListener (new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println(">>>" + e.getActionCommand());
				System.out.println("Oki doki");
			}
		});
        
        // 람다식 참고 
        // btnOK.addActionListener(e -> System.out.println("Oki doki"));
	}
}

e.getActionCommand() : 버튼 레이블 출력
e.getSource() : 버튼의 모든 정보 출력

	@Override
	public void actionPerformed(ActionEvent e) {
		// System.out.println(e.getActionCommand()); 버튼 레이블 출력
		// System.out.println(e.getSource()); 버튼의 모든 정보 출력
		
		if("Ok".equals(e.getActionCommand())) {
			System.out.println("Oki doki");
		} else {
			System.out.println("cancel");
			
			// 버튼의 레이블 변경 기능
			JButton xxx = (JButton)e.getSource(); // getSource() 리턴타입이 Object이기 때문에 형변환 해줘야됨
			xxx.setText("CANCEL"); // 클릭하면 레이블이 CANCEL로 바뀐다
			xxx.setBackground(Color.red);
		}
	}

JButton, JRadioButton : implements ActionListener
CheckBox : implements ItemListener

0개의 댓글