λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Study/Java

μžλ°”ν”„λ‘œκ·Έλž˜λ° 5μ£Όμ°¨ 정리

μˆ˜μ—…λ‚ μ§œ/μ •λ¦¬λ‚ μ§œ

2022.04.05/2022.04.09

 

ν•™μŠ΅μ£Όμ œ
  • 08 GUI

 

ν•™μŠ΅λ‚΄μš©

08 GUI

  • GUI(κ·Έλž˜ν”½ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€) → GUIλŠ” μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬μ„±λœλ‹€.
  • μ»΄ν¬λ„ŒνŠΈ: λ ˆμ΄λΈ”, λ²„νŠΌ, ν…μŠ€νŠΈ ν•„λ“œμ™€ 같은 GUIλ₯Ό μž‘μ„±ν•˜λŠ” 기본적인 λΉŒλ”© 블둝. (μœˆλ„μš° μ‹œμŠ€ν…œμ—μ„œλŠ” μ»¨νŠΈλ‘€μ΄λΌκ³ λ„ λΆ€λ₯Έλ‹€.)
  • μžλ°”μ—μ„œλŠ” μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ„ 객체둜 λ§Œλ“€μ–΄μ§„λ‹€.

 

μžλ°” GUI의 μ’…λ₯˜

AWT(Abatract Windows Toolkit)

  • 초기 μžλ°” λ²„μ „μ—μ„œ μ œκ³΅ν–ˆλ˜ GUI
  • 운영 μ²΄μ œκ°€ μ œκ³΅ν•˜λŠ” μžμ›μ„ μ΄μš©ν•΄ μ»΄ν¬λ„ŒνŠΈ 생성
  • μž₯점: μ—¬λŸ¬ 운영 μ²΄μ œμ—μ„œ μ‰½κ²Œ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ œκ³΅ν•  수 있음(→μžλ°” ν”„λ‘œκ·Έλž¨μ΄ 가볍고, μž‘μŒ)
  • 단점: μ‹€ν–‰λ˜λŠ” 운영 μ²΄μ œμ— 따라 μ»΄ν¬λ„ŒνŠΈμ˜ λͺ¨μŠ΅μ΄ 달라짐

μŠ€μœ™(SWING)

  • μ»΄ν¬λ„ŒνŠΈκ°€ μžλ°”λ‘œ μž‘μ„±λ˜μ–΄ 있음
  • μž₯점: μ–΄λŠ 운영 μ²΄μ œμ—μ„œ 싀행해도 λ˜‘κ°™μ€ 화면을 λ³΄μ—¬μ€Œ, λ‹€μ–‘ν•œ μ»΄ν¬λ„ŒνŠΈ 제곡
  • 단점: μžλ°” ν”„λ‘œκ·Έλž¨μ΄ λ¬΄κ±°μ›Œμ§€κ³  컀짐
  • μŠ€μœ™μ— μ†ν•˜λŠ” ν΄λž˜μŠ€λ“€μ€ λͺ¨λ‘ μ•žμ— Jλ₯Ό λΆ™μž„(AWT보닀 늦게 μ—…κ·Έλ ˆμ΄λ“œλ˜μ–΄μ„œ)

 

μ»¨ν…Œμ΄λ„ˆμ™€ μ»΄ν¬λ„ŒνŠΈ

  • λ‹¨μˆœ μ»΄ν¬λ„ŒνŠΈ: λ ˆμ΄λΈ”, μ²΄ν¬λ°•μŠ€ λ“±(JButton, JLabel, JCheckBox λ“±)
  • μ»¨ν…Œμ΄λ„ˆ μ»΄ν¬λ„ŒνŠΈ: λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈλ₯Ό 포함할 수 μžˆλŠ” μ»΄ν¬λ„ŒνŠΈ(JFrame, JPanel λ“±)

 

μ»¨ν…Œμ΄λ„ˆ μ’…λ₯˜

  • μ΅œμƒμœ„ μ»¨ν…Œμ΄λ„ˆ: λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆ μ•ˆμ— 포함될 수 μ—†λŠ” μ»¨ν…Œμ΄λ„ˆ(ν”„λ ˆμž„(JFrame), μ• ν”Œλ¦Ώ(JAplet) λ“±)
  • 일반 μ»¨ν…Œμ΄λ„ˆ: λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆμ— 포함될 수 μžˆλŠ” μ»¨ν…Œμ΄λ„ˆ(νŒ¨λ„(JPanel), 슀크둀페인(JScrollPane) λ“±)

 

GUI μž‘μ„± 절차

1. μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•œλ‹€.

2. μ»΄ν¬λ„ŒνŠΈλ₯Ό μΆ”κ°€ν•œλ‹€.

 

ν”„λ ˆμž„ μƒμ„±ν•˜λŠ” 3가지 방법

β‘  ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— 메인 λ©”μ†Œλ“œλ₯Ό λ§Œλ“€κ³  메인 λ©”μ†Œλ“œμ—μ„œ ν”„λ ˆμž„ 객체λ₯Ό 생성해 λ©”μ‹œμ§•ν•˜κΈ°

import javax.swing.*;	// μžλ°”μ˜ μ›λž˜ νŒ¨ν‚€μ§€λŠ” java. μ΄μ§€λ§Œ, λ‚˜μ€‘μ— μΆ”κ°€λœ 경우 javax. λ₯Ό μ‚¬μš©
public class FrameTest{
	public static void main(String[] args){
    	JFrame f = new JFrame("Frame Test");	// 메인 λ©”μ†Œλ“œμ—μ„œ 객체 생성 (f:κ°μ²΄μ°Έμ‘°λ³€μˆ˜)
        f.setSize(300, 200);
        f.setDefaultCloseOperation(JFrame.EXTI_ON_CLOSE);	// μ°½ λ‹«κΈ°(ν”„λ‘œκ·Έλž¨ μ’…λ£Œ)
        f.setVisible(true);	// 화면에 보이도둝(true:λ³΄μž„, flase:μ•ˆλ³΄μž„)(μ•ˆλ³΄μ΄λ”λΌλ„ ν”„λ‘œκ·Έλž¨ μ’…λ£ŒX)
    }
}

 

β‘‘ ν”„λ ˆμž„ ν΄λž˜μŠ€μ™€ (JFrame 상속받은) 메인 λ©”μ†Œλ“œκ°€ μžˆλŠ” 클래슀 λ”°λ‘œ λ§Œλ“€κΈ°

import javax.swing.*;
public class MyFrame extends JFrame{	// JFrame μ»΄ν¬λ„ŒνŠΈ 상속받아 클래슀 생성
	public MtFrame(){
    	setSize(300, 200);	// 4~6: 클래슀의 μƒμ„±μžμ—μ„œ 자기 μžμ‹ μ˜ λ©”μ†Œλ“œ 호좜('this.~' μƒλž΅λœ ν˜•νƒœ)
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}
public class MyFrameTest{
	public static void main(String[] args){
    	MyFrame f = new MyFrame();
    }
}

 

β‘’ JFrameμœΌλ‘œλΆ€ν„° 상속받은 ν”„λ ˆμž„ ν΄λž˜μŠ€κ°€ 메인 λ©”μ†Œλ“œλ₯Ό λ©€λ²„λ‘œ 가지고 있기

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

 

ν”„λ ˆμž„μ— μ»΄ν¬λ„ŒνŠΈ μΆ”κ°€ν•˜κΈ°

μ»¨ν…Œμ΄λ„ˆ 생성 ν›„ μ›ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ 객체듀을 μ»¨ν…Œμ΄λ„ˆμ— μΆ”κ°€ν•œλ‹€.

이 경우, JFrame 객체가 μ»¨ν…Œμ΄λ„ˆκ°€ λœλ‹€.

 

import javax.swing.*;
import java.awt.FlowLayout;
public class MyFrame extends JFrame{
	public MyFrame(){
    	setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("MyFrame");
        setLayout(new FlowLayout());
        JButton button = new JButton("λ²„νŠΌ");	// 9~10: JButton의 객체λ₯Ό μƒμ„±ν•œ ν›„ ν”„λ ˆμž„μ— μΆ”κ°€
        this.add(button);	// MyFrame의 λ©”μ†Œλ“œλ‘œ 'this.~' μƒλž΅κ°€λŠ₯
        setVisible(true);
    }
}
public class MyFrameTest{
	public static void main(String[] args){
    	MyFrame f = new MyFrame();
    }
}

 

JFrame 클래슀

μŠ€μœ™μ€ 3가지 μ΅œμƒμœ„ μ»¨ν…Œμ΄λ„ˆ(JFrame, JDialog, JApplet)λ₯Ό 가지고 μžˆλ‹€.

 

이듀 클래슀λ₯Ό μ‚¬μš©ν•  λ•Œ μ•Œμ•„μ•Ό ν•  점

  • μ»¨ν…Œμ΄λ„ˆλŠ” μ»΄ν¬λ„ŒνŠΈλ“€μ„ 트리(tree) ν˜•νƒœλ‘œ μ €μž₯ν•œλ‹€. μ΅œμƒμœ„ μ»¨ν…Œμ΄λ„ˆλŠ” 이 트리의 루트 λ…Έλ“œκ°€ λœλ‹€.
  • 각 μ»΄ν¬λ„ŒνŠΈλ“€μ€ λ”± ν•œ 번만 μ»¨ν…Œμ΄λ„ˆμ— 포함될 수 μžˆλ‹€. 이미 λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆμ— λ“€μ–΄ μžˆλŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό 또 λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆμ— λ„£μœΌλ©΄ μ•ˆ λœλ‹€.
  • μ΅œμƒμœ„ μ»¨ν…Œμ΄λ„ˆλŠ” 내뢀에 μ½˜ν…νŠΈ 페인(content pane)을 가지고 μžˆλ‹€. 여기에 화면에 λ³΄μ΄λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό μ €μž₯ν•œλ‹€.
  • μ΅œμƒμœ„ μ»¨ν…Œμ΄λ„ˆλŠ” 메뉴바λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.

JFrame의 쑰상 클래슀

JFrame ν΄λž˜μŠ€λŠ” λ§Žμ€ 쑰상 클래슀λ₯Ό 가지고 μžˆλ‹€. ꡬ체적으둜 λ‹€μŒκ³Ό 같은 상속 계측 ꡬ쑰λ₯Ό 가지고 μžˆλ‹€.

Object ← Component  Container  Window  Frame  JFrame

Component: 화면에 ν‘œμ‹œλ˜μ–΄ μƒν˜Έ μž‘μš©ν•˜λŠ” μ‹œκ°μ  객체

Container: 내뢀에 λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈλ₯Ό μΆ”κ°€ν•  수 μžˆλŠ” κΈ°λŠ₯ 제곡

Window: 경계선, 타이틀 λ°”, λ²„νŠΌμ„ 가지고 μžˆλŠ” μœˆλ„μš°

Frame: μžλ°” GUI μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 기초

 

μ£Όμš” λ©”μ†Œλ“œ

β—Ž SetLocation(x, y) / setSize(width, height) / setBounds(x, y, width, height)

: ν”„λ ˆμž„μ˜ μœ„μΉ˜μ™€ 크기λ₯Ό μ„€μ •ν•œλ‹€.

β—Ž setIconImage(IconImage)

: μœˆλ„μš° μ‹œμŠ€ν…œμ— 타이틀 λ°”, νƒœμŠ€ν¬ μŠ€μœ„μ²˜μ— ν‘œμ‹œν•  μ•„μ΄μ½˜μ„ μ•Œλ €μ€€λ‹€.

β—Ž setTitle()

: 타이틀 λ°”μ˜ 제λͺ©μ„ λ³€κ²½ν•œλ‹€.

β—Ž setResizable(boolean)

: μ‚¬μš©μžκ°€ 크기λ₯Ό μ‘°μ ˆν•  수 μžˆλŠ”μ§€λ₯Ό μ„€μ •ν•œλ‹€.

 

기초 μ»΄ν¬λ„ŒνŠΈ

νŒ¨λ„(panel)

  • μ»΄ν¬λ„ŒνŠΈλ“€μ„ ν¬ν•¨ν•˜κ³  μžˆλ„λ‘ μ„€κ³„λœ μ»¨ν…Œμ΄λ„ˆ
  • 투λͺ… μƒνƒœκ°€ 기본이닀.(즉, νŒ¨λ„μ€ 기본적으둜 λˆˆμ— 보이지 μ•ŠλŠ”λ‹€.)
  • μ»΄ν¬λ„ŒνŠΈλ“€μ„ 화면에 ν‘œμ‹œν•˜λ €λ©΄ ν”„λ ˆμž„μ— νŒ¨λ„μ„ μΆ”κ°€ν•œ ν›„ νŒ¨λ„ μœ„μ— μ»΄ν¬λ„ŒνŠΈλ₯Ό μΆ”κ°€ν•œλ‹€.
  • κ°€μž₯ μ€‘μš”ν•œ λ©”μ†Œλ“œ: add() / remove() → μ»΄ν¬λ„ŒνŠΈλ₯Ό μΆ”κ°€ / μ‚­μ œ

λ ˆμ΄λΈ”(label)

  • νŽΈμ§‘μ΄ λΆˆκ°€λŠ₯ν•œ ν…μŠ€νŠΈλ₯Ό ν‘œμ‹œν•˜κΈ° μœ„ν•œ μ»΄ν¬λ„ŒνŠΈ
  • λ ˆμ΄λΈ”μ€ ν…μŠ€νŠΈμ™€ 이미지λ₯Ό λ™μ‹œμ— ν‘œμ‹œν•  수 μžˆλ‹€.
  • 폰트의 μ’…λ₯˜, 크기, 색상 λ“± ν…μŠ€νŠΈμ˜ 속성을 λ³€κ²½ν•  수 μžˆλ‹€.

ν…μŠ€νŠΈ ν•„λ“œ(text field)

  • μ‚¬μš©μžκ°€ ν•  μ€„μ˜ ν…μŠ€νŠΈλ₯Ό μž…λ ₯ν•  수 μžˆλŠ” 기본적인 ν…μŠ€νŠΈ 콘트둀
  • ν•œ 쀄 μ΄μƒμ˜ ν…μŠ€νŠΈ μž…λ ₯이 ν•„μš”ν•˜λ©΄ ν…μŠ€νŠΈ μ˜μ—­(text area)을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
더보기

ν…μŠ€νŠΈ ν•„λ“œμ˜ μ’…λ₯˜

  • JTextField - 기본적인 ν…μŠ€νŠΈ ν•„λ“œ
  • JFormattedTextField - μ‚¬μš©μžκ°€ μž…λ ₯ν•  수 μžˆλŠ” 문자 μ œν•œ
  • JPasswordField - μ‚¬μš©μžκ°€ μž…λ ₯ν•˜λŠ” λ‚΄μš© μ•ˆ λ³΄μž„
  • JComboBox - μ‚¬μš©μžκ°€ 직접 μž…λ ₯ν•  수 μžˆμ§€λ§Œ ν•­λͺ© 쀑 선택 κ°€λŠ₯
  • JSpinner - ν…μŠ€νŠΈ ν•„λ“œμ™€ λ²„νŠΌμ˜ μ‘°ν•©. 이전 λ²„νŠΌκ³Ό λ‹€μŒ λ²„νŠΌ 선택 κ°€λŠ₯

 

λ²„νŠΌ(button)

  • μ‚¬μš©μžκ°€ λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ 경우, μ΄λ²€νŠΈκ°€ λ°œμƒ
  • λ³€κ²½ κ°€λŠ₯ν•œ 것: λ²„νŠΌ μ•ˆμ˜ ν…μŠ€νŠΈ, λ²„νŠΌ ν…μŠ€νŠΈμ˜ 폰트, λ²„νŠΌμ˜ 전경색, 배경색, λ²„νŠΌμ˜ μƒνƒœ(ν™œμ„±, λΉ„ν™œμ„±)
더보기

λ²„νŠΌμ˜ μ’…λ₯˜

JButton - 일반적인 λ²„νŠΌ

JCheckBox - μ²΄ν¬λ°•μŠ€ λ²„νŠΌ

JRadioButton - λΌλ””μ˜€ λ²„νŠΌ. κ·Έλ£Ή 쀑 ν•˜λ‚˜μ˜ λ²„νŠΌλ§Œ 체크 κ°€λŠ₯

 

 

GUI
1. ν”„λ ˆμž„μ΄ μžˆμ–΄μ•Ό ν•œλ‹€.
2. ν”„λ ˆμž„ 속 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ°°μΉ˜ν•œλ‹€.
3. μ‹€μ œ μ†ŒμŠ€ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ„œ 이벀트 처리λ₯Ό ν•΄μ€˜μ•Ό ν•œλ‹€.

ν•™μŠ΅λ‚΄μš© 이해도

90% 정도. GUI에 λŒ€ν•΄ κ°œλ…μ€ μ΄ν•΄ν•˜κ² μœΌλ‚˜, μ‹€μ œ μ μš©κΉŒμ§€ κ°€λŠ₯할지 λͺ¨λ₯΄κ² λ‹€.

 

ν•™μŠ΅ν™œλ™ λŒμ•„λ³΄κΈ°

GUI에 λŒ€ν•΄ λ“€μ–΄λŠ” λ΄€λŠ”λ°, 처음 λ°°μš°λŠ” λ‚΄μš©μ΄λΌ μ‹ μ„ ν–ˆλ‹€. μˆ˜μ—…μ„ λ“£κ³  κ³΅λΆ€ν•˜λ©° μƒˆλ‘œμš΄ 것듀을 많이 배울 수 μžˆμ—ˆλ‹€. κ·Έλ™μ•ˆμ€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό μ΄μš©ν•΄ 문제λ₯Ό ν‘ΈλŠ” 것에 κ·Έμ³€μ§€λ§Œ, μ‹€μ œ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄μ„œ μ‹€μ§ˆμ μΈ 무언가λ₯Ό λ„μΆœν•΄λ‚΄λŠ” 것이 ν₯λ―Έλ‘œμ› λ‹€.

 

λ‹€μŒ ν•™μŠ΅κ³„νš

μžλ°” GUI의 이해2