基于Java的Swing编写的记事本

刚刚看完Swing,决定使用Swing编写一个记事本程序,也算是对之前学习的内容的一个复习和总结吧。下面把遇到的问题给贴出来,查漏补缺。
1,Font的style(字体风格)有四个静态值:
         - Font.PLAIN  普通
         - Font.BOLD  加粗
         - Font.ITALIC  斜体

2,JFrame的setDefaultCloseOperation()是设置用户在此窗体上发起 "close" 时默认执行的操作。必须指定以下选项之一:
    - DO_NOTHING_ON_CLOSE(在 WindowConstants 中定义):不执行任何操作;要求程序在已注册的 WindowListener 对象的 windowClosing 方法中处理该操作。 
    - HIDE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册的 WindowListener 对象后自动隐藏该窗体。 
    - DISPOSE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册 WindowListener 的对象后自动隐藏并释放该窗体。 
    - EXIT_ON_CLOSE(在 JFrame 中定义):使用 System exit 方法退出应用程序。仅在应用程序中使用。 

默认情况下,该值被设置为 HIDE_ON_CLOSE

3,从2的解答可以看出这样设置并不能实现在退出时提示保存的问题,百度后说是在JFrame上添加一个window监听器。
    addWindowListener (new WindowAdapter ()
        {
            @Override
            public void windowClosing ( WindowEvent e )
            {
                int exi = JOptionPane.showConfirmDialog (null, "要退出该程序吗?", "友情提示", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
                if (exi == JOptionPane.YES_OPTION)
                {
                    System.exit (0);
                }
                else
                {
                    return;
                }
            }
        });
4,JFileChooser怎么指定文件类型。
    通过JFileChooser包下的FileFilter可以进行筛选,其中的getDescription()方法可以提供描述。
    参考自:[JFileChooser文件类型筛选](http://blog.csdn.net/my_yang/article/details/9105593)
5,java如何关闭某JFrame窗口,而不是退出整个程序
    - 通过修改DefaultCloseOperation的参数为DISPOSE_ON_CLOSE,但是我发现这种方法并不能会导致程序无法退出,即使窗口全部关闭,虚拟机依然运行在后台。
    - 通过window监听器,检测到关闭窗口时,使用dispose方法释放窗口资源,再判断窗口数量,如窗口数为0,则退出程序。
        - window监听器方法的参数作用:
                - windowOpened 打开后
                - windowClosing 关闭时
                - windowClosed 关闭后
                - windowActivated 激活时
                - windowDeactivated 失去焦点时
                - windowIconified 最小化
                - windowDeiconified 还原
参考自:[Java事件类型小结](http://blog.sina.com.cn/s/blog_4979ec3e010166xf.html)
6,如何监测JTextArea的变动以判断是否需要保存。
    通过textArea.getDocument().addDocumentListener()方法可实现检测JTextArea的改动。
         - remove 删除时
         - insert  键入时
         - change 改变属性时会通知
    注:发现还有一个TextEvent用于检测文本改动,应该也可以
7,确认对话框的“是”“否”“取消”的值:0,1,2
        关闭窗口按钮返回-1
8,监测窗口大小变化以动态改变组件的大小和位置
    通过ComponentListener监测器进行判断
        - componentMoved 组件移动时
        - componentHidden 组件隐藏时
        - **componentResized** 组建缩放时
        - componentShown 组件显示时
9,JFileChooser的一些常量:
        - mode参数:
            - FILES_AND_DIRECTORIES   指示显示文件和目录。
            - FILES_ONLY   指示仅显示文件。
            - DIRECTORIES_ONLY   指示仅显示目录。
        - APPROVE_OPTION  选择确认(yes、ok)后返回该值。
        - CANCEL_OPTION  选择 cancel 后的返回该值。
10,System.getProperty("line.separator")用于获取换行符,根据操作系统的不同可以获取不同的换行符
11,快捷键的设置:
    使用public void setAccelerator(KeyStroke keyStroke)方法设置快捷键,KeyStroke通过getKeyStroke(int, int)静态方法来获取值。
    现在方法一个问题,那就是设置的热键与DocumentListener冲突,不知道怎么解决。最后发现是我加了一个调试节点,唉,鼠标要换了
12,自动换行问题,1,使用void setLineWrap(boolean wrap)设置自动换行。2,菜单栏上的对勾设置,使用JCheckMenuItem。
13,使用CaretListener监测光标的位置以动态改变状态栏的值

就这样吧,已经实现了大部分功能,还有查找,替换,转到,设置没有实现,但除了设置可能会遇到难点外,其他的都是前面代码的重组,就不再花时间去写了。

package com.tonglee.Test14;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.MenuBar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Calendar;
import java.util.Date;

import javax.security.auth.kerberos.KerberosKey;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.UndoManager;

public class Notepad extends JFrame implements ActionListener {
   
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static int windowsNum = 0;
    private JPanel panelEnd;
    private boolean isSaved = true;
    private UndoManager undomanager = new UndoManager();
    private File file = null;
    private JMenuItem jmiCreate, jmiOpen, jmiSave, jmiSaveAs, jmiExit, jmiCut, jmiPaste, jmiCopy, jmiSelectAll,jmiInsertTime, jmiSet,
            jmiUndo, jmiRedo, jmiAutoEnter, jmiFont, jmiStatus, jmiTopic, jmiAbout;
    private JTextArea ta = new JTextArea();
    private JLabel labelTips, labelLine, labelColumn, labelNum;
    private JFileChooser chooser = new JFileChooser();

    public Notepad() {
        // TODO Auto-generated constructor stub
        // 设置窗口大小
        setSize(800, 600);
        // 设置窗体的标题
        setTitle("无标题 - 记事本");
        // 设置窗口的关闭时的响应,此处设置的是释放本窗口资源但不推出程序
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // 设置窗口位置。null居中
        setLocationRelativeTo(null);
        // 为chooser添加文件过滤器
        setFileFilter();
        setJMenuBar(createJMenuBar());
        ta.setFont(new Font("", Font.PLAIN, 18));
        add(new JScrollPane(ta), BorderLayout.CENTER);
        add(createPanel(), BorderLayout.PAGE_END);
        // 设置窗口可见
        setVisible(true);
        // 为JFrame添加组件事件监听器
        this.addComponentListener(new ComponentListener() {

            @Override
            public void componentShown(ComponentEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void componentResized(ComponentEvent e) {
                // TODO Auto-generated method stub
                int width = (int) (Notepad.this.getWidth() * 0.67);
                labelTips.setPreferredSize(new Dimension(width, 20));
            }

            @Override
            public void componentMoved(ComponentEvent e) {
                // TODO Auto-generated method stub

            }

          
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值