[Java] IO | JFileChooser 메모장 구현

JTI·2023년 1월 18일
0

📌 Code list

목록 보기
45/55
post-thumbnail


import java.awt.BorderLayout;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;

public class Memo extends JFrame {
    private JMenuBar mBar;
    private JMenu mFile;
    private JMenuItem miOpen;
    private JMenuItem miNew;
    private JMenuItem miSave;
    private JMenuItem miNameSave;
    private JMenuItem miExit;

    private JTextArea taEditor;
    private JFileChooser chooser;

    private String title = "Simpled Pad";
    private String fileName = "";

    public Memo() {
        init();
        setDisplay();
        addListeners();
        showFrame();
    }
    public void init() {
        mBar = new JMenuBar();
        mFile = new JMenu("파일");
        miOpen = mFile.add("열기");
        miNew = mFile.add("새로 열기");

        miSave = new JMenuItem("저장");
        // 저장 단축키 설정: ctrl + s
        miSave.setAccelerator(
                KeyStroke.getKeyStroke(
                        KeyEvent.VK_S,
                        InputEvent.CTRL_DOWN_MASK
                )
        );
        miNameSave = new JMenuItem("다른이름으로 저장하기");
        // 다른이름으로 저장하기 단축키 설정: alt + s
        miNameSave.setAccelerator(
                KeyStroke.getKeyStroke(
                        KeyEvent.VK_S,
                        InputEvent.ALT_DOWN_MASK
                )
        );

        miExit = new JMenuItem("나가기");
        // 나가기 단축키 설정: alt + F4
        miExit.setAccelerator(
                KeyStroke.getKeyStroke(
                        KeyEvent.VK_F4,
                        InputEvent.ALT_DOWN_MASK
                )
        );

        mFile.add(miSave);
        mFile.add(miNameSave);
        mFile.addSeparator();
        mFile.add(miExit);
        mBar.add(mFile);
        setJMenuBar(mBar);

        taEditor = new JTextArea();
        taEditor.setTabSize(4);
        chooser = new JFileChooser(".");
    }

    private void setDisplay() {
        add(new JScrollPane(taEditor), BorderLayout.CENTER);
    }

    private void addListeners() {
        addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                if(!getTitle().equals(title)) { // *있을 때
                    if(taEditor.getText().trim().length() != 0) { // 안에 내용이 있을 때
                        int choice = JOptionPane.showConfirmDialog(
                                Memo.this,
                                "저장하시겠습니까?",
                                "저장",
                                JOptionPane.YES_NO_CANCEL_OPTION,
                                JOptionPane.INFORMATION_MESSAGE
                        );
                        if(choice == JOptionPane.YES_OPTION) {
                            System.exit(0);
                        } else if(choice == JOptionPane.CANCEL_OPTION) {
                            taEditor.setCaretPosition(0); // 내용 끝으로
                        } else {
                            System.exit(0); // 그냥 끔
                        }
                    }
                } else {
                    System.exit(0);
                }
            }
        });

        ActionListener aListeners = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Object src = e.getSource();
                if(src == miOpen) {
                    open();
                }
                if(src == miNew) {
                    newFile();
                }
                if(src == miNameSave) {
                    showSave();
                    saveFile(taEditor.getText());
                }
                if(src == miSave) {
                    if(fileName.equals("")) {
                        showSave();
                    }
                    saveFile(taEditor.getText());
                }
                if(src == miExit) {
                    System.exit(0);
                }
            }
        };
        miOpen.addActionListener(aListeners);
        miSave.addActionListener(aListeners);
        miNameSave.addActionListener(aListeners);
        miExit.addActionListener(aListeners);


        // 내용을 나타내는 객체
        Document doc = taEditor.getDocument(); // 다큐먼트로 돌아옴
        doc.addDocumentListener(new DocumentListener() {

            @Override
            public void removeUpdate(DocumentEvent e) {
                if(taEditor.getText().trim().length() == 0) {
                    setTitle(title);
                }
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                // 추가가 됐을 때 지워지거나 추가됐을 때 타이틀바에 "*"이 생김
                setTitle("*" + title);
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                // TextArea에서 글자 크기, 폰트 , 효과가 바뀔 때 사용됨
            }
        });

    }
    // 파일 열기
    private void open() {
        int choice = chooser.showOpenDialog(this);
        if(choice == JFileChooser.APPROVE_OPTION) {
            File f = chooser.getSelectedFile();

            FileReader fr = null;
            BufferedReader br = null;

            try {
                fr = new FileReader(f);
                br = new BufferedReader(fr);

                String line = null;
                StringBuffer buf = new StringBuffer();

                while( (line = br.readLine()) != null ) {
                    buf.append(line);
                    buf.append("\n");
                }
                taEditor.setText(buf.toString());

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                IOUtil.closeAll(br, fr);
            }
        } else {
            JOptionPane.showConfirmDialog(
                    Memo.this,
                    "파일을 선택해주세요!",
                    "파일선택",
                    JOptionPane.WARNING_MESSAGE,
                    JOptionPane.OK_OPTION
            );
        }
    }
    // 새로 열기
    private void newFile() {
        taEditor.setText("");
        setTitle(title);
    }


    // 다른이름 저장하기 + 처음 파일 저장: chooser 열기 (처음에 무조건 이 메서드 들어감)
    private void showSave() {
        int choice = chooser.showSaveDialog(null);
        if(choice != JFileChooser.APPROVE_OPTION) {
            JOptionPane.showMessageDialog(
                    Memo.this,
                    "파일을 선택하지 않았습니다."
            );
            return;
        }
        fileName = chooser.getSelectedFile().getPath();
    }
    // 파일 저장
    private void saveFile(String fn) {
        FileWriter fw = null;
        PrintWriter pw = null;
        //File file = new File(fileName);

        try {
            fw = new FileWriter(fileName);
            pw = new PrintWriter(fw);

            pw.println(fn);
            pw.flush();
            this.setTitle(title);

        } catch (FileNotFoundException fe) {}
        catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtil.closeAll();
        }

    }

    private void showFrame() {
        setTitle("Simpled Pad");
        setSize(400, 600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        setVisible(true);

    }


    public static void main(String[] args) {
        new Memo();
    }

}
profile
Fill in my own colorful colors🎨

0개의 댓글