• 第二十二章《记事本》第3节:项目完整代码


    记事本项目总共有7个类,这7个类的作用已在22.1.2小节中做过介绍,此处不再赘述,以下是这7个类的源代码,读者也能在本书提供的源代码文件夹中直接下载它们。

    NoteBookFrame.java

    1. import java.awt.*;
    2. import java.awt.event.*;
    3. import javax.swing.*;
    4. import java.io.*;
    5. import javax.swing.event.*;
    6. import javax.print.*;
    7. import javax.print.attribute.*;
    8. import java.nio.charset.Charset;
    9. import java.util.*;
    10. import java.text.*;
    11. public class NoteBookFrame extends JFrame {
    12. JScrollPane JSPane;//放置文本区的滚动面板
    13. JTextArea text;//记事本文本区
    14. JMenuBar mainMenuBar;//菜单蓝
    15. JMenu fileMenu, editMenu, formatMenu, helpMenu;//各菜单
    16. //File菜单的菜单项
    17. JMenuItem newItem, openItem, saveItem, saveasItem, pageItem, printItem, exitItem;
    18. // 编辑菜单的菜单项
    19. JMenuItem undoItem, cutItem, copyItem, pasteItem, findItem, replaceItem, selectallItem, dateItem;
    20. //检查框菜单项,用于设置是否自动换行
    21. JCheckBoxMenuItem wrapItem;
    22. //字体设置菜单项
    23. JMenuItem fontItem;
    24. //帮助主题和关于菜单项
    25. JMenuItem helpItem, aboutItem;
    26. //右键菜单
    27. JPopupMenu popMenu;
    28. //字体设置对话框
    29. FontDialog myFontDialog = null;
    30. boolean changed = false;
    31. boolean haveName = false;
    32. //当前打开的这个文件
    33. File file = null;
    34. //当前文件的字符编码
    35. String charSet = new String("");
    36. //创建一个事件监听器对象
    37. ActionListenerImpl listener = new ActionListenerImpl();
    38. //初始化窗体组件
    39. private void init() {
    40. Container container = this.getContentPane();
    41. text = new JTextArea();
    42. JSPane = new JScrollPane(text);
    43. container.add(JSPane, BorderLayout.CENTER);
    44. createMenu();//创建主菜单
    45. createPopupMenu();//创建弹出式菜单
    46. this.setJMenuBar(mainMenuBar);//设置菜单
    47. text.setComponentPopupMenu(popMenu);
    48. //为文本区添加监听器
    49. text.getDocument().addDocumentListener(new DocumentListener() {
    50. @Override
    51. public void insertUpdate(DocumentEvent e) {
    52. changed = true;
    53. }
    54. @Override
    55. public void removeUpdate(DocumentEvent e) {
    56. changed = true;
    57. }
    58. @Override
    59. public void changedUpdate(DocumentEvent e) {
    60. //不需要动作
    61. }
    62. });
    63. //为文本区添加键盘监听器
    64. text.addKeyListener(new HandleKey());
    65. //为文本区添加键盘监听器
    66. text.addMouseListener(new HandleMouse());
    67. }
    68. //创建界面、安装各种监听器、
    69. public NoteBookFrame() {
    70. init();
    71. }
    72. //创建主菜单
    73. public void createMenu() {
    74. //创建JMenuBar
    75. mainMenuBar = new JMenuBar();
    76. //创建四个JMenu
    77. fileMenu = new JMenu("文件");
    78. editMenu = new JMenu("编辑");
    79. formatMenu = new JMenu("格式");
    80. helpMenu = new JMenu("帮助");
    81. //创建JMenuItem并添加到对应的JMenu中
    82. mainMenuBar.add(fileMenu);
    83. newItem = new JMenuItem("新建");
    84. openItem = new JMenuItem("打开..");
    85. saveItem = new JMenuItem("保存..");
    86. saveasItem = new JMenuItem("另存为..");
    87. pageItem = new JMenuItem("页面设置..");
    88. printItem = new JMenuItem("打印..");
    89. exitItem = new JMenuItem("退出");
    90. fileMenu.add(newItem);
    91. fileMenu.add(openItem);
    92. fileMenu.add(saveItem);
    93. fileMenu.add(saveasItem);
    94. fileMenu.addSeparator();
    95. fileMenu.add(pageItem);
    96. fileMenu.add(printItem);
    97. fileMenu.addSeparator();
    98. fileMenu.add(exitItem);
    99. mainMenuBar.add(editMenu);
    100. undoItem = new JMenuItem("撤消");
    101. cutItem = new JMenuItem("剪切");
    102. copyItem = new JMenuItem("复制");
    103. pasteItem = new JMenuItem("粘贴");
    104. findItem = new JMenuItem("查找..");
    105. replaceItem = new JMenuItem("替换..");
    106. selectallItem = new JMenuItem("全选");
    107. dateItem = new JMenuItem("时间/日期");
    108. editMenu.add(undoItem);
    109. editMenu.addSeparator();
    110. editMenu.add(cutItem);
    111. editMenu.add(copyItem);
    112. editMenu.add(pasteItem);
    113. editMenu.addSeparator();
    114. editMenu.add(findItem);
    115. editMenu.add(replaceItem);
    116. editMenu.addSeparator();
    117. editMenu.add(selectallItem);
    118. editMenu.add(dateItem);
    119. mainMenuBar.add(formatMenu);
    120. wrapItem = new JCheckBoxMenuItem("自动换行");
    121. fontItem = new JMenuItem("设置字体..");
    122. formatMenu.add(wrapItem);
    123. formatMenu.add(fontItem);
    124. mainMenuBar.add(helpMenu);
    125. helpItem = new JMenuItem("帮助主题");
    126. aboutItem = new JMenuItem("关于..");
    127. helpMenu.add(helpItem);
    128. helpMenu.add(aboutItem);
    129. exitItem.addActionListener(listener);
    130. saveItem.addActionListener(listener);
    131. saveasItem.addActionListener(listener);
    132. newItem.addActionListener(listener);
    133. printItem.addActionListener(listener);
    134. openItem.addActionListener(listener);
    135. cutItem.addActionListener(listener);
    136. copyItem.addActionListener(listener);
    137. pasteItem.addActionListener(listener);
    138. selectallItem.addActionListener(listener);
    139. dateItem.addActionListener(listener);
    140. wrapItem.addActionListener(listener);
    141. findItem.addActionListener(listener);
    142. fontItem.addActionListener(listener);
    143. }
    144. //创建弹出式菜单
    145. public void createPopupMenu() {
    146. popMenu = new JPopupMenu();
    147. popMenu.add("撤消");
    148. popMenu.addSeparator();
    149. popMenu.add("剪切");
    150. popMenu.add("复制");
    151. popMenu.add("粘贴");
    152. popMenu.addSeparator();
    153. popMenu.add("全选");
    154. }
    155. //重写父类方法,当用户按下窗口的“关闭”时,会自动调用此方法
    156. protected void processWindowEvent(WindowEvent e) {
    157. if (e.getID() == WindowEvent.WINDOW_CLOSING) {
    158. doExit();
    159. }
    160. }
    161. //根据用户选择文本的情况,修改菜单的状态
    162. void checkSelected() {
    163. if (text.getSelectedText() == null) {
    164. cutItem.setEnabled(false);
    165. copyItem.setEnabled(false);
    166. } else {
    167. cutItem.setEnabled(true);
    168. copyItem.setEnabled(true);
    169. }
    170. }
    171. //退出记事本
    172. void doExit() {
    173. int select;
    174. boolean flag = false;
    175. if (!changed)
    176. System.exit(0);
    177. else {
    178. select = JOptionPane.showConfirmDialog(this, "文件修改后尚未保存,要保存吗?");
    179. if(select==JOptionPane.YES_OPTION){
    180. flag = doSave();
    181. if (flag == true) {
    182. System.exit(0);
    183. }
    184. }else if(select==JOptionPane.NO_OPTION){
    185. System.exit(0);
    186. }
    187. }
    188. }
    189. //保存用户编辑的文件,保存成功返回1,否则返回0
    190. boolean doSave() {
    191. FileWriter fr = null;
    192. String content;
    193. boolean flag;
    194. if (!haveName) {
    195. flag = doSaveAs();
    196. } else if (changed) {
    197. try {
    198. fr = new FileWriter(file,Charset.forName(charSet));
    199. content = text.getText();
    200. if (!"GBK".equals(charSet)) {//如果不是GBK(ANSI)则先写BOM
    201. fr.write("\uFEFF");
    202. }
    203. fr.write(content);
    204. changed = false;//修改完后文件改变置为false
    205. flag = true;
    206. } catch (FileNotFoundException e) {
    207. JOptionPane.showMessageDialog(this, "指定的文件名称或属性有问题!");
    208. flag = false;
    209. } catch (IOException e) {
    210. JOptionPane.showMessageDialog(this, "无法写文件,请检查文件是否被锁定");
    211. flag = false;
    212. } finally {
    213. closeWriter(fr);
    214. }
    215. } else {
    216. flag = true;
    217. }
    218. return flag;
    219. }
    220. //用"另存为"对话框保存文件。保存成功返回true,否则返回false
    221. boolean doSaveAs() {
    222. boolean flag = false;
    223. File tmpfile = null;
    224. ExampleFileFilter filter = new ExampleFileFilter();
    225. filter.addExtension("txt");
    226. filter.setDescription("文本文件");
    227. SaveDialog dialog;
    228. String thisCharSet = new String("");//本次保存的编码类型
    229. if (file == null) {//如果目前操作的是一个没被保存过的文件
    230. dialog = new SaveDialog(filter);
    231. } else {
    232. dialog = new SaveDialog(filter, file.getPath(),charSet);
    233. }
    234. SaveType saveType = dialog.getSaveType();
    235. if (saveType != null) { //确定要保存文件
    236. String encode = saveType.getEncode();
    237. tmpfile = saveType.getFile();
    238. thisCharSet = getEncodeType(encode);
    239. String absolutePath = tmpfile.getAbsolutePath();
    240. if (saveType.isTxtFile()) { //如果是文本文件方式存储
    241. String extension = absolutePath.substring(absolutePath.length() - 4);
    242. if (!extension.equalsIgnoreCase(".txt")) {//如果不以txt为后缀
    243. absolutePath = absolutePath + ".txt";//为其增加后缀
    244. tmpfile = new File(absolutePath);
    245. }
    246. }
    247. flag = true;
    248. } else {
    249. flag = false;
    250. }
    251. if (flag == true) { //用户已经确定要以指定名称保存文件
    252. FileWriter fr = null;
    253. try {
    254. fr = new FileWriter(tmpfile,Charset.forName(thisCharSet));
    255. String content = text.getText();
    256. if (!"GBK".equals(thisCharSet)) {//如果不是GBK(ANSI)则先写BOM
    257. fr.write("\uFEFF");
    258. }
    259. fr.write(content);
    260. flag = true;
    261. } catch (FileNotFoundException e) {
    262. JOptionPane.showMessageDialog(this, "指定的文件名称或属性有问题!");
    263. flag = false;
    264. } catch (IOException e) {
    265. JOptionPane.showMessageDialog(this, "无法写文件,请检查文件是否被锁定");
    266. flag = false;
    267. }finally {
    268. closeWriter(fr);
    269. }
    270. }
    271. if (flag == true) {//文件保存成功,修改相关变量
    272. changed = false;
    273. haveName = true;
    274. file = tmpfile;
    275. charSet = thisCharSet;
    276. this.setTitle("记事本 -- " + file.getName());
    277. }
    278. return flag;
    279. }
    280. //新建一个文件
    281. void doNewFile() {
    282. int select;
    283. boolean flag = false;
    284. if (changed) {
    285. select = JOptionPane.showConfirmDialog(this, "文件修改后尚未存盘,要保存吗?");
    286. switch (select) {
    287. case JOptionPane.YES_OPTION:
    288. flag = doSave();
    289. break;
    290. case JOptionPane.NO_OPTION:
    291. flag = true;
    292. break;
    293. default:
    294. flag = false;
    295. break;
    296. }
    297. } else {
    298. flag = true;
    299. }
    300. if (flag == true) {
    301. changed = false;
    302. haveName = false;
    303. charSet = "GBK";
    304. setTitle("记事本 -- 未命名");
    305. text.setText(null);
    306. }
    307. }
    308. //调用打印对话框,给用户打印文档
    309. void doPrint() {
    310. try {
    311. //创建打印请求属性集
    312. PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
    313. //设置打印格式(自动)
    314. DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    315. //查找所有可用的打印服务
    316. PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);
    317. //定位默认打印机
    318. PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
    319. PrintService service ;
    320. //显示打印对话框
    321. service = ServiceUI.printDialog(null, 100, 100, printService, defaultService, flavor, pras);
    322. if (service != null) {
    323. //创建打印作业
    324. DocPrintJob job = service.createPrintJob();
    325. //创建文档属性集
    326. DocAttributeSet das = new HashDocAttributeSet();
    327. //建立打印格式文件
    328. Doc doc = new SimpleDoc(text.getText().getBytes(), flavor, das);
    329. //进行文件的打印
    330. job.print(doc, pras);
    331. }
    332. } catch (Exception e) {
    333. JOptionPane.showMessageDialog(this, "打印任务无法完成");
    334. }
    335. }
    336. //打开一个已经存在的文件
    337. void doOpen() {
    338. int select;
    339. boolean flag;
    340. File tmpfile = null;
    341. ExampleFileFilter filter;
    342. JFileChooser chooser;
    343. FileReader fr = null;
    344. if (changed) {
    345. select = JOptionPane.showConfirmDialog(this, "文件修改后尚未存盘,要保存吗?");
    346. switch (select) {
    347. case JOptionPane.YES_OPTION:
    348. flag = doSave();
    349. break;
    350. case JOptionPane.NO_OPTION:
    351. flag = true;
    352. break;
    353. default:
    354. flag = false;
    355. break;
    356. }
    357. } else {
    358. flag = true;
    359. }
    360. if (flag == true) {
    361. changed = false;
    362. filter = new ExampleFileFilter();
    363. filter.addExtension("txt");
    364. filter.setDescription("文本文件");
    365. if (file != null) {
    366. chooser = new JFileChooser(file.getPath());
    367. } else {
    368. chooser = new JFileChooser();
    369. }
    370. chooser.setFileFilter(filter);
    371. select = chooser.showOpenDialog(this);
    372. if (select == JFileChooser.APPROVE_OPTION) {
    373. tmpfile = chooser.getSelectedFile();
    374. try {
    375. String enCode = this.getEncode(tmpfile);
    376. StringBuffer content = new StringBuffer("");
    377. fr = new FileReader(tmpfile, Charset.forName(enCode));
    378. if ("UTF-8".equals(enCode) || "UTF-16BE".equals(enCode) || "UTF-16LE".equals(enCode)) {
    379. fr.read();//提前读出
    380. }
    381. int read;
    382. while ((read = fr.read()) != -1) {
    383. content.append((char) read);
    384. }
    385. text.setText(content.toString());
    386. text.setCaretPosition(0);//设置插入点位置
    387. changed = false;
    388. haveName = true;
    389. file = tmpfile;//把所选择并打开的文件作为当前文件
    390. charSet = enCode;
    391. setTitle("记事本 -- " + file.getName());
    392. } catch (FileNotFoundException e) {
    393. JOptionPane.showMessageDialog(this, "指定的文件名称或属性有问题!");
    394. } catch (IOException e) {
    395. JOptionPane.showMessageDialog(this, "无法读文件,请检查文件是否被锁定");
    396. }
    397. }
    398. }
    399. }
    400. //将用户选择的文本剪切到剪贴板
    401. void doCut() {
    402. text.cut();
    403. }
    404. //将用户选择的文本复制到剪贴板
    405. void doCopy() {
    406. text.copy();
    407. }
    408. //将剪贴板中的内容复制到文本区
    409. void doPaste() {
    410. text.paste();
    411. }
    412. //全选
    413. void doSelectAll() {
    414. text.selectAll();
    415. }
    416. //插入当前日期和时间
    417. void doDateTime() {
    418. SimpleDateFormat sdf = new SimpleDateFormat("HH:mm yyyy-MM-dd");
    419. text.append(sdf.format(new Date()));
    420. }
    421. //自动换行
    422. void doWrap() {
    423. if (wrapItem.getState()) {
    424. text.setLineWrap(true);
    425. } else {
    426. text.setLineWrap(false);
    427. }
    428. }
    429. //显示查找对话框
    430. void doFind() {
    431. FindDialog dialog = new FindDialog(text);
    432. dialog.setLocationRelativeTo(null);
    433. dialog.setTitle("查找");
    434. dialog.setSize(300, 120);
    435. dialog.setVisible(true);
    436. }
    437. //设置字体
    438. void doChangeFont() {
    439. if (myFontDialog == null) {
    440. myFontDialog = new FontDialog(this);
    441. }
    442. if (myFontDialog.showFontDialog() == FontDialog.OK) {
    443. text.setFont(myFontDialog.getFont());//获得对话框返回的字体并以它作为记事本字体
    444. }
    445. }
    446. //获得文件的字符编码
    447. private String getEncode(File file) throws FileNotFoundException, IOException {
    448. String enCode = "";
    449. FileInputStream fis = new FileInputStream(file);
    450. byte[] head = new byte[3];
    451. int read = fis.read(head, 0, 3);
    452. if (read == -1) {//如果什么都没读到,则说明没有BOM,属于ANSI
    453. enCode = "GB2312";
    454. } else if (head[0] == (byte) 0XFF && head[1] == (byte) 0XFE) {
    455. enCode = "UTF-16LE";
    456. } else if (head[0] == (byte) 0XFE && head[1] == (byte) 0XFF) {
    457. enCode = "UTF-16BE";
    458. } else if (head[0] == (byte) 0XEF && head[1] == (byte) 0XBB && head[2] == (byte) 0XBF) {
    459. enCode = "UTF-8";
    460. } else {
    461. enCode = "GB2312";
    462. }
    463. return enCode;
    464. }
    465. //关闭输出流
    466. void closeWriter(Writer writer) {
    467. if (writer != null) {
    468. try {
    469. writer.close();
    470. } catch (IOException e) {
    471. e.printStackTrace();
    472. }
    473. }
    474. }
    475. //关闭输入流
    476. void closeReader(Reader reader) {
    477. if (reader != null) {
    478. try {
    479. reader.close();
    480. } catch (IOException e) {
    481. e.printStackTrace();
    482. }
    483. }
    484. }
    485. //把对话框的编码类型转换成实际的Charset名称
    486. String getEncodeType(String name) {
    487. String encode = "";
    488. switch (name) {
    489. case "ANSI":
    490. encode = "GBK";
    491. break;
    492. case "Unicode":
    493. encode = "UTF-16LE";
    494. break;
    495. case "Unicode big endian":
    496. encode = "UTF-16BE";
    497. break;
    498. case "UTF-8":
    499. encode = "UTF-8";
    500. break;
    501. default:
    502. encode = "GBK";
    503. }
    504. return encode;
    505. }
    506. //定义监听器
    507. //定义一个监听器的实现类用以监听各菜单项事件
    508. class ActionListenerImpl implements ActionListener {
    509. @Override
    510. public void actionPerformed(ActionEvent e) {
    511. Object obj;
    512. obj = e.getSource();
    513. if (obj == exitItem)
    514. doExit();
    515. else if (obj == saveItem)
    516. doSave();
    517. else if (obj == saveasItem)
    518. doSaveAs();
    519. else if (obj == newItem)
    520. doNewFile();
    521. else if (obj == printItem)
    522. doPrint();
    523. else if (obj == openItem)
    524. doOpen();
    525. else if (obj == cutItem)
    526. doCut();
    527. else if (obj == copyItem)
    528. doCopy();
    529. else if (obj == pasteItem)
    530. doPaste();
    531. else if (obj == selectallItem)
    532. doSelectAll();
    533. else if (obj == dateItem)
    534. doDateTime();
    535. else if (obj == wrapItem)
    536. doWrap();
    537. else if (obj == findItem)
    538. doFind();
    539. else if (obj == fontItem)
    540. doChangeFont();
    541. }
    542. }
    543. //键盘监听器类
    544. class HandleKey extends KeyAdapter {
    545. public void keyPressed(KeyEvent e) {
    546. checkSelected();
    547. }
    548. }
    549. //鼠标监听器类
    550. class HandleMouse extends MouseAdapter {
    551. public void mouseReleased(MouseEvent e) {
    552. checkSelected();
    553. }
    554. }
    555. }

    FontDialog.java

    1. import java.awt.event.*;
    2. import javax.swing.*;
    3. import javax.swing.event.*;
    4. import java.awt.*;
    5. public class FontDialog extends JDialog {
    6. public static final int Cancle = 0;
    7. public static final int OK = 1;
    8. public static final String[] style = {"正常", "斜体", "粗体", "粗斜体"};
    9. public static final String[] size = {"8", "9", "10", "11", "12", "14", "16",
    10. "18", "20", "22", "24", "26", "28", "36", "48", "72"};
    11. private Font userFont = null;
    12. private int userSelect = Cancle;
    13. private JFrame parent = null;
    14. private JScrollPane nameSPane, styleSPane, sizeSPane;
    15. private JPanel panel[];
    16. private JLabel lblName, lblStyle, lblSize;
    17. private JTextField txtName, txtStyle, txtSize;
    18. private JList nameList, styleList, sizeList;
    19. private JButton btnOK, btnCancle;
    20. //定义一个动作监听器类
    21. class ActionlistenerImpl implements ActionListener {
    22. public void actionPerformed(ActionEvent e) {
    23. int styleIndex = Font.PLAIN, fontSize;
    24. if (e.getSource() == btnOK) {
    25. if (txtStyle.getText().equals("正常"))
    26. styleIndex = Font.PLAIN;
    27. if (txtStyle.getText().equals("斜体"))
    28. styleIndex = Font.ITALIC;
    29. if (txtStyle.getText().equals("粗体"))
    30. styleIndex = Font.BOLD;
    31. if (txtStyle.getText().equals("粗斜体"))
    32. styleIndex = Font.BOLD | Font.ITALIC;
    33. fontSize = Integer.parseInt(txtSize.getText());
    34. userFont = new Font(txtName.getText(), styleIndex, fontSize);
    35. userSelect = OK;
    36. setVisible(false);
    37. } else {
    38. userSelect = Cancle;
    39. setVisible(false);
    40. }
    41. }
    42. }
    43. //创建一个列表监听器类
    44. class ListSelectionListenerImple implements ListSelectionListener {
    45. public void valueChanged(ListSelectionEvent e) {
    46. if (e.getSource() == nameList) {
    47. txtName.setText((String) nameList.getSelectedValue());
    48. }
    49. if (e.getSource() == styleList) {
    50. txtStyle.setText((String) styleList.getSelectedValue());
    51. }
    52. if (e.getSource() == sizeList) {
    53. txtSize.setText((String) sizeList.getSelectedValue());
    54. }
    55. }
    56. }
    57. //创建监听器对象
    58. ActionlistenerImpl listener = new ActionlistenerImpl();
    59. ListSelectionListenerImple listSelectionListener = new ListSelectionListenerImple();
    60. private void init() {
    61. setTitle("字体");
    62. Container container = this.getContentPane();
    63. BoxLayout box = new BoxLayout(container, BoxLayout.Y_AXIS);
    64. container.setLayout(box);
    65. panel = new JPanel[4];
    66. for (int i = 0; i < 3; i++) {
    67. panel[i] = new JPanel();
    68. panel[i].setLayout(new GridLayout(1, 3));
    69. }
    70. panel[3] = new JPanel();
    71. panel[3].setLayout(new FlowLayout());
    72. lblName = new JLabel("字体");
    73. lblStyle = new JLabel("字形");
    74. lblSize = new JLabel("大小");
    75. panel[0].add(lblName);
    76. panel[0].add(lblStyle);
    77. panel[0].add(lblSize);
    78. txtName = new JTextField("宋体");
    79. txtName.setColumns(5);
    80. txtName.setEditable(false);
    81. txtStyle = new JTextField("正常");
    82. txtStyle.setColumns(5);
    83. txtStyle.setEditable(false);
    84. txtSize = new JTextField("12");
    85. txtSize.setColumns(5);
    86. txtSize.setEditable(false);
    87. panel[1].add(txtName);
    88. panel[1].add(txtStyle);
    89. panel[1].add(txtSize);
    90. GraphicsEnvironment eq = GraphicsEnvironment.getLocalGraphicsEnvironment();
    91. String[] availableFonts = eq.getAvailableFontFamilyNames();
    92. nameList = new JList(availableFonts);
    93. nameList.addListSelectionListener(listSelectionListener);
    94. nameSPane = new JScrollPane(nameList);
    95. styleList = new JList(style);
    96. styleList.addListSelectionListener(listSelectionListener);
    97. styleSPane = new JScrollPane(styleList);
    98. sizeList = new JList(size);
    99. sizeList.addListSelectionListener(listSelectionListener);
    100. sizeSPane = new JScrollPane(sizeList);
    101. panel[2].add(nameSPane);
    102. panel[2].add(styleSPane);
    103. panel[2].add(sizeSPane);
    104. btnOK = new JButton("确定");
    105. btnOK.addActionListener(listener);
    106. btnCancle = new JButton("取消");
    107. btnCancle.addActionListener(listener);
    108. panel[3].add(btnOK);
    109. panel[3].add(btnCancle);
    110. for (int i = 0; i < 4; i++) {
    111. container.add(panel[i]);
    112. }
    113. }
    114. public FontDialog(JFrame owner) {
    115. super(owner, true);
    116. parent = owner;
    117. init();
    118. }
    119. public int showFontDialog() {
    120. setSize(300, 300);
    121. int x, y;
    122. if (parent != null) {
    123. x = parent.getX() + 30;
    124. y = parent.getY() + 30;
    125. } else {
    126. x = 150;
    127. y = 100;
    128. }
    129. setLocation(new Point(x, y));
    130. setVisible(true);
    131. return userSelect;
    132. }
    133. public Font getFont() {
    134. return userFont;
    135. }
    136. }

    FindDialog.java

    1. import java.awt.*;
    2. import java.awt.event.*;
    3. import javax.swing.*;
    4. public class FindDialog extends JDialog {
    5. JPanel panel1, panel2;
    6. JTextArea text;
    7. JLabel label1;
    8. JTextField findEdit;
    9. JCheckBox checkBox;
    10. JRadioButton btnUp, btnDown;
    11. ButtonGroup dirBtnGroup;
    12. JButton btnOK, btnCancle;
    13. int start;//查找开始位置
    14. int curPosition;//原来光标的位置
    15. //定义一个动作监听器类
    16. class ActionlistenerImpl implements ActionListener {
    17. public void actionPerformed(ActionEvent e) {
    18. if (e.getSource() == btnOK) {
    19. find();
    20. } else {
    21. dispose();
    22. }
    23. }
    24. }
    25. //创建监听器对象
    26. ActionlistenerImpl listener = new ActionlistenerImpl();
    27. private void init(JTextArea textArea) {
    28. Container container = this.getContentPane();
    29. text = textArea;
    30. curPosition = text.getCaretPosition();//初始光标的位置
    31. start = curPosition;//设置初始查找位置为初始光标位置
    32. panel1 = new JPanel();
    33. panel1.setLayout(new FlowLayout());
    34. panel2 = new JPanel();
    35. panel2.setLayout(new FlowLayout());
    36. label1 = new JLabel("查找内容");
    37. findEdit = new JTextField(12);
    38. btnOK = new JButton("查找下一个");
    39. btnOK.addActionListener(listener);
    40. panel1.add(label1);
    41. panel1.add(findEdit);
    42. panel1.add(btnOK);
    43. checkBox = new JCheckBox("区分大小写");
    44. checkBox.setSelected(true);
    45. btnUp = new JRadioButton("向上");
    46. btnDown = new JRadioButton("向下", true);
    47. dirBtnGroup = new ButtonGroup();
    48. dirBtnGroup.add(btnUp);
    49. dirBtnGroup.add(btnDown);
    50. btnCancle = new JButton("取消");
    51. btnCancle.addActionListener(listener);
    52. panel2.add(checkBox);
    53. panel2.add(btnUp);
    54. panel2.add(btnDown);
    55. panel2.add(btnCancle);
    56. container.setLayout(new FlowLayout());
    57. container.add(panel1);
    58. container.add(panel2);
    59. }
    60. public FindDialog(JTextArea text) {
    61. init(text);
    62. }
    63. public void find() {
    64. int index;
    65. start = text.getCaretPosition();
    66. String allText = text.getText();//记事本中的全部字符
    67. String searchText = findEdit.getText();
    68. if(checkBox.isSelected()==false) {//不区分大小写
    69. allText = allText.toLowerCase();
    70. searchText = searchText.toLowerCase();
    71. }
    72. if(btnDown.isSelected()) {//向下查找
    73. index = allText.indexOf(searchText, start);
    74. if (index < 0) {
    75. JOptionPane.showMessageDialog(this, "已查找全部文档");
    76. text.setCaretPosition(0);
    77. } else {
    78. text.select(index, index + searchText.length());
    79. }
    80. }else {//向上查找
    81. start--;
    82. index = allText.lastIndexOf(searchText, start);
    83. if (index < 0) {
    84. JOptionPane.showMessageDialog(this, "已查找全部文档");
    85. text.setCaretPosition(allText.length());
    86. } else {
    87. text.setCaretPosition(index+searchText.length());
    88. text.moveCaretPosition(index);
    89. }
    90. }
    91. }
    92. }

    ExampleFileFilter.java

    1. import java.io.File;
    2. import java.util.Hashtable;
    3. import java.util.Enumeration;
    4. import javax.swing.filechooser.*;
    5. public class ExampleFileFilter extends FileFilter {
    6. private Hashtable filters = null;
    7. private String description = null;
    8. private String fullDescription = null;
    9. private boolean useExtensionsInDescription = true;
    10. public String toString(){
    11. return description;
    12. }
    13. public ExampleFileFilter() {
    14. this.filters = new Hashtable();
    15. }
    16. public boolean accept(File f) {
    17. if (f != null) {
    18. if (f.isDirectory()) {
    19. return true;
    20. }
    21. String extension = getExtension(f);
    22. if (extension != null && filters.get(getExtension(f)) != null) {
    23. return true;
    24. }
    25. }
    26. return false;
    27. }
    28. public String getExtension(File f) {
    29. if (f != null) {
    30. String filename = f.getName();
    31. int i = filename.lastIndexOf('.');
    32. if (i > 0 && i < filename.length() - 1) {
    33. return filename.substring(i + 1).toLowerCase();
    34. }
    35. }
    36. return null;
    37. }
    38. public void addExtension(String extension) {
    39. if (filters == null) {
    40. filters = new Hashtable(5);
    41. }
    42. filters.put(extension.toLowerCase(), this);
    43. fullDescription = null;
    44. }
    45. public String getDescription() {
    46. if (fullDescription == null) {
    47. if (isExtensionListInDescription()) {
    48. fullDescription = (description == null) ? "(" : description + " (";
    49. Enumeration extensions = filters.keys();
    50. if (extensions != null) {
    51. fullDescription += "*." + (String) extensions.nextElement();
    52. while (extensions.hasMoreElements()) {
    53. fullDescription += ", *." + (String) extensions.nextElement();
    54. }
    55. }
    56. fullDescription += ")";
    57. } else {
    58. fullDescription = description;
    59. }
    60. }
    61. return fullDescription;
    62. }
    63. public void setDescription(String description) {
    64. this.description = description;
    65. fullDescription = null;
    66. }
    67. public void setExtensionListInDescription(boolean b) {
    68. useExtensionsInDescription = b;
    69. fullDescription = null;
    70. }
    71. public boolean isExtensionListInDescription() {
    72. return useExtensionsInDescription;
    73. }
    74. }

    SaveType.java

    1. import java.io.File;
    2. public class SaveType {
    3. private File file;//要保存的文件
    4. private String encode;//存储的类型
    5. private boolean isTxtFile;
    6. public File getFile() {
    7. return file;
    8. }
    9. public void setFile(File file) {
    10. this.file = file;
    11. }
    12. public String getEncode() {
    13. return encode;
    14. }
    15. public void setEncode(String encode) {
    16. this.encode = encode;
    17. }
    18. public boolean isTxtFile() {
    19. return isTxtFile;
    20. }
    21. public void setTxtFile(boolean txtFile) {
    22. isTxtFile = txtFile;
    23. }
    24. }

    SaveDialog.java

    1. import java.awt.Container;
    2. import java.awt.event.ActionEvent;
    3. import java.awt.event.ActionListener;
    4. import java.awt.event.WindowEvent;
    5. import java.io.File;
    6. import javax.swing.JComboBox;
    7. import javax.swing.JDialog;
    8. import javax.swing.JFileChooser;
    9. import javax.swing.JLabel;
    10. import javax.swing.JOptionPane;
    11. import javax.swing.filechooser.FileFilter;
    12. public class SaveDialog extends JDialog {
    13. private JFileChooser fileChooser;
    14. private JLabel lblName;
    15. private JComboBox jbcName;
    16. private SaveType saveType;
    17. SaveDialog(FileFilter filter, String path, String charSet) {
    18. init(filter, path, charSet);
    19. }
    20. SaveDialog(FileFilter filter) {
    21. this(filter, null, "");
    22. }
    23. void init(FileFilter filter, String path, String charSet) {
    24. Container container = this.getContentPane();
    25. container.setLayout(null);
    26. if (path != null) {
    27. fileChooser = new JFileChooser(path);
    28. } else {
    29. fileChooser = new JFileChooser();
    30. }
    31. fileChooser.setSize(550, 400);
    32. fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
    33. if (filter != null) {
    34. fileChooser.setFileFilter(filter);
    35. }
    36. lblName = new JLabel("编码(E)");
    37. lblName.setSize(60, 25);
    38. lblName.setLocation(150, 390);
    39. jbcName = new JComboBox();
    40. jbcName.addItem("ANSI");
    41. jbcName.addItem("Unicode");
    42. jbcName.addItem("Unicode big endian");
    43. jbcName.addItem("UTF-8");
    44. jbcName.setSize(150, 25);
    45. jbcName.setLocation(210, 390);
    46. String encode = this.getCharset(charSet);
    47. // 反向选中下拉框
    48. jbcName.setSelectedItem(encode);
    49. fileChooser.addActionListener(new ActionListener() {
    50. @Override
    51. public void actionPerformed(ActionEvent e) {
    52. String option = e.getSource().toString();
    53. if (option.contains("APPROVE_OPTION")) {
    54. File tempFile = fileChooser.getSelectedFile();//获取用户所选择的文件
    55. if(tempFile.exists()) {//如果文件已经存在则对是否保存文件进行确认
    56. if (JOptionPane.showConfirmDialog(SaveDialog.this, "文件已经存在,是否覆盖?",
    57. "警告", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
    58. generateSaveType();//生成SaveType
    59. SaveDialog.this.dispose();
    60. } else {
    61. saveType = null;
    62. }
    63. }else {//如果文件不存在则直接生成SaveType
    64. SaveDialog.this.generateSaveType();//
    65. SaveDialog.this.dispose();
    66. }
    67. } else if (option.contains("CANCEL_OPTION")) {
    68. saveType = null;
    69. SaveDialog.this.dispose();
    70. }
    71. }
    72. });
    73. container.add(fileChooser);
    74. container.add(lblName);
    75. container.add(lblName);
    76. container.add(jbcName);
    77. this.setModal(true);// 设置为模态对话框
    78. this.setSize(570, 470);
    79. this.setLocationRelativeTo(null);
    80. this.setTitle("另存为");
    81. this.setVisible(true);
    82. }
    83. private String getCharset(String name) {
    84. String encode = "";
    85. switch (name) {
    86. case "GBK":
    87. encode = "ANSI";
    88. break;
    89. case "UTF-16LE":
    90. encode = "Unicode";
    91. break;
    92. case "UTF-16BE":
    93. encode = "Unicode big endian";
    94. break;
    95. case "UTF-8":
    96. encode = "UTF-8";
    97. break;
    98. default:
    99. encode = "ANSI";
    100. }
    101. return encode;
    102. }
    103. public SaveType getSaveType() {
    104. return saveType;
    105. }
    106. protected void processWindowEvent(WindowEvent e) {
    107. if (e.getID() == WindowEvent.WINDOW_CLOSING) {
    108. saveType = null;
    109. this.dispose();
    110. }
    111. }
    112. private void generateSaveType() {
    113. saveType = new SaveType();
    114. if ("文本文档".equals(fileChooser.getFileFilter().toString())) {// 如果用户选择了文本文件
    115. saveType.setTxtFile(true);
    116. } else {
    117. saveType.setTxtFile(false);
    118. }
    119. saveType.setFile(fileChooser.getSelectedFile());
    120. saveType.setEncode((String) jbcName.getSelectedItem());
    121. }
    122. }

    NoteBook.java

    1. public class NoteBook {
    2. public static void main(String[] args) {
    3. NoteBookFrame noteBookFrame = new NoteBookFrame();
    4. noteBookFrame.setTitle("记事本--未命名");
    5. noteBookFrame.setSize(400,300);
    6. noteBookFrame.setLocationRelativeTo(null);
    7. noteBookFrame.setVisible(true);
    8. }
    9. }

    除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

  • 相关阅读:
    芯科蓝牙BG27开发笔记1-新建示例工程
    高性能云原生数据对象存储MinIO实战-中
    高等数学(第七版)同济大学 习题1-10 个人解答
    Python的requests库:解决文档缺失问题的策略与实践
    对自己LRU算法代码的优化
    超神之路 数据结构 2 —— Queue队列实现和循环队列和普通队列的性能比较
    【无标题】
    利用gpu加速神经网络算法,为什么用gpu 模型训练
    【云原生】云原生相关技术概念总结
    初识Java 10-1 集合
  • 原文地址:https://blog.csdn.net/shalimu/article/details/128150314