๐ ๊ฐ์
Java ์์ ์ ์์ด์ ์ฝ์๋ก ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค๊ฐ Swing์ ์ด์ฉํด์ GUI๋ก ํํํ๋ฉด ์ฌ๋ฏธ๋ ์๊ณ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ํจ๊ณผ์ ์ธ ์์ ์ด ๋ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ๋ฒํผํ๋ ๋ง๋๋๋ฐ ๋ช์ค์ ์ฝ๋๋ฅผ ๋ฐ๋ณตํด์ ์จ์ผํ๋ ์์ ์ ๋งค์ฐ ๊ท์ฐฎ๋ค. ๊ฑฐ๊ธฐ์ xy์ขํ๊น์ง ์ ๊ฒฝ์ฐ๋ ค๋ฉด ์ด๋ฐ๋ถ ์์ ์์ ์ธ๋ด์ฌ์ ๊ฐ์ ธ์ผํ๋ค.
๋ํ ๋งค๋ฒ ๋ฐ๋ณต๋๋ ์ฝ๋๋ก ์ง๋ฃจํ ๋ถ๋ถ์ ํด๊ฒฐํด๋ณด์๋ ์๊ฐ์ผ๋ก UI ๋์์ธ ํด์ ๋ง๋ค์๋ค. ๋ฌผ๋ก GPT์ ํจ๊ป!
์์ ์๊ฐ ์ด 3์๊ฐ, ์์ผ๋ก ๊ธฐ๋ฅ๋ณด๊ฐํด์ ๋ ์ฌ๋ฏธ์๊ฒ ์ฌ์ฉํ ์ ์๋ฐ ์ ๊ทธ๋ ์ด๋ ์์ผ๋ณด๋ คํ๋ค.
๐งพ SwingUIDesigner ํ๋ก์ ํธ ์ค๋ช ์
SwingUIDesigner๋ Java Swing์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋น์ฃผ์ผ UI ๋์์ธ ํด์ ๋๋ค. ์ฌ์ฉ์๋ ๋ง์ฐ์ค๋ฅผ ์ด์ฉํด ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐ์นํ๊ณ ์์ฑ์ ์ค์ ํ ๋ค, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์คํ ๊ฐ๋ฅํ Java ์ฝ๋๋ก ์ ์ฅํ ์ ์์ต๋๋ค. ๋น์ ๋ฌธ ๊ฐ๋ฐ์๋ ์ง๊ด์ ์ผ๋ก GUI๋ฅผ ๊ตฌ์ฑํ ์ ์๋๋ก ๋๋ ๋๊ตฌ์ ๋๋ค.
๐งฉ ์ฃผ์ ๊ธฐ๋ฅ ์์ฝ
-
์ปดํฌ๋ํธ ์ถ๊ฐ
-๋์์ธ ์์ญ์ ๋๋ธํด๋ฆญํ๋ฉด ์ค์ ๋ค์ด์ผ๋ก๊ทธ๊ฐ ํ์๋จ
-์ง์๋๋ ์ปดํฌ๋ํธ ์ข ๋ฅ:JButton,JCheckBox,JRadioButton (๋ผ๋์ค ๊ทธ๋ฃน ๊ฐ๋ฅ),JLabel (TextView ์ญํ )
-์์ฑ ์ค์ ํญ๋ชฉ:ํ ์คํธ (๊ธฐ๋ณธ๊ฐ: ์๋ ์์ฑ๋ ์ปดํฌ๋ํธ ID), ํฐํธ ํฌ๊ธฐ, ํฌ๊ธฐ (width, height), ์์ (JColorChooser๋ก ์ ํ), JRadioButton์ ๊ฒฝ์ฐ ๊ทธ๋ฃน ID ์ค์ ๊ฐ๋ฅ
-
์ปดํฌ๋ํธ ์์น ์กฐ์
-์ปดํฌ๋ํธ๋ ๋๋๊ทธ๋ฅผ ํตํด ๋์์ธ ํจ๋ ๋ด์์ ์์ ๋กญ๊ฒ ์์น ์ด๋ ๊ฐ๋ฅ
-์ด๋๋ ์์น๋ ์๋์ผ๋ก ์ ์ฅ ์ฝ๋์ ๋ฐ์๋จ (getX(), getY() ํ์ฉ)
-
์๋ ์ปดํฌ๋ํธ ์ด๋ฆ ์์ฑ
-์์ฑ๋๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ ํ์ ๊ธฐ๋ฐ์ผ๋ก ๊ณ ์ ID ์๋ ๋ถ์ฌ
-์: button1, radio2, label3
-์ด ์ด๋ฆ์ ์ค์ Java ์ฝ๋ ๋ด ๋ณ์๋ช ์ผ๋ก ์ฌ์ฉ๋จ
-
๋ผ๋์ค ๋ฒํผ ๊ทธ๋ฃน ์ค์
-JRadioButton์ ๋์ผํ ๊ทธ๋ฃน ID๋ฅผ ๊ฐ๋ ๋ฒํผ๋ผ๋ฆฌ ButtonGroup์ผ๋ก ๋ฌถ์
-๋์์ ํ๋๋ง ์ ํ ๊ฐ๋ฅ
-๊ทธ๋ฃน ์ ๋ณด๋ ์ฝ๋์๋ ์๋ ๋ฐ์๋จ
-
์ปดํฌ๋ํธ ์ ํ ๋ฐ ์ญ์
-๋ง์ฐ์ค๋ก ํด๋ฆญ ์ ์ ํ ํ ๋๋ฆฌ(๋นจ๊ฐ์) ํ์
-์ ํ๋ ์ํ์์ Delete ํค๋ฅผ ๋๋ฅด๋ฉด ํด๋น ์ปดํฌ๋ํธ ์ญ์
-
์ค์๊ฐ ๋ง์ฐ์ค ์ขํ ํ์
-๋์์ธ ํจ๋ ์ข์ธก ์๋จ์ JLabel์ ํ์ํ์ฌ ๋ง์ฐ์ค ์ขํ๋ฅผ ์ค์๊ฐ ์ถ๋ ฅ
-ํด๋น ๋ผ๋ฒจ์ JLayeredPane์ ์ฌ์ฉํด designPanel ์์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฒน์ณ์ ํ์
-
50px ๋จ์ ๊ทธ๋ฆฌ๋ ํ์
-๋์์ธ ์์ญ ๋ฐฐ๊ฒฝ์ ์ฐํ ํ์ ์ ์ผ๋ก 50ํฝ์ ๋จ์ ๊ฒฉ์ ํ์
-์ปดํฌ๋ํธ ์ ๋ ฌ ๋ฐ ๋ฐฐ์น ์ ๊ฐ์ด๋ ์ญํ ์ํ
-
์ฝ๋ ๋ด๋ณด๋ด๊ธฐ ๋ฐ ์ ์ฅ
-โ์ฝ๋ ๋ด๋ณด๋ด๊ธฐโ: ์ฝ์์ Java ์ฝ๋ ์ถ๋ ฅ
-โ์ ์ฅํ๊ธฐโ: ์ฌ์ฉ์ ์ง์ ์์น์ .java ํ์ผ๋ก ์ ์ฅ (JFileChooser)
-์ ์ฅ๋๋ ์ฝ๋๋ ์ ์ฒด UI ๊ตฌ์ฑ์ ํฌํจํ ์คํ ๊ฐ๋ฅํ Java Swing ํ๋ก๊ทธ๋จ ํํ
๐ ์ ์ฅ๋๋ Java ํ์ผ ๊ตฌ์กฐ ์์
public class GuiCode {
public static void main(String[] args) {
JFrame frame = new JFrame("Generated UI");
JPanel panel = new JPanel(null);
Map<String, ButtonGroup> groupMap = new HashMap<>();
JButton button1 = new JButton("button1");
button1.setBounds(50, 100, 120, 30);
panel.add(button1);
JRadioButton radio1 = new JRadioButton("radio1");
radio1.setBounds(200, 100, 120, 30);
panel.add(radio1);
groupMap.computeIfAbsent("group1", k -> new ButtonGroup()).add(radio1);
frame.add(panel);
frame.setVisible(true);
}
}
๐งฑ ๊ธฐ์ ์์ ์์ฝ
JPanel UI ์์ญ ๋ถ๋ฆฌ ๋ฐ ์ปดํฌ๋ํธ ๋ฐฐ์น
JLayeredPane ์ขํ ๋ผ๋ฒจ์ ๊ฒน์ณ์ ํ์
MouseListener / MouseMotionListener ํด๋ฆญ, ์ด๋, ๋๋๊ทธ ์ฒ๋ฆฌ
ButtonGroup ๋ผ๋์ค ๋ฒํผ ๊ทธ๋ฃน ๊ด๋ฆฌ
JFileChooser ์ฌ์ฉ์ ์ง์ ์์น์ ํ์ผ ์ ์ฅ
null layout ์ ๋ ์ขํ ๊ธฐ๋ฐ ๋ฐฐ์น
paintComponent() ๊ฒฉ์ ํ์
๐ง ์ถ์ฒ ํ์ฅ ๊ธฐ๋ฅ (ํฅํ ๋ฐ์ ๋ฐฉํฅ) ๊ธฐ๋ฅ ์ ์ ์ค๋ช
์ ์ฅ๋ ๊ตฌ์ฑ ๋ถ๋ฌ์ค๊ธฐ JSON ๋ฑ์ผ๋ก ์ ์ฅ ํ ๋ค์ ๋ก๋ฉ ๊ฐ๋ฅ
Undo/Redo ์ฌ์ฉ์ ์ก์
์ ๊ธฐ๋กํ์ฌ ๋๋๋ฆฌ๊ธฐ ์ง์
Snap-to-grid ์ปดํฌ๋ํธ ์์น ์๋ ์ ๋ ฌ
์์ฑ ํธ์ง ๊ธฐ๋ฅ ์ด๋ฏธ ์์ฑ๋ ์ปดํฌ๋ํธ๋ฅผ ๋๋ธํด๋ฆญํ์ฌ ์์ฑ ์์
๋ ์ด์์ ๊ธฐ๋ฐ ์ค๊ณ ์ง์ BorderLayout, GridLayout ๋ฑ ๋
ผ๋ฆฌ ๋ฐฐ์น ๋์