๐Ÿ“Œ Java Swing GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋… ๋ฐ ํ™œ์šฉ

My Pale Blue Dotยท2025๋…„ 3์›” 18์ผ
0

JAVA

๋ชฉ๋ก ๋ณด๊ธฐ
27/35
post-thumbnail

๐Ÿ“… ์ž‘์„ฑ์ผ: 2025-03-18

๐Ÿ“ 1. Swing GUI๋ž€?

Swing์€ Java์—์„œ GUI(๊ทธ๋ž˜ํ”ฝ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
์œˆ๋„์šฐ ์ฐฝ, ๋ฒ„ํŠผ, ํ…์ŠคํŠธ ํ•„๋“œ, ํŒจ๋„ ๋“ฑ ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ,
JFrame, JButton, JTextField ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ GUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.


โœ… 2. Swing์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

์ปดํฌ๋„ŒํŠธ์„ค๋ช…
JFrame์œˆ๋„์šฐ ์ฐฝ์„ ์ƒ์„ฑํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ
JPanel์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ํŒจ๋„
JButtonํด๋ฆญ ๊ฐ€๋Šฅํ•œ ๋ฒ„ํŠผ
JTextFieldํ•œ ์ค„ ํ…์ŠคํŠธ ์ž…๋ ฅ ํ•„๋“œ
JTextArea์—ฌ๋Ÿฌ ์ค„ ํ…์ŠคํŠธ ์ž…๋ ฅ ํ•„๋“œ
JScrollPane์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ์˜์—ญ ์ œ๊ณต
ActionListener๋ฒ„ํŠผ ํด๋ฆญ ๋“ฑ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌ

โœ… 3. ๊ธฐ๋ณธ์ ์ธ Swing GUI ์˜ˆ์ œ

import javax.swing.*;

public class SimpleSwingGUI {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Swing Example"); // ์œˆ๋„์šฐ ์ฐฝ ์ƒ์„ฑ
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JPanel panel = new JPanel(); // ํŒจ๋„ ์ƒ์„ฑ
        JButton button = new JButton("ํด๋ฆญํ•˜์„ธ์š”"); // ๋ฒ„ํŠผ ์ƒ์„ฑ

        panel.add(button); // ํŒจ๋„์— ๋ฒ„ํŠผ ์ถ”๊ฐ€
        frame.add(panel); // ํ”„๋ ˆ์ž„์— ํŒจ๋„ ์ถ”๊ฐ€

        frame.setVisible(true); // ์ฐฝ์„ ํ™”๋ฉด์— ํ‘œ์‹œ
    }
}

๐Ÿ“Œ ์‹คํ–‰ ์‹œ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ์ฐฝ์ด ํ‘œ์‹œ๋จ
๐Ÿ“Œ setVisible(true)๋ฅผ ํ˜ธ์ถœํ•ด์•ผ GUI ์ฐฝ์ด ๋ณด์ธ๋‹ค


โœ… 4. Swing GUI์™€ ์Šค๋ ˆ๋“œ ์—ฐ๋™ (C03SwingMain)

๐Ÿ“Œ ํŒŒ์ผ: C03SwingMain.java

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

class C03GUI extends JFrame implements ActionListener {
    JButton btn1, btn2, btn3, btn4;
    JTextArea area1, area2;
    Thread th1, th2;

    C03GUI() {
        setTitle("THREAD ํ™•์ธํ•˜๊ธฐ");
        JPanel pan1 = new JPanel();

        btn1 = new JButton("์‹œ์ž‘");
        btn2 = new JButton("์ค‘์ง€");
        btn3 = new JButton("์‹œ์ž‘");
        btn4 = new JButton("์ค‘์ง€");
        area1 = new JTextArea();
        area2 = new JTextArea();
        JScrollPane scroll1 = new JScrollPane(area1);
        JScrollPane scroll2 = new JScrollPane(area2);

        scroll1.setBounds(50, 50, 190, 280);
        scroll2.setBounds(300, 50, 190, 280);
        btn1.setBounds(50, 400, 80, 30);
        btn2.setBounds(160, 400, 80, 30);
        btn3.setBounds(300, 400, 80, 30);
        btn4.setBounds(410, 400, 80, 30);

        btn1.addActionListener(this);
        btn2.addActionListener(this);
        btn3.addActionListener(this);
        btn4.addActionListener(this);

        pan1.add(btn1);
        pan1.add(btn2);
        pan1.add(btn3);
        pan1.add(btn4);
        pan1.add(scroll1);
        pan1.add(scroll2);
        pan1.setLayout(null);
        
        add(pan1);
        setBounds(100, 100, 600, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btn1) {
            C03Worker1 w1 = new C03Worker1(this);
            th1 = new Thread(w1);
            th1.start();
        }
        if (e.getSource() == btn2) {
            if (th1 != null) {
                th1.interrupt();
                th1 = null;
            }
        }
        if (e.getSource() == btn3) {
            C03Worker2 w2 = new C03Worker2(this);
            th2 = new Thread(w2);
            th2.start();
        }
        if (e.getSource() == btn4) {
            if (th2 != null) {
                th2.interrupt();
                th2 = null;
            }
        }
    }
}

public class C03SwingMain {
    public static void main(String[] args) {
        new C03GUI();
    }
}

๐Ÿ”น ์ฝ”๋“œ ๋ถ„์„

  1. ๋ฒ„ํŠผ ํด๋ฆญ์œผ๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘/์ค‘์ง€ (btn1, btn2, btn3, btn4)
  2. ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด JTextArea์— ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
  3. interrupt()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ๊ฐ•์ œ ์ข…๋ฃŒ
  4. GUI์—์„œ ๋น„๋™๊ธฐ์ ์ธ ์Šค๋ ˆ๋“œ ๋™์ž‘์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ ํ•™์Šต

โœ… 5. ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ถ„์„

โ–ถ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋™์ž‘

  1. btn1 ํด๋ฆญ โ†’ WORKER01 ์Šค๋ ˆ๋“œ ์‹œ์ž‘
  2. btn2 ํด๋ฆญ โ†’ WORKER01 ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ
  3. btn3 ํด๋ฆญ โ†’ WORKER02 ์Šค๋ ˆ๋“œ ์‹œ์ž‘
  4. btn4 ํด๋ฆญ โ†’ WORKER02 ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ

โ–ถ JTextArea ์ถœ๋ ฅ ์˜ˆ์‹œ

WORKER01...
WORKER01...
WORKER01...
...
WORKER02...
WORKER02...
WORKER02...
...

๐Ÿ“Œ interrupt()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด "WORKER01 INTERRUPTED..." ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ


โœ… 6. Swing๊ณผ ์Šค๋ ˆ๋“œ ์‹คํ–‰ ์‹œ ์ฃผ์˜์ 

๋ฌธ์ œํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
GUI๊ฐ€ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒSwingUtilities.invokeLater()๋กœ GUI ์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰
์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ ๋ฌธ์ œsynchronized ๋˜๋Š” SwingWorker ์‚ฌ์šฉ
์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œinterrupt()๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ•์ œ ์ข…๋ฃŒ

๐Ÿ”ฅ 7. ์ •๋ฆฌ

โœ… Swing์„ ํ™œ์šฉํ•˜๋ฉด GUI ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
โœ… JFrame, JButton, JTextArea ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ UI ๊ตฌ์„ฑ
โœ… ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ(ActionListener)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋™์ž‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
โœ… Swing GUI์—์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
โœ… ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ ์‹œ interrupt()๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒ ๊ฐ€๋Šฅ

profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€