[Java] 14. 스윙

올리브수
|2021. 6. 5. 22:37
728x90

스윙 GUI 프로그램 만들기

  1. 스윙 프레임 작성
  2. main() 메소드 작성
  3. 프레임에 스윙 컴포넌트 붙이기
  • 스윙 패키지 사용에 필요한 import
import java.awt .*; // 그래픽 처리를 위한 클래스들의 경로명
import java.awt.event .*; // AWT 이벤트 사용을 위한 경로명
import javax.swing .*; // 스윙 컴포넌트 클래스들의 경로명
import javax.swing.event .*; // 스윙 이벤트를 위한 경로명

Ex1. 300 X 300 크기의 스윙 프레임 만들기

 

import javax.swing.*;

public class MyFrame extends JFrame {
    public MyFrame() {
        setTitle("300x300 스윙 프레임 만들기");
        setSize(300, 300);
        setVisible(true);
    }
    public static void main(String[] args){
        MyFrame frame = new MyFrame();
    }
}

💡 main() 함수는 최소화 하여 작성하는 것이 효율적이다.


프레임에 컴포넌트 붙이기

  • 컨텐트팬 : 프레임 내부의 백그라운드

Ex2. 3개의 버튼 컴포넌트를 가진 스윙 프레임 만들기

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

public class ContentPaneEx extends JFrame {
    public ContentPaneEx(){
        setTitle("ContentPane과 JFrame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                // 프레임 윈도우 창이 닫힐때 프로그램도 종료시킴

        Container contentPane = getContentPane();
        contentPane.setBackground(Color.ORANGE); // 컨텐트팬의 배경색 지정
        contentPane.setLayout(new FlowLayout()); // awt import 에 따른 결과

        contentPane.add(new JButton("OK"));
        contentPane.add(new JButton("Cancel"));
        contentPane.add(new JButton("Ignore"));

        setSize(300, 150);
        setVisible(true);
    }
    public static void main(String[] args){
        new ContentPaneEx();
    }
}

💡 프레임 종료버튼[X] 클릭

  • 프레임을 종료하여 프레임 윈도우가 닫힌다.
    └ 프레임이 화면에서 보이지 않게되고 응용프로그램이 사라진다.
  • 프레임만 보이지 않을 뿐, 응용프로그램의 종료는 아니다.
    └ 키보드나 마우스 입력 불가
    └ 다시 setVisible(true) 호출시, 작동 가능

 

💡 응용프로그램 내에서 스스로 종료

  • System.exit(0);

 

💡 종료 버튼 클릭 시, 응용 프로그램 종료

  • frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

main() 종료 이후, 프레임이 살아있는 이유

  • 메인 스레드
    • main() 을 실행하는 스레드
    • 자바 응용프로그램의 실행을 시작한 스레드
  • 이벤트 분배 스레드(스윙 실행 시, 이벤트 처리 스레드가 생성된다.)
    • 스윙 응용프로그램이 실행될 때 자동으로 실행되는 스레드
    • 프레임과 버튼 등 GUI 화면 그리기
    • 키나 마우스 입력을 받아 이벤트를 처리할 코드 호출

→ 메인 스레드가 종료되어도 이벤트 분배 스레드가 살아 있어, 프레임 화면을 그리고 마우스나 키 입력을 받기 때문에 main() 종료 이후에도 프레임이 살아 있다.

 

💡 자바 응용프로그램의 종료 조건

실행중인 사용자 스레드가 하나도 없을 때 종료


컨테이너와 배치관리자

  1. 컨테이너마다 배치관리자가 하나씩 존재하고 삭제도 가능하다.
  2. 배치관리자는 컨테이너에 컴포넌트가 배치되는 시점에 컴포넌트의 위치와 크기를 결정한다.
  3. 컨테이너의 크기가 변경되면 배치관리자는 컨테이너 내부의 모든 컴포넌트의 위치와 크기를 재조정한다.

배치 관리자

: java.awt 패키지에 구현되어 있다.


컨테이너의 디폴트 배치관리자

: 컨테이너 생성시, 디폴트로 배치관리자가 설정된다.


컨테이너에 새로운 배치관리자 설정

Container.setLayout(LayoutManager Im); //Im을 새로운 배치관리자로 설정

배치관리자 종류

  • FlowLayout , BorderLayout, GridLayout , CardLayout

FlowLayout

  • 왼쪽에서 오른쪽으로 , 위에서 아래로, 순차적으로 배치
  • 컨테이너의 크기가 변하면 컴포넌트 또한 재배치

Ex3

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

public class FlowLayoutEx extends JFrame {
    public FlowLayoutEx() {
        setTitle("FlowLayout Sample");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();

                // 좌우 간격 : 30 | 상하 간격 : 40
        c.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 40));
        c.add(new JButton("add"));
        c.add(new JButton("sub"));
        c.add(new JButton("mul"));
        c.add(new JButton("div"));
        c.add(new JButton("Calculate"));

        setSize(300, 200); // 300 x 200 사이즈 프레임 생성
        setVisible(true);
    }
    public static void main(String[] args){
        new FlowLayoutEx();
    }
}

BorderLayout

  • 컨테이너 공간을 5구역으로 배치
  • East, West, South, North, Center(디폴트)
  • 컨테이너의 크기가 변하면 컴포넌트 또한 재배치

 

Ex4

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

public class BorderLayoutEx extends JFrame {
    public BorderLayoutEx() {
        setTitle("BorderLayout Sample");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();

        // 좌우 간격 : 30 | 상하 간격 : 20
        c.setLayout(new BorderLayout(30, 20));
        c.add(new JButton("add"), BorderLayout.NORTH);
        c.add(new JButton("sub"), BorderLayout.SOUTH);
        c.add(new JButton("mul"), BorderLayout.EAST);
        c.add(new JButton("div"), BorderLayout.WEST);
        c.add(new JButton("Calculate"), BorderLayout.CENTER);

        setSize(300, 200);
        setVisible(true);
    }
    public static void main(String[] args){
        new BorderLayoutEx();
    }
}

GridLayout

  • 컨테이너 공간을 동일한 사각형 격자(그리드)로 분할하고 각 셀에 하나의 컴포넌트 배치
  • 생성자에 행수와 열수를 지정하여 격자를 구성
  • 셀의 왼쪽에서 오른쪽으로 , 위에서 아래로, 순차적으로 배치
  • 컨테이너의 크기가 변하면 컴포넌트 또한 재배치

 

Ex5

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

public class GridLayoutEx extends JFrame {
    public GridLayoutEx(){
        setTitle("GridLayout Sample");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        GridLayout grid = new GridLayout(4, 2);
        grid.setVgap(5); // 두 행 사이 수직 간격 : 5픽셀

        Container c = getContentPane();
        c.setLayout(grid);
        c.add(new JLabel("이름"));
        c.add(new JTextField(""));
        c.add(new JLabel("학번"));
        c.add(new JTextField(""));
        c.add(new JLabel("학과"));
        c.add(new JTextField(""));
        c.add(new JLabel("과목"));
        c.add(new JTextField(""));
        setSize(300, 200);
        setVisible(true);
    }
    public static void main(String[] args){
        new GridLayoutEx();
    }
}

배치관리자 없는 컨테이너

  • 응용프로그램에서 컴포넌트의 절대 크기와 절대 위치를 지정

 

<필요성>

  • 컴포넌트의 위를 임의로 지정하고자 하는 경우
  • 게임 프로그램과 같이 시간·마우스/키보드 입력에 따라 컴포넌트의 위치 및 크기가 수시로 변하는 경우
  • 여러 컴포넌트를 겹쳐 출력하고자 하는 경우

 

  • 배치관리자 삭제 방법
JPanel p = new JPanel
p.setLayout(null)

 

Ex6.

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

public class NullContainerEx extends JFrame{
    public NullContainerEx(){
        setTitle("Null Container Sample");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(null);

        JLabel la = new JLabel("Hello, Press Buttons!");
        la.setLocation(130,50);
        la.setSize(200,20);
        c.add(la);

        for(int i = 1; i <= 9; i++){
            JButton b = new JButton(Integer.toString(i));
            b.setLocation(i*15, i*15);
            b.setSize(50, 20);
            c.add(b);
        }
        setSize(300, 200);
        setVisible(true);
    }

    public static void main(String[] args){
        new NullContainerEx();
    }
}

 

 

 


 

 

스윙

스윙 GUI 프로그램 만들기

www.notion.so

 

아래 노션 페이지에 자바 공부 내용에 대해 업로드 합니다!

수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑

 

 

JAVA 이론 정리

주석 단축키 주석 처리하고 싶은 부분을 블록 처리하고 ‘Ctrl+Shift+ / ’를 누르면 /* */로 주석 처리가 됩니다. 주석을 해제하고 싶은 부분을 블록 처리하고 ‘ Ctrl+Shift+ \ (원 표시 혹은 역슬러시)

www.notion.so

 


개발 환경

Intellij

 

작성 플랫폼

Notion

728x90

'🧑‍💻 Language > Java' 카테고리의 다른 글

[Java] Basic Java (1)  (0) 2022.03.29
[Java] 멀티스레드  (0) 2021.10.18
[Java] 13. GUI  (0) 2021.06.01
[Java] 12. 모듈화와 패키지 응용  (2) 2021.06.01
[Java] 11. 모듈과 패키지  (2) 2021.05.26