刚刚看完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
}