728x90
스윙 GUI 프로그램 만들기
- 스윙 프레임 작성
- main() 메소드 작성
- 프레임에 스윙 컴포넌트 붙이기
- 스윙 패키지 사용에 필요한 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() 종료 이후에도 프레임이 살아 있다.
💡 자바 응용프로그램의 종료 조건
실행중인 사용자 스레드가 하나도 없을 때 종료
컨테이너와 배치관리자
- 컨테이너마다 배치관리자가 하나씩 존재하고 삭제도 가능하다.
- 배치관리자는 컨테이너에 컴포넌트가 배치되는 시점에 컴포넌트의 위치와 크기를 결정한다.
- 컨테이너의 크기가 변경되면 배치관리자는 컨테이너 내부의 모든 컴포넌트의 위치와 크기를 재조정한다.
배치 관리자
: 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();
}
}
아래 노션 페이지에 자바 공부 내용에 대해 업로드 합니다!
수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑
개발 환경
작성 플랫폼
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 |