以下是我用Swing 组件编写的记事本,功能是模仿微软的,使用了观感,自我觉得界面比Win的记事本更为好看(臭屁一下吧)。除了没有做字体选择之外,其他功能基本都有了吧。
/** **/
/**
*Author:
Zhang Zhijian
*Mail: qnjian@163.com
*Created on 2005-5-22
* 声明:本程序版权归作者所有,允许以学习目的的传播,
* 但必须保留本作者署名及源程序的完整!
*/
package
com.qnjian.notpad;

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

public
class
NotePad
extends
JFrame
implements
ActionListener,ItemListener

{
boolean
haveCreated
=
false
;
File file
=
null
;
String strtext
=
""
;
int
findIndex
=
0
;
String findStr;
JMenuBar menubar
=
new
JMenuBar();
JMenu meFile
=
new
JMenu(
"
文件
"
);
JMenu meEdit
=
new
JMenu(
"
编辑
"
);
JMenu meStyle
=
new
JMenu(
"
风格
"
);
JMenu meHelp
=
new
JMenu(
"
帮助
"
);
JMenuItem miCreate
=
new
JMenuItem(
"
新建
"
);
JMenuItem miOpen
=
new
JMenuItem(
"
打开
"
);
JMenuItem miSave
=
new
JMenuItem(
"
保存
"
);
JMenuItem miSaveAs
=
new
JMenuItem(
"
另存为
"
);
JMenuItem miExit
=
new
JMenuItem(
"
退出
"
);
JMenuItem miUndo
=
new
JMenuItem(
"
撤消
"
);
JMenuItem miCut
=
new
JMenuItem(
"
剪切
"
);
JMenuItem miCopy
=
new
JMenuItem(
"
复制
"
);
JMenuItem miPaste
=
new
JMenuItem(
"
粘贴
"
);
JMenuItem miDelete
=
new
JMenuItem(
"
删除
"
);
JMenuItem miFind
=
new
JMenuItem(
"
查找
"
);
JMenuItem miNext
=
new
JMenuItem(
"
查找下一个
"
);
JMenuItem miReplace
=
new
JMenuItem(
"
替换
"
);
//
右键弹出菜单项
JMenuItem pmUndo
=
new
JMenuItem(
"
撤消
"
);
JMenuItem pmCut
=
new
JMenuItem(
"
剪切
"
);
JMenuItem pmCopy
=
new
JMenuItem(
"
复制
"
);
JMenuItem pmPaste
=
new
JMenuItem(
"
粘贴
"
);
JMenuItem pmDelete
=
new
JMenuItem(
"
删除
"
);
JCheckBoxMenuItem miNewLine
=
new
JCheckBoxMenuItem(
"
自动换行
"
);
JMenu smLookFeel
=
new
JMenu(
"
观感
"
);
JMenuItem metal
=
new
JMenuItem(
"
Metal
"
);
JMenuItem motif
=
new
JMenuItem(
"
Motif
"
);
JMenuItem windows
=
new
JMenuItem(
"
Windows
"
);
JMenuItem miAbout
=
new
JMenuItem(
"
关于
"
);
JPopupMenu popupMenu;
JTextArea text
=
new
JTextArea();

public
NotePad()

{
super
(
"
我的记事本
"
);
//
为便于区分事件源,设定名字
miCreate.setActionCommand(
"
create
"
);
miOpen.setActionCommand(
"
open
"
);
miSave.setActionCommand(
"
save
"
);
miSaveAs.setActionCommand(
"
saveAs
"
);
miExit.setActionCommand(
"
exit
"
);
miUndo.setActionCommand(
"
undo
"
);
miCut.setActionCommand(
"
cut
"
);
miCopy.setActionCommand(
"
copy
"
);
miPaste.setActionCommand(
"
paste
"
);
miDelete.setActionCommand(
"
delete
"
);
miFind.setActionCommand(
"
find
"
);
miNext.setActionCommand(
"
next
"
);
miReplace.setActionCommand(
"
replace
"
);
miNewLine.setActionCommand(
"
newLine
"
);
miAbout.setActionCommand(
"
about
"
);
pmUndo.setActionCommand(
"
undo
"
);
pmCut.setActionCommand(
"
cut
"
);
pmCopy.setActionCommand(
"
copy
"
);
pmPaste.setActionCommand(
"
paste
"
);
pmDelete.setActionCommand(
"
delete
"
);
this
.setSize(
500
,
500
);
this
.setLocation(
300
,
150
);
this
.setJMenuBar(menubar);
meFile.setFont(
new
Font(
"
宋体
"
,Font.BOLD,
15
));
meEdit.setFont(
new
Font(
"
宋体
"
,Font.BOLD,
15
));
meStyle.setFont(
new
Font(
"
宋体
"
,Font.BOLD,
15
));
meHelp.setFont(
new
Font(
"
宋体
"
,Font.BOLD,
15
));
menubar.add(meFile);
menubar.add(meEdit);
menubar.add(meStyle);
menubar.add(meHelp);
meFile.add(miCreate);
meFile.add(miOpen);
meFile.add(miSave);
meFile.add(miSaveAs);
meFile.addSeparator();
meFile.add(miExit);
meEdit.add(miUndo);
meEdit.addSeparator();
meEdit.add(miCut);
meEdit.add(miCopy);
meEdit.add(miPaste);
meEdit.add(miDelete);
meEdit.addSeparator();
meEdit.add(miFind);
meEdit.add(miNext);
meEdit.addSeparator();
meEdit.add(miReplace);
meStyle.add(miNewLine);
meStyle.add(smLookFeel);
smLookFeel.add(metal);
smLookFeel.add(motif);
smLookFeel.add(windows);
meHelp.add(miAbout);
//
添加到右键弹出菜单
popupMenu
=
new
JPopupMenu();
popupMenu.add(pmUndo);
popupMenu.addSeparator();
popupMenu.add(pmCut);
popupMenu.add(pmCopy);
popupMenu.add(pmPaste);
popupMenu.add(pmDelete);
//
添加按钮事件监听
meHelp.addActionListener(
this
);
miCreate.addActionListener(
this
);
miOpen.addActionListener(
this
);
miSave.addActionListener(
this
);
miSaveAs.addActionListener(
this
);
miExit.addActionListener(
this
);
miUndo.addActionListener(
this
);
miCut.addActionListener(
this
);
miCopy.addActionListener(
this
);
miPaste.addActionListener(
this
);
miDelete.addActionListener(
this
);
miFind.addActionListener(
this
);
miNext.addActionListener(
this
);
miReplace.addActionListener(
this
);
miNewLine.addItemListener(
this
);
miAbout.addActionListener(
this
);
metal.addActionListener(
this
);
motif.addActionListener(
this
);
windows.addActionListener(
this
);
//
添加右键按钮事件监听器
pmUndo.addActionListener(
this
);
pmCut.addActionListener(
this
);
pmCopy.addActionListener(
this
);
pmPaste.addActionListener(
this
);
pmDelete.addActionListener(
this
);
//
文本区内容没有选中时某些按钮不可用
miCut.setEnabled(
false
);
miCopy.setEnabled(
false
);
miDelete.setEnabled(
false
);
pmCut.setEnabled(
false
);
pmCopy.setEnabled(
false
);
pmDelete.setEnabled(
false
);
JScrollPane scrollPane
=
new
JScrollPane(text);
getContentPane().add(scrollPane,
"
Center
"
);
text.setFont(
new
Font(
"
Fixedsys
"
,Font.TRUETYPE_FONT,
15
));
setVisible(
true
);
//
添加键盘输入监听器
text.addFocusListener(
new
MyFocusAdapter());
//
添加鼠标监听器,用于激活右键弹出菜单
text.addMouseListener(
new
MouseAdapter()

{
public
void
mouseReleased(MouseEvent e)

{
if
(e.isPopupTrigger())

{
popupMenu.show(e.getComponent(),e.getX(),e.getY());
}
}
}
);
//
添加窗口关闭监听器
addWindowListener(
new
WindowAdapter()

{
public
void
windowClosing(WindowEvent e)

{
//
询问是否保存时选择撤消
int
i;
if
( (i
=
askForSave())
==
3
)

{
return
;
}
System.exit(
0
);
}
}
);
}
//////////////////////////
Methods
////////////////////////////////////
/
//
打开
public
void
open()

{
JFileChooser jc
=
new
JFileChooser();
jc.showOpenDialog(
this
);
File f
=
jc.getSelectedFile();
if
(f
==
null
)
//
没有选择文件则退出
{
return
;
}
file
=
f;
//
file 是File类的对象,为本类属性,在保存当前内容时用
this
.setTitle(f.getName()
+
"
--记事本
"
);
FileReader fr
=
null
;
int
len
=
(
int
)f.length();
char
[] ch
=
new
char
[len];
int
num
=
0
;
try
{
fr
=
new
FileReader(f);
while
(fr.ready())

{
num
+=
fr.read(ch,num,len
-
num);
}
//
保存在属性strtext中,为了便于撤消恢复及监视内容是否改变
strtext
=
new
String(ch,
0
,num);
haveCreated
=
false
;
text.setText(strtext);
}
catch
(Exception e)

{
JOptionPane.showMessageDialog(
this
,
"
出错:
"
+
e.getMessage());
}
finally
{
try
{
fr.close();
}
catch
(IOException e)

{
JOptionPane.showMessageDialog(
this
,
"
出错:
"
+
e.getMessage());
}
}
}
//
保存
public
void
save(File f)

{
String saveStr
=
text.getText();
FileWriter fw
=
null
;
try
{
fw
=
new
FileWriter(f);
fw.write(saveStr);
fw.flush();
}
catch
(Exception e)

{
JOptionPane.showMessageDialog(
this
,
"
出错:
"
+
e.getMessage());
}
finally
{
try
{
fw.close();
}
catch
(IOException e)

{
JOptionPane.showMessageDialog(
this
,
"
出错:
"
+
e.getMessage());
}
}
haveCreated
=
false
;
JOptionPane.showMessageDialog(
this
,
"
文件保存成功!
"
);
}
//
另存为
public
void
saveAs()

{
JFileChooser fs
=
new
JFileChooser();
fs.showSaveDialog(
this
);
File f
=
fs.getSelectedFile();
if
(f
!=
null
)

{
save(f);
this
.setTitle(f.getName()
+
"
--记事本
"
);
file
=
f;
}
}
/** */
/**
如果显示的文件内容与原来有改变,询问是否保存
*
@return
int 0: no operation 1:yes 2:no 3:cancel -1:error return
*/
public
int
askForSave()

{
if
(haveCreated
&&
text.getText()
==
""
)

{
return
0
;
}
if
(text.getText().equals(strtext)
==
false
)

{
String fn;
if
(file
!=
null
)

{
fn
=
""
+
file.getName();
}
else
{
fn
=
"
未命名
"
;
}
int
i
=
JOptionPane.showConfirmDialog(
this
,
"
文件
"
+
fn
+
"
的文字已经改变。
"
+
"
\n要保存文件吗?
"
,
"
记事本
"
,JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
if
(i
==
JOptionPane.YES_OPTION)

{
if
(file
==
null
)

{
saveAs();
}
else
{
save(file);
