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();
}
}