Swing์ Java์์ GUI(๊ทธ๋ํฝ ์ฌ์ฉ์ ์ธํฐํ์ด์ค)๋ฅผ ๊ตฌํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์๋์ฐ ์ฐฝ, ๋ฒํผ, ํ
์คํธ ํ๋, ํจ๋ ๋ฑ ๋ค์ํ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํ๋ฉฐ,
JFrame
, JButton
, JTextField
๋ฑ์ ํ์ฉํ์ฌ GUI ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ์ ์๋ค.
์ปดํฌ๋ํธ | ์ค๋ช |
---|---|
JFrame | ์๋์ฐ ์ฐฝ์ ์์ฑํ๋ ์ปจํ ์ด๋ |
JPanel | ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๊ทธ๋ฃนํํ๋ ํจ๋ |
JButton | ํด๋ฆญ ๊ฐ๋ฅํ ๋ฒํผ |
JTextField | ํ ์ค ํ ์คํธ ์ ๋ ฅ ํ๋ |
JTextArea | ์ฌ๋ฌ ์ค ํ ์คํธ ์ ๋ ฅ ํ๋ |
JScrollPane | ์คํฌ๋กค ๊ฐ๋ฅํ ์์ญ ์ ๊ณต |
ActionListener | ๋ฒํผ ํด๋ฆญ ๋ฑ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌ |
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 ์ฐฝ์ด ๋ณด์ธ๋ค
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();
}
}
btn1
, btn2
, btn3
, btn4
)JTextArea
์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฉ์์ง ์ถ๋ ฅinterrupt()
๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ ๋ ๊ฐ์ ์ข
๋ฃbtn1
ํด๋ฆญ โ WORKER01 ์ค๋ ๋ ์์btn2
ํด๋ฆญ โ WORKER01 ์ค๋ ๋ ์ข
๋ฃbtn3
ํด๋ฆญ โ WORKER02 ์ค๋ ๋ ์์btn4
ํด๋ฆญ โ WORKER02 ์ค๋ ๋ ์ข
๋ฃWORKER01...
WORKER01...
WORKER01...
...
WORKER02...
WORKER02...
WORKER02...
...
๐
interrupt()
๊ฐ ํธ์ถ๋๋ฉด"WORKER01 INTERRUPTED..."
๋ฉ์์ง ์ถ๋ ฅ ํ ์ข ๋ฃ
๋ฌธ์ | ํด๊ฒฐ ๋ฐฉ๋ฒ |
---|---|
GUI๊ฐ ๋ฉ์ถ๋ ํ์ | SwingUtilities.invokeLater() ๋ก GUI ์
๋ฐ์ดํธ ์ํ |
์ค๋ ๋ ์์ ์ฑ ๋ฌธ์ | synchronized ๋๋ SwingWorker ์ฌ์ฉ |
์ค๋ ๋๊ฐ ์ข ๋ฃ๋์ง ์๋ ๋ฌธ์ | interrupt() ๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ ์ข
๋ฃ |
โ
Swing์ ํ์ฉํ๋ฉด GUI ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์์
โ
JFrame
, JButton
, JTextArea
๋ฑ์ ์ฌ์ฉํ์ฌ UI ๊ตฌ์ฑ
โ
์ด๋ฒคํธ ๋ฆฌ์ค๋(ActionListener
)๋ฅผ ํ์ฉํ์ฌ ๋ฒํผ ํด๋ฆญ ์ ๋์ ๊ตฌํ ๊ฐ๋ฅ
โ
Swing GUI์์ ๋ฉํฐ์ค๋ ๋๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ ์์
์ ์คํํ ์ ์์
โ
์ค๋ ๋ ์ข
๋ฃ ์ interrupt()
๋ฅผ ํ์ฉํ์ฌ ์์ ํ๊ฒ ์ข
๋ฃ ๊ฐ๋ฅ