๐Ÿ“Œ Java Swing์„ ํ™œ์šฉํ•œ ์ฑ„ํŒ… ํ”„๋กœ๊ทธ๋žจ - ํŒŒ์ผ ์ €์žฅ ๋ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

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

JAVA

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

๐Ÿ“… ๋‚ ์งœ

2025-03-13

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

1๏ธโƒฃ Java Swing GUI ๊ตฌ์„ฑ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Java Swing์„ ํ™œ์šฉํ•˜์—ฌ ์ฑ„ํŒ… ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ฑ„ํŒ… ๋‚ด์šฉ์„ JTextArea์— ์ถœ๋ ฅํ•˜๊ณ , ํŒŒ์ผ ์ €์žฅ ๋ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ… ์‚ฌ์šฉ๋œ GUI ์ปดํฌ๋„ŒํŠธ

  • JFrame โ†’ GUI ์ฐฝ ์ƒ์„ฑ
  • JPanel โ†’ GUI ์š”์†Œ ๋ฐฐ์น˜
  • JTextArea โ†’ ์ฑ„ํŒ… ๋‚ด์šฉ ์ถœ๋ ฅ
  • JTextField โ†’ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ํ•„๋“œ
  • JButton โ†’ ๊ธฐ๋Šฅ ๋ฒ„ํŠผ (์ €์žฅ, ๋ถˆ๋Ÿฌ์˜ค๊ธฐ, ์ž…๋ ฅ)
  • JScrollPane โ†’ JTextArea์— ์Šคํฌ๋กค ์ถ”๊ฐ€

2๏ธโƒฃ Java Swing ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ ํด๋ฆญ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ, ๋งˆ์šฐ์Šค ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

โœ… ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

  • ActionListener โ†’ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
  • KeyListener โ†’ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ๊ฐ์ง€ (Enter ํ‚ค)
  • MouseListener โ†’ ๋งˆ์šฐ์Šค ํด๋ฆญ ๊ฐ์ง€

โœ… ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ฉ”์„œ๋“œ

  • actionPerformed(ActionEvent e) โ†’ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
  • keyPressed(KeyEvent e) โ†’ ํ‚ค ์ž…๋ ฅ ์ฒ˜๋ฆฌ
  • mouseClicked(MouseEvent e) โ†’ ๋งˆ์šฐ์Šค ํด๋ฆญ ๊ฐ์ง€

3๏ธโƒฃ Java ํŒŒ์ผ ์ž…์ถœ๋ ฅ (I/O)

โœ… ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ(JFileChooser) ํ™œ์šฉ

  • showSaveDialog() โ†’ ํŒŒ์ผ ์ €์žฅ ๋‹ค์ด์–ผ๋กœ๊ทธ
  • showOpenDialog() โ†’ ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋‹ค์ด์–ผ๋กœ๊ทธ

โœ… ํŒŒ์ผ ์ €์žฅ (FileWriter)

try (Writer out = new FileWriter(filePath)) {
    out.write(area1.getText());
}
  • FileWriter๋ฅผ ์‚ฌ์šฉํ•ด ์ฑ„ํŒ… ๋‚ด์šฉ์„ .txt ํŒŒ์ผ๋กœ ์ €์žฅ
  • try-with-resources ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ close()

โœ… ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ (FileReader)

try (Reader fin = new FileReader(selectedFile)) {
    StringBuffer buffer = new StringBuffer();
    int data;
    while ((data = fin.read()) != -1) {
        buffer.append((char) data);
    }
    area1.setText(buffer.toString());
}
  • FileReader๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ์ผ ๋‚ด์šฉ์„ ์ฝ์–ด์™€ JTextArea์— ์ถœ๋ ฅ
  • while ๋ฃจํ”„๋ฅผ ์ด์šฉํ•ด ํ•œ ๋ฌธ์ž์”ฉ ์ฝ์–ด StringBuffer์— ์ €์žฅ

4๏ธโƒฃ Java Swing ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜

โœ… setBounds(x, y, width, height) โ†’ GUI ์š”์†Œ์˜ ์œ„์น˜ ๋ฐ ํฌ๊ธฐ ์„ค์ •
โœ… panel.add(component) โ†’ ํŒจ๋„์— GUI ์š”์†Œ ์ถ”๊ฐ€
โœ… frame.add(panel) โ†’ ํŒจ๋„์„ ํ”„๋ ˆ์ž„์— ์ถ”๊ฐ€


5๏ธโƒฃ Java ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ (Enter ํ‚ค ๊ฐ์ง€)

โœ… KeyListener๋ฅผ ํ™œ์šฉํ•ด Enter ํ‚ค ์ž…๋ ฅ ๊ฐ์ง€
โœ… VK_ENTER ์‚ฌ์šฉํ•˜์—ฌ Enter ํ‚ค ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
โœ… ์ž…๋ ฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ JTextArea์— ์ถ”๊ฐ€ ํ›„ JTextField ์ดˆ๊ธฐํ™”

@Override
public void keyPressed(KeyEvent e) {
    if (e.getSource() == txt1 && e.getKeyCode() == KeyEvent.VK_ENTER) {
        String message = txt1.getText();
        area1.append(message + "\n");
        txt1.setText(""); // ์ž…๋ ฅ ํ•„๋“œ ์ดˆ๊ธฐํ™”
    }
}

๐Ÿ“Œ ์ „์ฒด ์ฝ”๋“œ

package ch19;

import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.text.BadLocationException;

class C08GUI extends JFrame implements ActionListener, KeyListener, MouseListener {
    JButton btn1, btn2, btn3, input;
    JTextField txt1;
    JTextArea area1;
    Writer out;

    C08GUI(String title) {
        super(title);
        setBounds(100, 100, 410, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(null);

        area1 = new JTextArea();
        area1.setBounds(10, 10, 260, 280);
        JScrollPane scroll1 = new JScrollPane(area1);
        scroll1.setBounds(10, 10, 250, 280);

        btn1 = new JButton("์ €์žฅํ•˜๊ธฐ");
        btn1.setBounds(270, 10, 110, 30);
        btn2 = new JButton("๋ถˆ๋Ÿฌ์˜ค๊ธฐ");
        btn2.setBounds(270, 50, 110, 30);
        btn3 = new JButton("๋Œ€ํ™”๊ธฐ๋ก๋ณด๊ธฐ");
        btn3.setBounds(270, 90, 110, 30);
        input = new JButton("์ž…๋ ฅ");
        input.setBounds(270, 300, 110, 30);
        txt1 = new JTextField();
        txt1.setBounds(10, 300, 250, 30);

        btn1.addActionListener(this);
        btn2.addActionListener(this);
        btn3.addActionListener(this);
        input.addActionListener(this);
        txt1.addKeyListener(this);
        area1.addMouseListener(this);

        panel.add(scroll1);
        panel.add(btn1);
        panel.add(btn2);
        panel.add(btn3);
        panel.add(input);
        panel.add(txt1);

        add(panel);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btn1) {
            saveChat();
        } else if (e.getSource() == btn2) {
            loadChat();
        } else if (e.getSource() == btn3) {
            System.out.println("๋Œ€ํ™”๊ธฐ๋ก๋ณด๊ธฐ (๋ฏธ๊ตฌํ˜„)");
        } else if (e.getSource() == input) {
            System.out.println("์ž…๋ ฅ");
        }
    }

    private void saveChat() {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setDialogTitle("ํŒŒ์ผ ์ €์žฅ ์œ„์น˜๋ฅผ ์„ ํƒํ•˜์„ธ์š”");

        int selectedVal = fileChooser.showSaveDialog(null);
        if (selectedVal == JFileChooser.APPROVE_OPTION) {
            File selectedFile = fileChooser.getSelectedFile();
            String filePath = selectedFile.toString();

            if (!filePath.endsWith(".txt")) {
                filePath += ".txt";
            }

            try (Writer out = new FileWriter(filePath)) {
                out.write(area1.getText());
                System.out.println("ํŒŒ์ผ ์ €์žฅ ์™„๋ฃŒ: " + filePath);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void loadChat() {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setDialogTitle("๋ถˆ๋Ÿฌ์˜ฌ ํŒŒ์ผ์„ ์„ ํƒํ•˜์„ธ์š”");

        int selectedVal = fileChooser.showOpenDialog(null);
        if (selectedVal == JFileChooser.APPROVE_OPTION) {
            File selectedFile = fileChooser.getSelectedFile();
            try (Reader fin = new FileReader(selectedFile)) {
                StringBuffer buffer = new StringBuffer();
                int data;
                while ((data = fin.read()) != -1) {
                    buffer.append((char) data);
                }
                area1.setText(buffer.toString());
                System.out.println("ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์™„๋ฃŒ: " + selectedFile);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getSource() == txt1 && e.getKeyCode() == KeyEvent.VK_ENTER) {
            String message = txt1.getText();
            area1.append(message + "\n");
            txt1.setText("");
        }
    }

    @Override public void keyTyped(KeyEvent e) {}
    @Override public void keyReleased(KeyEvent e) {}
    @Override public void mouseClicked(MouseEvent e) {}
    @Override public void mousePressed(MouseEvent e) {}
    @Override public void mouseReleased(MouseEvent e) {}
    @Override public void mouseEntered(MouseEvent e) {}
    @Override public void mouseExited(MouseEvent e) {}
}

public class C08SwingEventMain {
    public static void main(String[] args) {
        new C08GUI("Chatting UI");
    }
}
profile
Here, My Pale Blue.๐ŸŒ

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