这是几年前写的,放上来: package phase10; import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; import com.borland.dbswing.*; import org.newboy.io.MyFileFilter; import org.newboy.io.FileOperator; import org.newboy.util.FDate; import java.awt.Font; import java.awt.BorderLayout; public class FrameEdit extends JFrame { JPanel contentPane = (JPanel)this.getContentPane(); JLabel status = new JLabel(); JMenuBar mbDefault = new JMenuBar(); JMenu mnuFile = new JMenu(); JMenu mnuEdit = new JMenu(); JMenuItem mnuNew = new JMenuItem(); JMenuItem mnuOpen = new JMenuItem(); JMenuItem mnuExit = new JMenuItem(); JMenuItem mnuFont = new JMenuItem(); JMenu mnuColor = new JMenu(); JRadioButtonMenuItem mnuFore = new JRadioButtonMenuItem("Fore Color"); JRadioButtonMenuItem mnuBack = new JRadioButtonMenuItem("Back Color"); JFileChooser fcSelect = new JFileChooser(); JColorChooser colorChoose = new JColorChooser(); FontChooser fc = new FontChooser(this, "Select Fonts"); ButtonGroup bg = new ButtonGroup(); JMenuItem mnuSave = new JMenuItem(); JMenu mnuTools = new JMenu(); JMenuItem mnuDate = new JMenuItem(); JCheckBoxMenuItem mnuLock = new JCheckBoxMenuItem(); JScrollPane jspEdit = new JScrollPane(); BorderLayout borderLayout = new BorderLayout(); JMenu mnuHelp = new JMenu(); JMenuItem mnuTopics = new JMenuItem(); JMenuItem mnuAbout = new JMenuItem(); JTextArea txaEdit = new JTextArea(); JCheckBoxMenuItem mnuWrap = new JCheckBoxMenuItem(); JRadioButtonMenuItem mnuDefault = new JRadioButtonMenuItem("Default Color"); JMenuItem mnuCopy = new JMenuItem(); JMenuItem mnuCut = new JMenuItem(); JMenuItem mnuPaste = new JMenuItem(); public FrameEdit() { try { setDefaultCloseOperation(EXIT_ON_CLOSE); jbInit(); } catch (Exception exception) { exception.printStackTrace(); } } /** * Component initialization. * * @throws java.lang.Exception */ private void jbInit() throws Exception { contentPane.setLayout(new BorderLayout(5, 5)); setPreferredSize(new Dimension(640, 480)); //设置过滤器,不能每次都设置 fcSelect.setFileFilter(new MyFileFilter("*.txt", "Text Files (*.txt)")); setTitle("Edit Pro - Untitled.txt"); mnuFile.setText("File"); mnuEdit.setText("Edit"); mnuNew.setText("New"); mnuTools.setText("Tools"); mnuDate.setText("Date/Time"); mnuNew.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mnuNew_actionPerformed(e); } }); mnuOpen.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mnuOpen_actionPerformed(e); } }); // this.setResizable(false); mnuExit.setText("Exit"); mnuExit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mnuExit_actionPerformed(e); } }); mnuFont.setText("Font"); mnuFont.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mnuFont_actionPerformed(e); } }); mnuColor.setText("Color"); mnuFore.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mnuFore_actionPerformed(e); } }); mnuBack.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mnuBack_actionPerformed(e); } }); mnuSave.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mnuSave_actionPerformed(e); } }); mnuSave.setText("Save..."); mnuDate.setText("Insert Date/Time"); mnuDate.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { mnuDate_actionPerformed(e); } catch (Exception ex) { ex.printStackTrace(); } } }); mnuLock.setText("Lock"); mnuLock.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mnuLock_actionPerformed(e); } }); borderLayout.setHgap(5); borderLayout.setVgap(5); mnuOpen.setText("Open..."); mnuHelp.setText("Help"); mnuTopics.setText("Help Topics"); mnuAbout.setText("About Me"); txaEdit.addCaretListener(new CaretListener() { public void caretUpdate(CaretEvent e) { txaEdit_caretUpdate(e); } }); txaEdit.setFont(new java.awt.Font("Dialog", Font.PLAIN, 14)); txaEdit.setLineWrap(true); mnuWrap.setText("Auto Wrap"); mnuWrap.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mnuWrap_actionPerformed(e); } }); mnuDefault.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mnuDefault_actionPerformed(e); } }); mnuCopy.setMnemonic('C'); mnuCopy.setText("Copy"); mnuCut.setMnemonic('T'); mnuCut.setText("Cut"); mnuPaste.setMnemonic('P'); mnuPaste.setText("Paste"); mbDefault.add(mnuFile); mnuFile.setMnemonic('F'); mbDefault.add(mnuEdit); mnuEdit.setMnemonic('E'); mbDefault.add(mnuTools); mnuTools.setMnemonic('T'); mbDefault.add(mnuHelp); mnuHelp.setMnemonic('H'); mnuFile.add(mnuNew); mnuNew.setMnemonic('N'); mnuFile.add(mnuOpen); mnuOpen.setMnemonic('O'); mnuFile.add(mnuSave); mnuSave.setMnemonic('S'); mnuFile.addSeparator(); mnuFile.add(mnuExit); mnuExit.setMnemonic('X'); mnuEdit.add(mnuCopy); mnuEdit.add(mnuCut); mnuEdit.add(mnuPaste); mnuEdit.addSeparator(); mnuEdit.add(mnuFont); mnuFont.setMnemonic('F'); mnuEdit.add(mnuColor); mnuColor.setMnemonic('L'); mnuEdit.addSeparator(); mnuEdit.add(mnuWrap); mnuEdit.add(mnuLock); mnuLock.setMnemonic('K'); mnuColor.add(mnuDefault); mnuDefault.setMnemonic('D'); mnuColor.add(mnuFore); mnuFore.setMnemonic('F'); mnuColor.add(mnuBack); mnuBack.setMnemonic('B'); bg.add(mnuBack); bg.add(mnuFore); mnuTools.add(mnuDate); mnuDate.setMnemonic('I'); contentPane.add(jspEdit, java.awt.BorderLayout.CENTER); jspEdit.getViewport().add(txaEdit); mnuHelp.add(mnuTopics); mnuTopics.setMnemonic('T'); mnuWrap.setSelected(true); mnuHelp.addSeparator(); mnuHelp.add(mnuAbout); mnuWrap.setMnemonic('W'); mnuAbout.setMnemonic('A'); contentPane.add(status, BorderLayout.SOUTH); status.setText("Status Bar:"); setJMenuBar(mbDefault); } void txaEdit_caretUpdate(CaretEvent e) { int row = 0; int col = 0; int count = 0; try { int pos = txaEdit.getCaretPosition(); row = txaEdit.getLineOfOffset(pos) + 1; //得到行的起始偏移 int lineStart = txaEdit.getLineStartOffset(row - 1); //确定给定行起始处的偏移量 col = pos - lineStart; //得到列号 count = txaEdit.getLineCount(); } catch (BadLocationException ex) { ex.printStackTrace(); } status.setText("Rows: " + row + " , Cols: " + col + " Count Line: " + count); } /** * File | Exit action performed. * * @param actionEvent ActionEvent */ void mnuExit_actionPerformed(ActionEvent actionEvent) { System.exit(0); } /** * 打开文本文件 * @param fileName 文件名 * @return 打开的文件内容 */ public boolean mnuOpen_actionPerformed(ActionEvent e) { fcSelect.showOpenDialog(this); File file = fcSelect.getSelectedFile(); if (file == null) { return false; } String fileName = null; try { //包含了文件名 fileName = file.getAbsolutePath(); txaEdit.setText(FileOperator.openFile(fileName)); this.setTitle("Edit Pro - " + fileName); } catch (FileNotFoundException ex) { JOptionPane.showMessageDialog(this, "Cannot find file: [" + fileName + "]."); return false; } catch (IOException ex) { JOptionPane.showMessageDialog(this, "[" + fileName + "] I/O error!"); ex.printStackTrace(); return false; } return true; } public void mnuFont_actionPerformed(ActionEvent e) { if (fc.showDialog()) { txaEdit.setFont(fc.getSelectedFont()); } } public void mnuNew_actionPerformed(ActionEvent e) { if (txaEdit.getText().equals("")) { return; } String fileName = JOptionPane.showInputDialog("Please input the new file name:"); //点的取消按钮 if (fileName == null) { return; } if (fileName.equals("")) { fileName = "Untitled.txt"; } txaEdit.setText(""); this.setTitle("Edit Pro - " + fileName); } public void mnuBack_actionPerformed(ActionEvent e) { Color newColor = colorChoose.showDialog(this, "Back Color", txaEdit.getBackground()); if (newColor != null) { txaEdit.setBackground(newColor); } } public void mnuFore_actionPerformed(ActionEvent e) { Color newColor = colorChoose.showDialog(this, "Fore Color", txaEdit.getForeground()); if (newColor != null) { txaEdit.setForeground(newColor); } } public void mnuSave_actionPerformed(ActionEvent e) { if (fcSelect.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) { return; } //包含文件名 String fileName = fcSelect.getSelectedFile().getAbsolutePath(); try { FileOperator.saveToFile(fileName, txaEdit.getText()); this.setTitle("Edit Pro - " + fileName); } catch (IOException ex) { ex.printStackTrace(); } } public void mnuDate_actionPerformed(ActionEvent e) throws BadLocationException { //插入日期的样式,出现对话框 //TOTAL_STYLE代表日期的种类,从0到TOTAL_STYLE-1 String dateStyle[] = new String[4]; for (int i = 0; i < dateStyle.length; i++) { dateStyle[i] = FDate.getFormatDate(i); } //插入不同的类型 String selectedDate = (String) JOptionPane.showInputDialog(contentPane, "Please select a style:", "Date/Time", JOptionPane.INFORMATION_MESSAGE, null, dateStyle, dateStyle[3]); //得到光标当前的位置插入 if (selectedDate != null) { int pos = txaEdit.getCaretPosition(); txaEdit.insert(selectedDate, pos); } } public void mnuLock_actionPerformed(ActionEvent e) { if (txaEdit.isEditable()) { txaEdit.setEditable(false); } else { txaEdit.setEditable(true); } } public void mnuWrap_actionPerformed(ActionEvent e) { txaEdit.setLineWrap(!txaEdit.getLineWrap()); } public void mnuDefault_actionPerformed(ActionEvent e) { txaEdit.setBackground(Color.WHITE); txaEdit.setForeground(Color.BLACK); } } 一共只有2个类: package phase10; import java.awt.Toolkit; import javax.swing.SwingUtilities; import javax.swing.UIManager; import java.awt.Dimension; public class EditApp { boolean packFrame = true; /** * Construct and show the application. */ public EditApp() { FrameEdit frame = new FrameEdit(); // Validate frames that have preset sizes // Pack frames that have useful preferred size info, e.g. from their layout if (packFrame) { frame.pack(); } else { frame.validate(); } // Center the window Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); if (frameSize.height > screenSize.height) { frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } frame.setLocation( (screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); frame.setVisible(true); } /** * Application entry point. * * @param args String[] */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { try { //改变外观 javax.swing.JFrame.setDefaultLookAndFeelDecorated(true); UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception exception) { exception.printStackTrace(); } new EditApp(); } }); } }