核心功能方法實作
事件委派方法
public void File_new_actionPerformed(ActionEvent e) { FileNew(); }
public void File_open_actionPerformed(ActionEvent e) { FileOpen(); }
public void File_save_actionPerformed(ActionEvent e) { FileSave(); }
public void File_saveto_actionPerformed(ActionEvent e) { FileSaveTo(); }
public void File_close_actionPerformed(ActionEvent e) { FileClose(); }
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) pm.show(this, e.getX(), e.getY());
}
// 其他滑鼠事件留空...
關閉確認邏輯
boolean toExit() {
if (bsaved) return true;
int i = JOptionPane.showConfirmDialog(this, "是否保存文件", "Jishiben",
JOptionPane.YES_NO_CANCEL_OPTION);
switch (i) {
case JOptionPane.YES_OPTION: return true;
case JOptionPane.NO_OPTION: return false;
case JOptionPane.CANCEL_OPTION: return false;
default: return false;
}
}
檔案新建
void FileNew() {
if (bsaved) {
jTextArea1.setText("");
jTextArea1.setFocusable(true);
setTitle("未命名");
statubar.setText("新建文本");
} else {
FileSaveTo();
}
}
檔案開啟
void FileOpen() {
if (!bsaved) { FileSave(); return; }
try {
if (jFileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
String path = jFileChooser.getSelectedFile().getPath();
File file = new File(path);
char[] data = new char[(int) file.length()];
int num = 0;
FileReader fr = new FileReader(file);
while (fr.ready()) num += fr.read(data, num, data.length - num);
fr.close();
jTextArea1.setText(new String(data, 0, num));
filename = path;
setTitle(filename);
statubar.setText("打開: " + filename);
updateFname();
bsaved = false;
}
} catch (Exception e) {
statubar.setText("Error Open: " + e.getMessage());
}
}
檔案儲存
boolean FileSave() {
if (filename == null) return FileSaveTo();
if (!bsaved && filename.length() != 0) {
try {
FileWriter fw = new FileWriter(new File(filename));
fw.write(jTextArea1.getText());
fw.close();
statubar.setText("保存文件: " + filename);
bsaved = true;
updateFname();
} catch (Exception e) {
statubar.setText("保存出錯: " + e.getMessage());
}
} else if (filename.length() == 0) {
return FileSaveTo();
}
return true;
}
另存新檔
boolean FileSaveTo() {
if (jFileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
filename = jFileChooser.getSelectedFile().getPath();
return FileSave();
}
return false;
}
標題更新
void updateFname() {
String str = (filename == null) ? "無標題" : filename;
if (!bsaved) str = "記事本" + str;
setTitle(str);
repaint();
}
檔案關閉
void FileClose() {
if (!bsaved) {
if (toExit()) FileSave();
else System.exit(0);
} else {
System.exit(0);
}
}
編輯操作:剪貼簿整合
void FileCut(ActionEvent e) {
try {
String str = jTextArea1.getSelectedText();
if (str != null && str.length() != 0) {
cb.setContents(new StringSelection(str), null);
jTextArea1.replaceRange("", jTextArea1.getSelectionStart(), jTextArea1.getSelectionEnd());
bsaved = false;
}
} catch (Exception ex) { statubar.setText("剪切出錯: " + ex.getMessage()); }
}
void FileCopy(ActionEvent e) {
try {
String str = jTextArea1.getSelectedText();
if (str != null && str.length() != 0)
cb.setContents(new StringSelection(str), null);
} catch (Exception ex) { statubar.setText("複製出錯: " + ex.getMessage()); }
}
void FilePaste(ActionEvent e) {
try {
Transferable tr = cb.getContents(this);
if (tr != null && tr.isDataFlavorSupported(DataFlavor.stringFlavor)) {
String s = (String) tr.getTransferData(DataFlavor.stringFlavor);
if (s != null) {
jTextArea1.replaceRange(s, jTextArea1.getSelectionStart(), jTextArea1.getSelectionEnd());
bsaved = false;
}
}
} catch (Exception err) { err.printStackTrace(); }
}
void FileDel(ActionEvent e) {
jTextArea1.replaceRange("", jTextArea1.getSelectionStart(), jTextArea1.getSelectionEnd());
bsaved = false;
}
查找與時間戳
void FileFindNext(ActionEvent e) { new Frame1(jTextArea1); } // 假設 Frame1 為查找對話框
void FileTime(ActionEvent e) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
jTextArea1.append(" 當前時間: " + sdf.format(new Date()));
}