当将基本的框架搭建完成之后,只是界面上存在了各种菜单和菜单选项,只能看不能用(PS 最后面有源码的下载地址哦)
(1)接下来就是将每个菜单下的菜单选项的功能实现,比如
从上图中可以看出,在“文件”这个菜单下面有“新建”、“打开”等菜单的选项,这些选项的功能怎么实现呢,主要是通过对这些菜单选项添加事件监听来实现,当监听到该菜单选项的事件发生时,选择相应的动作,
例如,我在添加“新建”菜单选项时,添加了事件监听
fileNew = new JMenuItem("新建(N)"); //新建菜单项
fileNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
fileNew.addActionListener(this); //添加事件监听
fileMenu.add(fileNew); //添加菜单项然后
监听到事件发生时执行
public void actionPerformed(ActionEvent e) {
//***********************************文件菜单栏功能************************************//
//新建文本功能
String currentText = editArea.getText(); //获取当前文本中的内容
boolean isTextChange = (currentText.equals(oldText))?true:false;; //用来判断文本内容是否发生变化
if(e.getSource() == fileNew) {
if(!isTextChange) { //文本内容发生变化
int saveChoose = JOptionPane.showConfirmDialog(this,"文件尚未保存,是否保存?", "提示", JOptionPane.YES_NO_CANCEL_OPTION);
if(saveChoose == JOptionPane.YES_OPTION) {
saveAs();
}
else if(saveChoose == JOptionPane.NO_OPTION) {
fileNew(); //新建文本
//return;
}
else {
statusLabel2.setText("未选择保存任何文件");
return;
}
}
else {
fileNew();
}
}
public void fileNew() {
editArea.replaceRange("", 0, editArea.getText().length());
statusLabel2.setText("新建文件");
this.setTitle("无标题");
isNewFile = true;
undo.discardAllEdits(); //撤销所有的操作
editUndo.setEnabled(false);
oldText = editArea.getText();
}
这样就完成了文件菜单中“新建”功能的实现
其余的功能的实现基本上是相同的重复。
注意在“打开”文件的时候要对文件进行过滤,对文件名称不合法的过滤,
if(fileName == null || fileName.getName().equals("")) { //文件名不合法
JOptionPane.showConfirmDialog(this, "不合法的文件名", "不合法的文件名", JOptionPane.ERROR_MESSAGE);
}
对文件格式不合法的文件过滤
private void setFileFilter() {
// TODO Auto-generated method stub
javax.swing.filechooser.FileFilter filter = new javax.swing.filechooser.FileFilter() {
@Override
public String getDescription() {
return ".txt";
}
@Override
public boolean accept(File f) {
String name = f.getName();
return f.isDirectory() || name.toLowerCase().endsWith(".txt"); // 仅显示目录和txt文件
}
};
JFileChooser fileChooser = new JFileChooser();
fileChooser.addChoosableFileFilter(filter);
fileChooser.setFileFilter(filter);
主要是借助FileFiter实现对其余文件格式的过滤,要是设置文件过滤器的话,其余格式的文件也能打开,但是打开后的内容是乱码的。
其余的菜单选项的功能就是基本上是重复的,但是有些功能比较难实现,就是打印,还有页面设置,
关于打印功能的实现
public void print(){
try{
p = getToolkit().getPrintJob(this,"ok",null);//创建一个Printfjob 对象 p
g = p.getGraphics();//p 获取一个用于打印的 Graphics 的对象
//g.translate(120,200);//改变组建的位置
this.editArea.printAll(g);
p.end();//释放对象 g
}
catch(Exception a){
}
}
还有比较坑的页面设置的功能的实现,百度到的方法,两行解决问题
PageFormat pf = new PageFormat();
PrinterJob.getPrinterJob().pageDialog(pf);
PageFormat这个类在java.awt.print下的。可以自己查一下API看一下
关于转到功能,这个功能其实就是转到文本中的某一行,就是获取文本编辑区的行数和你输入的行数,然后转到对应的位置
private void turnTo() {
final JDialog gotoDialog = new JDialog(this, "转到下列行");
JLabel gotoLabel = new JLabel("行数(L):");
final JTextField linenum = new JTextField(5);
linenum.setText("1");
linenum.selectAll();
JButton okButton = new JButton("确定");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int totalLine = editArea.getLineCount();
int[] lineNumber = new int[totalLine + 1];
String s = editArea.getText();
int pos = 0, t = 0;
while (true) {
pos = s.indexOf('\12', pos);
// System.out.println("引索pos:"+pos);
if (pos == -1)
break;
lineNumber[t++] = pos++;
}
int gt = 1;
try {
gt = Integer.parseInt(linenum.getText());
} catch (NumberFormatException efe) {
JOptionPane.showMessageDialog(null, "请输入行数!", "提示", JOptionPane.WARNING_MESSAGE);
linenum.requestFocus(true);
return;
}
if (gt < 2 || gt >= totalLine) {
if (gt < 2)
editArea.setCaretPosition(0);
else
editArea.setCaretPosition(s.length());
} else
editArea.setCaretPosition(lineNumber[gt - 2] + 1);
gotoDialog.dispose();
}
});
JButton cancelButton = new JButton("取消");
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
gotoDialog.dispose();
}
});
Container con = gotoDialog.getContentPane();
con.setLayout(new FlowLayout());
con.add(gotoLabel);
con.add(linenum);
con.add(okButton);
con.add(cancelButton);
gotoDialog.setSize(200, 110);
gotoDialog.setResizable(false);
gotoDialog.setLocation(300, 280);
gotoDialog.setVisible(true);
}
(2)当菜单栏的功能实现之后需要对文本编辑区的功能进行设置,文本编辑区就是写文字的地方啦~
当右键时会弹出窗口有菜单选项,这个与之前菜单栏的实现就不太一样,因为要弹出,
public void initTextEditArea() {
//创建文本编辑区
editArea = new JTextArea(20,50); //20列50行的文本区
//初始化滚动条
JScrollPane scroller = new JScrollPane(editArea);
scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(scroller,BorderLayout.CENTER); //在窗口中添加文本编辑区
editArea.setWrapStyleWord(true); //文字长度超过一行时自动换行
editArea.setLineWrap(true); //文本编辑区默认自动换行
oldText = editArea.getText(); //获取文本编辑区的内容
//撤销动作添加事件监听
editArea.getDocument().addUndoableEditListener(undoHandler);
editArea.getDocument().addDocumentListener(this);
//创建右键弹出菜单
popupMenu = new JPopupMenu();
popupMenuUndo = new JMenuItem("撤销(U)");
popupMenuUndo.addActionListener(this);
popupMenuUndo.setEnabled(false);
popupMenu.add(popupMenuUndo);
popupMenu.addSeparator();
popupMenuCut = new JMenuItem("剪切(T)");
popupMenuCut.addActionListener(this);
popupMenu.add(popupMenuCut);
popupMenuCopy = new JMenuItem("复制(C)");
popupMenuCopy.addActionListener(this);
popupMenu.add(popupMenuCopy);
popupMenuPaste = new JMenuItem("粘贴(P)");
popupMenuPaste.addActionListener(this);
popupMenu.add(popupMenuPaste);
popupMenuDelete = new JMenuItem("删除(D)");
popupMenuDelete.addActionListener(this);
popupMenu.add(popupMenuDelete);
popupMenu.addSeparator();
popupMenuSelectAll = new JMenuItem("全选(A)");
popupMenuSelectAll.addActionListener(this);
popupMenu.add(popupMenuSelectAll);
//文本编辑区注册鼠标右键事件 //mouse必须写两遍,因为点击释放两个状态
editArea.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if(e.isPopupTrigger()) { //判断是否是编辑区触发的鼠标右键事件,弹出菜单触发器
popupMenu.show(e.getComponent(), e.getX(), e.getY()); //在组件调用者的坐标空间中的位置 X、Y 显示弹出菜单
}
checkMenuItemEnabled(); //设置菜单功能的可用性
editArea.requestFocus(); //编辑区获取焦点
}
public void mouseReleased(MouseEvent e) {
if(e.isPopupTrigger()) { //判断是否是编辑区触发的鼠标右键事件,弹出菜单触发器
popupMenu.show(e.getComponent(), e.getX(), e.getY()); //在组件调用者的坐标空间中的位置 X、Y 显示弹出菜单
}
checkMenuItemEnabled(); //设置菜单功能的可用性
editArea.requestFocus(); //编辑区获取焦点
}
});
//component.setComponentPopupMenu(popupMenu);
//创建和添加状态栏
JPanel panel1 = new JPanel();
statusLabel1 = new JLabel("");
statusLabel2 = new JLabel("文件状态");
panel1.add(statusLabel1);
panel1.add(statusLabel2);
this.add(panel1, BorderLayout.SOUTH);//向窗口添加状态栏标签
//添加窗口监听器
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
exitWindowChoose();
}
});
checkMenuItemEnabled();
editArea.requestFocus();
}
其实就是先添加借助popupMenu实现弹出菜单并添加鼠标右键监听事件,然后利用JMenuItem添加菜单选项
然后注意的细节就是当没有输入文字的时候,有些菜单选项的功能是不可用的,这个就需要一开始时进行设置
//设置菜单项的可用性
public void checkMenuItemEnabled() {
//复制粘贴删除功能
String selectText = editArea.getSelectedText();
if(selectText == null) {
editCut.setEnabled(false);
editCopy.setEnabled(false);
editDelete.setEnabled(false);
popupMenuCopy.setEnabled(false);
popupMenuCut.setEnabled(false);
popupMenuDelete.setEnabled(false);
}
else {
editCut.setEnabled(true);
editCopy.setEnabled(true);
editDelete.setEnabled(true);
popupMenuCopy.setEnabled(true);
popupMenuCut.setEnabled(true);
popupMenuDelete.setEnabled(true);
}
//粘贴功能
Transferable contents=clipBoard.getContents(this); //获取剪贴板的内容
if(contents == null) {
editPaste.setEnabled(false);
popupMenuPaste.setEnabled(false);
}
else {
editPaste.setEnabled(true);
popupMenuPaste.setEnabled(true);
}
}
这样文本编辑区的基本的一些功能就实现了,还有些小细节什么的自己看一下源代码就好
(3)窗口关闭的这个功能,就是你打开文件然后关闭记事本的时候,需要检查文本内容有没有发生改变,选择你的操作,保存还是直接退出之类的
public void exitWindowChoose() {
editArea.requestFocus(); //定到文本编辑区
String currentText = editArea.getText(); //获取当前编辑区的内容
if(currentText.equals(oldText)) {
setMemory(); //保存文件的设置
System.exit(0);
}
else {
int exitChoose = JOptionPane.showConfirmDialog(this, "文件尚未保存",
"退出提示", JOptionPane.YES_NO_CANCEL_OPTION);
if(exitChoose == JOptionPane.YES_OPTION) {
if(isNewFile) {
saveNewFile();
}
else {
saveNotNewFile();
}
setMemory();
System.exit(0);
}
else if (exitChoose == JOptionPane.NO_OPTION){
setMemory();
System.exit(0);
}
else if (exitChoose == JOptionPane.CANCEL_OPTION) {
statusLabel2.setText("文件未保存");
return;
}
else {
return;
}
}
}
(4)上面的其实还要用到就是保存,另存为,不保存这些功能,其实这些在菜单栏中都存在,就贴一下代码看一下
public void saveNewFile() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); //只读方式打开
fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("另存为");
int result = fileChooser.showSaveDialog(this);
if(result == JFileChooser.CANCEL_OPTION) {
statusLabel2.setText("文件未保存");
return;
}
File saveFileName = fileChooser.getSelectedFile();
if(saveFileName == null || saveFileName.getName().equals("")) {
JOptionPane.showMessageDialog(this, "错误的文件名", "错误的文件名", JOptionPane.ERROR_MESSAGE);
}
else {
try { //将文件保存
OutputStream os = new FileOutputStream(saveFileName); //创建文件
OutputStreamWriter osw = new OutputStreamWriter(os); //OutputStreamWriter的接收类型是OutputStream,字节转换为字符流
PrintWriter pw = new PrintWriter(osw); //字符输出流
pw.write(editArea.getText()); //获取文本编辑区中的内容并写入文本
pw.flush(); //将缓冲区的数据流清除
pw.close(); //关闭所有关联的输出串流
isNewFile = false;
currentFile = saveFileName;
this.setTitle(saveFileName.getName());
statusLabel2.setText("当前文件名为:" + saveFileName.getAbsolutePath()); //获取文件的绝对路径
}catch(IOException ioe) {
ioe.printStackTrace(); //抛出异常产生的位置和原因
}
}
}
//当文件内容没有发生改变时不保存新文件
public void saveNotNewFile() {
try {
OutputStream os = new FileOutputStream(currentFile);
OutputStreamWriter osw = new OutputStreamWriter(os);
PrintWriter pw = new PrintWriter(osw);
pw.write(editArea.getText());
pw.flush();
pw.close();
}catch(IOException ioe) {
ioe.printStackTrace();
}
}
//文件另存为
public void saveAs() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("另存为");
int result = fileChooser.showSaveDialog(this);
if(result == JFileChooser.CANCEL_OPTION) {
statusLabel2.setText("文件为保存");
return;
}
File saveFileName = fileChooser.getSelectedFile();
if(saveFileName == null || saveFileName.getName().equals("")) {
JOptionPane.showMessageDialog(this, "错误的文件名", "错误的文件名", JOptionPane.ERROR_MESSAGE);
}
else {
try {
OutputStream os = new FileOutputStream(currentFile);
OutputStreamWriter osw = new OutputStreamWriter(os);
PrintWriter pw = new PrintWriter(osw);
pw.write(editArea.getText());
pw.flush();
pw.close();
isNewFile = false;
currentFile = saveFileName;
this.setTitle(saveFileName.getName());
statusLabel2.setText("当前文件名 " + saveFileName.getAbsolutePath());
}catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
其实文件另存为和保存一样的,因为本来就是一样的功能
(5)字体设置,这个。。。。。给代码大家一起研究下
package Font;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
/**
* 字体选择器,仿记事本中的字体控件,使用操作方法与文件选择器JFileChooser基本相同。
*
*/
@SuppressWarnings("serial")
public class MyFont extends JDialog {
/**
* 选择取消按钮的返回值
*/
public static final int CANCEL_OPTION = 0;
/**
* 选择确定按钮的返回值
*/
public static final int APPROVE_OPTION = 1;
/**
* 中文预览的字符串
*/
private static final String CHINA_STRING = "神马都是浮云!";
/**
* 英文预览的字符串
*/
private static final String ENGLISH_STRING = "Hello Kitty!";
/**
* 数字预览的字符串
*/
private static final String NUMBER_STRING = "0123456789";
// 预设字体,也是将来要返回的字体
private Font font = null;
// 字体选择器组件容器
private Box box = null;
// 字体文本框
private JTextField fontText = null;
// 样式文本框
private JTextField styleText = null;
// 文字大小文本框
private JTextField sizeText = null;
// 预览文本框
private JTextField previewText = null;
// 中文预览
private JRadioButton chinaButton = null;
// 英文预览
private JRadioButton englishButton = null;
// 数字预览
private JRadioButton numberButton = null;
// 字体选择框
private JList fontList = null;
// 样式选择器
private JList styleList = null;
// 文字大小选择器
private JList sizeList = null;
// 确定按钮
private JButton approveButton = null;
// 取消按钮
private JButton cancelButton = null;
// 所有字体
private String [] fontArray = null;
// 所有样式
private String [] styleArray = {"常规", "粗体", "斜体", "粗斜体"};
// 所有预设字体大小
private String [] sizeArray = {"8", "9", "10", "11", "12", "14", "16", "18", "20", "22", "24", "26", "28", "36", "48", "初号", "小初", "一号", "小一", "二号", "小二", "三号", "小三", "四号", "小四", "五号", "小五", "六号", "小六", "七号", "八号"};
// 上面数组中对应的字体大小
private int [] sizeIntArray = {8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 42, 36, 26, 24, 22, 18, 16, 15, 14, 12, 10, 9, 8, 7, 6, 5};
// 返回的数值,默认取消
private int returnValue = CANCEL_OPTION;
/**
* 体构造一个字体选择器
*/
public MyFont() {
this(new Font("宋体", Font.PLAIN, 12));
}
/**
* 使用给定的预设字体构造一个字体选择器
* @param font 字体
*/
public MyFont(Font font) {
setTitle("字体选择器");
this.font = font;
// 初始化UI组件
init();
// 添加监听器
addListener();
// 按照预设字体显示
setup();
// 基本设置
setModal(true);
setResizable(false);
// 自适应大小
pack();
}
/**
* 初始化组件
*/
private void init(){
// 获得系统字体
GraphicsEnvironment eq = GraphicsEnvironment.getLocalGraphicsEnvironment();
fontArray = eq.getAvailableFontFamilyNames();
// 主容器
box = Box.createVerticalBox();
box.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
fontText = new JTextField();
fontText.setEditable(false);
fontText.setBackground(Color.WHITE);
styleText = new JTextField();
styleText.setEditable(false);
styleText.setBackground(Color.WHITE);
sizeText = new JTextField("12");
// 给文字大小文本框使用的Document文档,制定了一些输入字符的规则
Document doc = new PlainDocument(){
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if (str == null) {
return;
}
if (getLength() >= 3) {
return;
}
if (!str.matches("[0-9]+") && !str.equals("初号") && !str.equals("小初") && !str.equals("一号") && !str.equals("小一") && !str.equals("二号") && !str.equals("小二") && !str.equals("三号") && !str.equals("小三") && !str.equals("四号") && !str.equals("小四") && !str.equals("五号") && !str.equals("小五") && !str.equals("六号") && !str.equals("小六") && !str.equals("七号") && !str.equals("八号")) {
return;
}
super.insertString(offs, str, a);
sizeList.setSelectedValue(sizeText.getText(), true);
}
};
sizeText.setDocument(doc);
previewText = new JTextField(20);
previewText.setHorizontalAlignment(JTextField.CENTER);
previewText.setEditable(false);
previewText.setBackground(Color.WHITE);
chinaButton = new JRadioButton("中文预览", true);
englishButton = new JRadioButton("英文预览");
numberButton = new JRadioButton("数字预览");
ButtonGroup bg = new ButtonGroup();
bg.add(chinaButton);
bg.add(englishButton);
bg.add(numberButton);
fontList = new JList(fontArray);
styleList = new JList(styleArray);
sizeList = new JList(sizeArray);
approveButton = new JButton("确定");
cancelButton = new JButton("取消");
Box box1 = Box.createHorizontalBox();
JLabel l1 = new JLabel("字体:");
JLabel l2 = new JLabel("字形:");
JLabel l3 = new JLabel("大小:");
l1.setPreferredSize(new Dimension(165, 14));
l1.setMaximumSize(new Dimension(165, 14));
l1.setMinimumSize(new Dimension(165, 14));
l2.setPreferredSize(new Dimension(95, 14));
l2.setMaximumSize(new Dimension(95, 14));
l2.setMinimumSize(new Dimension(95, 14));
l3.setPreferredSize(new Dimension(80, 14));
l3.setMaximumSize(new Dimension(80, 14));
l3.setMinimumSize(new Dimension(80, 14));
box1.add(l1);
box1.add(l2);
box1.add(l3);
Box box2 = Box.createHorizontalBox();
fontText.setPreferredSize(new Dimension(160, 20));
fontText.setMaximumSize(new Dimension(160, 20));
fontText.setMinimumSize(new Dimension(160, 20));
box2.add(fontText);
box2.add(Box.createHorizontalStrut(5));
styleText.setPreferredSize(new Dimension(90, 20));
styleText.setMaximumSize(new Dimension(90, 20));
styleText.setMinimumSize(new Dimension(90, 20));
box2.add(styleText);
box2.add(Box.createHorizontalStrut(5));
sizeText.setPreferredSize(new Dimension(80, 20));
sizeText.setMaximumSize(new Dimension(80, 20));
sizeText.setMinimumSize(new Dimension(80, 20));
box2.add(sizeText);
Box box3 = Box.createHorizontalBox();
JScrollPane sp1 = new JScrollPane(fontList);
sp1.setPreferredSize(new Dimension(160, 100));
sp1.setMaximumSize(new Dimension(160, 100));
sp1.setMaximumSize(new Dimension(160, 100));
box3.add(sp1);
box3.add(Box.createHorizontalStrut(5));
JScrollPane sp2 = new JScrollPane(styleList);
sp2.setPreferredSize(new Dimension(90, 100));
sp2.setMaximumSize(new Dimension(90, 100));
sp2.setMinimumSize(new Dimension(90, 100));
box3.add(sp2);
box3.add(Box.createHorizontalStrut(5));
JScrollPane sp3 = new JScrollPane(sizeList);
sp3.setPreferredSize(new Dimension(80, 100));
sp3.setMaximumSize(new Dimension(80, 100));
sp3.setMinimumSize(new Dimension(80, 100));
box3.add(sp3);
Box box4 = Box.createHorizontalBox();
Box box5 = Box.createVerticalBox();
JPanel box6 = new JPanel(new BorderLayout());
box5.setBorder(BorderFactory.createTitledBorder("字符集"));
box6.setBorder(BorderFactory.createTitledBorder("示例"));
box5.add(chinaButton);
box5.add(englishButton);
box5.add(numberButton);
box5.setPreferredSize(new Dimension(90, 95));
box5.setMaximumSize(new Dimension(90, 95));
box5.setMinimumSize(new Dimension(90, 95));
box6.add(previewText);
box6.setPreferredSize(new Dimension(250, 95));
box6.setMaximumSize(new Dimension(250, 95));
box6.setMinimumSize(new Dimension(250, 95));
box4.add(box5);
box4.add(Box.createHorizontalStrut(4));
box4.add(box6);
Box box7 = Box.createHorizontalBox();
box7.add(Box.createHorizontalGlue());
box7.add(approveButton);
box7.add(Box.createHorizontalStrut(5));
box7.add(cancelButton);
box.add(box1);
box.add(box2);
box.add(box3);
box.add(Box.createVerticalStrut(5));
box.add(box4);
box.add(Box.createVerticalStrut(5));
box.add(box7);
getContentPane().add(box);
}
/**
* 按照预设字体显示
*/
private void setup() {
String fontName = font.getFamily();
int fontStyle = font.getStyle();
int fontSize = font.getSize();
/*
* 如果预设的文字大小在选择列表中,则通过选择该列表中的某项进行设值,否则直接将预设文字大小写入文本框
*/
boolean b = false;
for (int i = 0; i < sizeArray.length; i++) {
if (sizeArray[i].equals(String.valueOf(fontSize))) {
b = true;
break;
}
}
if(b){
// 选择文字大小列表中的某项
sizeList.setSelectedValue(String.valueOf(fontSize), true);
}else{
sizeText.setText(String.valueOf(fontSize));
}
// 选择字体列表中的某项
fontList.setSelectedValue(fontName, true);
// 选择样式列表中的某项
styleList.setSelectedIndex(fontStyle);
// 预览默认显示中文字符
chinaButton.doClick();
// 显示预览
setPreview();
}
/**
* 添加所需的事件监听器
*/
private void addListener() {
sizeText.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent e) {
setPreview();
}
public void focusGained(FocusEvent e) {
sizeText.selectAll();
}
});
// 字体列表发生选择事件的监听器
fontList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
fontText.setText(String.valueOf(fontList.getSelectedValue()));
// 设置预览
setPreview();
}
}
});
styleList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
styleText.setText(String.valueOf(styleList.getSelectedValue()));
// 设置预览
setPreview();
}
}
});
sizeList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
if(!sizeText.isFocusOwner()){
sizeText.setText(String.valueOf(sizeList.getSelectedValue()));
}
// 设置预览
setPreview();
}
}
});
// 编码监听器
EncodeAction ea = new EncodeAction();
chinaButton.addActionListener(ea);
englishButton.addActionListener(ea);
numberButton.addActionListener(ea);
// 确定按钮的事件监听
approveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 组合字体
font = groupFont();
// 设置返回值
returnValue = APPROVE_OPTION;
// 关闭窗口
disposeDialog();
}
});
// 取消按钮事件监听
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
disposeDialog();
}
});
}
/**
* 显示字体选择器
* @param owner 上层所有者
* @return 该整形返回值表示用户点击了字体选择器的确定按钮或取消按钮,参考本类常量字段APPROVE_OPTION和CANCEL_OPTION
*/
public final int showFontDialog(JFrame owner) {
setLocationRelativeTo(owner);
setVisible(true);
return returnValue;
}
/**
* 返回选择的字体对象
* @return 字体对象
*/
public final Font getSelectFont() {
return font;
}
/**
* 关闭窗口
*/
private void disposeDialog() {
MyFont.this.removeAll();
MyFont.this.dispose();
}
/**
* 显示错误消息
* @param errorMessage 错误消息
*/
private void showErrorDialog(String errorMessage) {
JOptionPane.showMessageDialog(this, errorMessage, "错误", JOptionPane.ERROR_MESSAGE);
}
/**
* 设置预览
*/
private void setPreview() {
Font f = groupFont();
previewText.setFont(f);
}
/**
* 按照选择组合字体
* @return 字体
*/
private Font groupFont() {
String fontName = fontText.getText();
int fontStyle = styleList.getSelectedIndex();
String sizeStr = sizeText.getText().trim();
// 如果没有输入
if(sizeStr.length() == 0) {
showErrorDialog("字体(大小)必须是有效“数值!");
return null;
}
int fontSize = 0;
// 通过循环对比文字大小输入是否在现有列表内
for (int i = 0; i < sizeArray.length; i++) {
if(sizeStr.equals(sizeArray[i])){
fontSize = sizeIntArray[i];
break;
}
}
// 没有在列表内
if (fontSize == 0) {
try{
fontSize = Integer.parseInt(sizeStr);
if(fontSize < 1){
showErrorDialog("字体(大小)必须是有效“数值”!");
return null;
}
}catch (NumberFormatException nfe) {
showErrorDialog("字体(大小)必须是有效“数值”!");
return null;
}
}
return new Font(fontName, fontStyle, fontSize);
}
/**
* 编码选择事件的监听动作
*
*/
class EncodeAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(chinaButton)) {
previewText.setText(CHINA_STRING);
} else if (e.getSource().equals(englishButton)) {
previewText.setText(ENGLISH_STRING);
} else {
previewText.setText(NUMBER_STRING);
}
}
}
}
到这里功能就基本完成了,有什么要改善的以后再完善
源代码下载地址:
https://github.com/songwell1024/NotePad.git