本文展示一個基於 Swing 的記事本完整源碼,實現了新建、打開、保存、另存為、編輯 (剪切/複製/粘貼/刪除/全選)、查找/替換、日期時間插入、自動換行、字體/顏色選擇、右鍵彈出菜單、狀態欄顯示等功能。唯一缺憾是「撤銷/重做」功能尚未實現,文末給出實現思路供參考。
JFrame + BorderLayout,頂部 JMenuBar,中部 JScrollPane(JTextArea),底部 JLabel 狀態欄。JPopupMenu,所有 JMenuItem 綁定快捷鍵 (Ctrl+N/O/S/Q, Ctrl+Z/X/C/V 等) 並採用 ActionListener 適配器模式分發事件。JFileChooser 選擇路徑,FileReader/Writer 讀寫文本,dirty 標記跟蹤內容是否修改。FindDlg/ReplaceDlg 獲取關鍵字,JTextArea 文本範圍搜索與替換邏輯。JTextArea.setLineWrap()、JFontChooser (自定義)、JColorChooser 修改字體顏色。public class Jsb {
boolean dirty = false; String filename = "";
JFrame frame = new JFrame("我的記事本");
JTextArea text = new JTextArea();
JMenuBar Mbar = new JMenuBar();
// ... 菜單項聲明 ...
public Jsb() {
// 佈局、菜單構建、事件綁定、顯示
frame.setSize(600, 500);
frame.setJMenuBar(Mbar);
// 文件菜單
JMenuItem jnew = new JMenuItem("新建(N)");
jnew.setAccelerator(KeyStroke.getKeyStroke('N', Event.CTRL_MASK));
jnew.addActionListener(e -> newtext());
// ... 其他菜單項類似 ...
text.addCaretListener(e -> dirty = true);
text.addMouseListener(e -> {
if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0)
pop.show((Component)e.getSource(), e.getX(), e.getY());
});
frame.setVisible(true);
}
// 業務方法: newtext(), opentext(), save(), saveas(), close(),
// cut(), copy(), paste(), delete(), find(), replace(), undo() 等
}
Swing 提供 javax.swing.undo.UndoManager 配合 Document 事件實現:
UndoManager undoMgr = new UndoManager();
text.getDocument().addUndoableEditListener(e -> undoMgr.addEdit(e.getEdit()));
// 菜單項動作
jundo.addActionListener(e -> {
if (undoMgr.canUndo()) undoMgr.undo();
});
jredo.addActionListener(e -> {
if (undoMgr.canRedo()) undoMgr.redo();
});
需注意:UndoManager 默認合併連續輸入,可通過 setLimit() 控制歷史深度;大文本建議定期清理或使用 CompoundEdit 分組。
Jsb 類即可啟動。完整源碼已在原文給出,可直接複製作為課程設計或二次開發基礎。