학교/컴프2

컴프 2 중간고사 (Week 3,4)

발빠진 쥐 2024. 10. 31. 16:33

week 3

자바 GUI 소개

 
자바에서 GUI의 종류
- Java AWT : 플랫폼에 의존적, 용량 큼, 교체 할 룩앤필 지원 x, 컴포넌트 개수 적음
- Java Swing : 플랫폼에 독립적, 용량 작음. 교체 할 룩앤필 지원, 컴포넌트 개수 많음

 
스윙 패키지
- java.awt : GUI 컴포넌트를 위한 부모 클래스들을 제공, Color나 Point같은 유틸리티 클래스 포함
- java.awt.event : GUI 컴포넌트 이벤트 처리용 클래스, 인터페이스 갖고 있음
- javax.swing : 버튼, 텍스트 필드, 프레임, 패널 같은 GUI 컴포넌트들을 가지고 있음
 
 
 

자바 GUI 기초

그래픽사용자인터페이스(Graphical User Interface, 간단히 GUI)는 컴포넌트들로구성된다.
 

기본 컴포넌트

- JButton
- JLabel
- JCheckBox
- JChoice
- JList
- JMenu
- JComblBox
- JRadioButton
- JSpinner
- JSlider
- JTextField
- JPasswardField
-JTextArea
-JCanvas
 
예시 코드

package Trash;

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

public class SwingComponentsExample extends JFrame {
    public SwingComponentsExample() {
        setTitle("Swing Components Example");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 500);
        setLayout(new FlowLayout()); // 기본 레이아웃 설정

        // 1. JButton
        JButton button = new JButton("Click Me");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button Clicked!");
            }
        });
        add(button);

        // 2. JLabel
        JLabel label = new JLabel("This is a label");
        add(label);

        // 3. JCheckBox
        JCheckBox checkBox = new JCheckBox("Accept terms and conditions");
        checkBox.addActionListener(e -> System.out.println("Checkbox selected: " + checkBox.isSelected()));
        add(checkBox);

        // 4. JComboBox
        String[] items = {"Item 1", "Item 2", "Item 3"};
        JComboBox<String> comboBox = new JComboBox<>(items);
        comboBox.addActionListener(e -> System.out.println("Selected item: " + comboBox.getSelectedItem()));
        add(comboBox);

        // 5. JList
        JList<String> list = new JList<>(items);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.addListSelectionListener(e -> System.out.println("Selected list item: " + list.getSelectedValue()));
        add(new JScrollPane(list)); // JScrollPane을 추가하여 스크롤 가능하도록

        // 6. JMenu
        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenuItem openItem = new JMenuItem("Open");
        openItem.addActionListener(e -> System.out.println("Open menu item clicked"));
        fileMenu.add(openItem);
        menuBar.add(fileMenu);
        setJMenuBar(menuBar);

        // 7. JRadioButton
        JRadioButton radioButton1 = new JRadioButton("Option 1");
        JRadioButton radioButton2 = new JRadioButton("Option 2");
        ButtonGroup group = new ButtonGroup(); // 그룹화하여 단일 선택 가능하도록
        group.add(radioButton1);
        group.add(radioButton2);
        add(radioButton1);
        add(radioButton2);

        // 8. JSpinner
        SpinnerNumberModel spinnerModel = new SpinnerNumberModel(0, 0, 10, 1); // 초기값, 최소값, 최대값, 증가단위 설정
        JSpinner spinner = new JSpinner(spinnerModel);
        spinner.addChangeListener(e -> System.out.println("Spinner value: " + spinner.getValue()));
        add(spinner);

        // 9. JSlider
        JSlider slider = new JSlider(0, 100, 50); // 최소값, 최대값, 초기값 설정
        slider.setPaintTicks(true);
        slider.setMajorTickSpacing(10);
        slider.setMinorTickSpacing(5);
        slider.setPaintLabels(true);
        slider.addChangeListener(e -> System.out.println("Slider value: " + slider.getValue()));
        add(slider);

        // 10. JTextField
        JTextField textField = new JTextField(15);
        textField.addActionListener(e -> System.out.println("TextField input: " + textField.getText()));
        add(textField);

        // 11. JPasswordField
        JPasswordField passwordField = new JPasswordField(15);
        passwordField.addActionListener(e -> System.out.println("PasswordField input: " + new String(passwordField.getPassword())));
        add(passwordField);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            SwingComponentsExample frame = new SwingComponentsExample();
            frame.setVisible(true);
        });
    }
}

/*
JButton
선언: JButton button = new JButton("Click Me");
설명: 버튼을 생성하고, 클릭 시 동작을 지정합니다.

JLabel
선언: JLabel label = new JLabel("This is a label");
설명: 단순히 텍스트를 표시하는 컴포넌트입니다.

JCheckBox
선언: JCheckBox checkBox = new JCheckBox("Accept terms and conditions");
설명: 체크박스를 생성하고 선택 상태를 확인할 수 있습니다.

JComboBox
선언: JComboBox<String> comboBox = new JComboBox<>(items);
설명: 드롭다운 메뉴로 옵션을 선택할 수 있는 컴포넌트입니다.

JList
선언: JList<String> list = new JList<>(items);
설명: 여러 개의 옵션 중에서 하나 또는 여러 개를 선택할 수 있는 리스트 컴포넌트입니다.

JMenu
선언: JMenu fileMenu = new JMenu("File");
설명: 상단에 메뉴 바를 추가하여 여러 메뉴 항목을 관리할 수 있습니다.

JRadioButton
선언: JRadioButton radioButton1 = new JRadioButton("Option 1");
설명: 여러 옵션 중 하나만 선택할 수 있는 라디오 버튼으로, ButtonGroup을 통해 묶어줍니다.

JSpinner
선언: JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 10, 1));
설명: 숫자를 증감할 수 있는 스피너 컴포넌트입니다.

JSlider
선언: JSlider slider = new JSlider(0, 100, 50);
설명: 슬라이더로 값의 범위를 설정할 수 있습니다.

JTextField
선언: JTextField textField = new JTextField(15);
설명: 텍스트를 입력할 수 있는 단일 줄 텍스트 필드입니다.

JPasswordField
선언: JPasswordField passwordField = new JPasswordField(15);
설명: 비밀번호 입력 필드로, 입력된 문자는 기본적으로 숨겨집니다.

 */

 
 
 

컨테이너 컴포넌트

  • 최상위 컨테이너

        절대 다른 컨테이너 안에 포함될 수 X 
        JFrame, JDialog, JApplet 등이 해당됨

  • 일반 컨테이너

        다른 컨테이너 안에 포함될 수 있는 컨테이너
        JPanel, JScrollPane
 
 
 
 
GUI 작성 절차
      1. 컨테이너 생성
      2. 컴포넌트 추가
 
 
 
 

-프레임 생성 방법 1

메인 메서드에 싹 다 때려박기

import javax.swing.*;

public class FrameTest{
	public static void main(String[] args) {

      JFrame f = new JFrame("프레임 제목");
      f.setTitle("프레임 제목");
      f.setSize(300,200);
      f.setVisible(true);
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      	}
}

public static void main (String [] args) {
	MyFrame f = new MyFrame();
}

 
main() 에서는 MyFrame 객체를 생성 후 종료하지만 윈도우는 종료 X
==> 자바 스윙에서 JFrame 객체 생성시 윈도우 담당 스레드가 생성되기 때문(독럽적으로 실행되는 코드)
 
 
 
 

-프레임 생성 방법 2

클래스의 생성자에 프레임 생성 후 , 메인 메서드와 분리해서 실행시킴

 import javax.swing.*;
 
 public class MyFrame extends JFrame { 
	public MyFrame() {
 		setSize(300, 200);
 		setTitle("MyFrame");
 		setVisible(true);
 		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 
 	public static void main(String[] args) {
 		MyFrame f = new MyFrame();
 	}
 }

 
 
 
 
-버튼 생성하기

 
(프레임 생성자 안쪽에)
JButton b = new JButton("버튼");
add(b);
 
 
 
-경고
setVisible(true)는 add() 문장을 모두 쓰고 마지막에 실행해야함.

 

 
 
 
 
 

 

 

 
 

컨테이너 살펴보기

1. JFrame : 많은 조상 클래스 갖고 있음. 조상의 모든 속성과 메소드 사용가능
 
      최상위 컨테이너는 내부에 content pane 을 가지고 있음.
      거기에 화면에 보이는 컴포넌트 저장.
      최상위 컨테이너에는 메뉴바 추가 가능
      

 
 
-중요한 메소드

  1. add(component)
  2. setLocation (x,y)
  3. setSize(width,height)
  4. setIconImage(IconImage)
  5. setTitle()
  6. setResizable(boolean) - 사용자가 크기를 조절할 수 있는지 설정
  7. getContentPane() - 
  8. setBackground(Color.yellow)

 
 
 
 
2. JPanel : 컴포넌트들을 부착할 수 있도록 설계된 컨테이너 (최상위 X)
유지보수 굿.
 
-중요한 메소드

  1. add(aComponent)
  2. remove(aComponent) - 컴포넌트 삭제
  3. setBackground(Color c)

예시 (프레임 생성자 안쪽에)
       JPanel panel = new JPanel();
       JButton b1 = new JButton("Button 1");
       panel.add(b1);

 

 

 

 

 

 

 

 

배치관리자

  • FlowLayout : 디폴트

 

  • BorderLayout (int hGap, int vGap)
    • add(b1, "North"); //여기서 동서남북 지정

 

  • GridLayout (int rows, int cols, int hGap, int vGap)

 

  • CardLayout
    • next(container) : 주어진 컨테이너의 다음 카드로 이동
    • previous(container) : 주어진 컨테이너의 이전 카드로 이동
    • first(container) : 주어진 컨테이너의 첫 번째 카드로 이동
    • last(container) : 주어진 컨테이너의 마지막 카드로 이동
    •  
    • 예시
    • L = new CardLayout();
    • b1.addActionListner(e -> L.next(cPane));
  • 절대 위치로 배치 : setLayout(null); 후 b1.setSize, b1.setLocation 사용
  • b1.setBounds(x,y,w,h); 로 동시지정 가능

 
 
 
-생성자 이용 법

  1. 생성자 사용 => JPanel panel = new JPanel (new BorderLayout());
  2. setLayout() 메소드 => panel1.setLayout(new FlowLayout()); 

          그냥 Frame에 setLayout() 메소드를 쓸때는 panel1. 안붙여도 ㄱㅊ
 

 

 

 

스윙 비주얼 디자이너

코드로 디자인하는 것 보다 쉬움

 

 

 

 

 

기초 컴포넌트들

  • Lable
  • JTextLable : t사용자가 입력
  • JPasswordField
  • Botton
    • JButton
    • JCheckBox
    • JRadioButton
    • JToggleButton

 
 
 
 
 
 
 
 
 
 

week 4

이벤트 처리 개요

  • mouseClicked : 마우스
  • keyPressed : 키보드
  • actionPerformed : 이벤트 소스

리스너 인터페이스를 구현해야함
 
 
 
 
 

이벤트 처리 방법

 
1. 이벤트 리스너 작성

class MyListner implements ActionListener {

         public void actionPerformed(ActionEvent e) {

                    //여기에 Action 이벤트를 처리하는 코드

     }

}

 
 
 
2. 이벤트 리스너를 컴포넌트에 등록
 
(프레임 클래스 안에 있는 컴포넌트에게 적용시킴 됨)

button1.addActionListener(new MyListener());

 
 
 
 
이벤트 객체
getSource() 호출  -> 이벤트 소스인 컴포넌트 반환
 

public void actionPerformed(ActionEvent e) {
	button1 = (JButton)e.getSource();
    ...
}

 
 
 
-이벤트 처리기를 어디에?

  • 독립적인 클래스 (위의 방법)
  • 내부 클래스 (클래스 안에 위의 방법에서 쓴 클래스 정의)
  • (외부클래스에 정의하면 클래스 밖 변수는 접근하기 힘듦)
  • 프레임 클래스 (extends JFrame implements ActionListener)
  • 무명 클래스 (컴포넌트에 리스너 적용할때 이름x 클래스를 {메소드{ } } 써서 붙이기)
button.addActionListner(new ActionListener(){
		public void actionPerformed(ActionEvent e) {
        		counter ++;
                lable.setText("현재의 카운터 값: " + counter);
                }
});

 

  • 람다식 
button.addActionListener (e-> {
		counter ++;
        lable.setText("현재의 카운터 값: " + counter);
});

 
 
 
 
 
 
 
 
 

스윙 컴포넌트의 이벤트

  • 저수준 이벤트 : Mouse, MouseMotion, Key, Component, Container, Focus, Window
  • 의미적 이벤트 : Action, Adjustment, Document, Item, Text

 
 
 
-액션 이벤트
버튼 클릭, 메뉴 선택, 텍스트 필드에서 엔터키
MyListener listener = new MyListener();
b1.addActionListener(listener);
 
 
 
 
 
 
 

키 이벤트

-종류

  • keyPressed : 키 누름
  • keyReleased : 키에서 손 뗌
  • keyTyped : 키에서 손 떼는 순간 입력된 유니코드 전송

 
-포커스 : 키 이벤트를 받으려면 무조건.

  • panel.setFocusable(true);
  • panel.requestFocus();

 
-KeyListener 인터페이스

  •  

-KeyEvent 클래스

  • int getKeyChar() : KeyEvent에 있는 글자 반환
  • int getKeyCode() : 키코드 (자판 각각의 키) 반환
  • boolean isActionKey() : 이벤트 발생 키가 액션 키(글자키 빼고 다른거)면 true 반환

 
-getKeyCode()

  • 글자가 아니고 키보드의 어떤 자판을 눌렀는지 알고 싶으면 e.getKeyCode() 호출

 
 

Mouse 와 MouseMotion 이벤트

MouseMotion : 마우스 움직임
MouseEvent : 마우스 클릭
 
-종류

  • mousePressed
  • mouseReleased : 컴포넌트에서 떼어짐 -> 호출
  • mouseEntered : 컴포넌트로 들어감
  • mouseExited : 컴포넌트에서 나감
  • mouseClicked : 컴포넌트 위에서 눌려짐
  • mouseDragged
  • mouseMoved

-MouseEvent 객체

  • int getClickCount() : 연속 클릭 횟수
  • int getX() , int getY() , Point getPoint() : 위치 반환 (컴포넌트에 상대적)
  • int getXOnScreen, int getYOnScreen(), int getLocationScreen() : 절대 좌표값 반환, 가상화면에 상대적
  • int getButton() : 어떤 마우스 버튼 상태가 변경 됐는지 반환

 

어댑터 클래스

인터페이스를 구현해 놓은 클래스
panel.addMouseMotionListener(new MouseAdapter() { 
 
- 차이점

  • Listener: 인터페이스이며, 특정 이벤트를 처리하는 메서드를 정의하고 직접 구현해야 합니다. 일반적으로 이벤트를 처리할 때 자주 사용됨.
  • Adapter: 추상 클래스이며, 여러 메서드를 포함한 리스너 인터페이스의 기본 구현을 제공합니다. 필요한 메서드만 오버라이딩할 수 있어 편리함. (implements MouseListener 안해도 됨 ㄷ)

 

3, 4 주차 퀴즈