diff --git a/src/java2020spring/Notepad.java b/src/java2020spring/Notepad.java new file mode 100644 index 0000000000000000000000000000000000000000..a03920956240d3cfcee70afb2b1523954b4888b7 --- /dev/null +++ b/src/java2020spring/Notepad.java @@ -0,0 +1,492 @@ +package java2020spring; +import java.awt.*; +import javax.swing.*; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.event.UndoableEditEvent; +import javax.swing.event.UndoableEditListener; +import javax.swing.undo.CannotRedoException; +import javax.swing.undo.UndoManager; +import java.util.*; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +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.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Calendar; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.InputEvent; +public class Notepad extends JFrame implements ActionListener{ + JMenuBar menubar; + JFrame frame; + JLabel labelTips,labelLine,labelColumn,labelNum; + JScrollPane jsp; + JMenu menu_file,menu_edit,menu_format,menu_view,menu_help; + JMenuItem item_new,item_open,item_save,item_saveas,item_exit,item_undo,item_redo,item_cut,item_copy,item_paste,item_delete,item_allselected,item_time,item_autoEnter,item_status,item_help,item_about; + JMenuItem p_undo,p_cut,p_copy,p_paste,p_delete,p_allselected; + JPanel endPanel,panelRow,panelColumn,panelNum; + JTextArea textArea; + JFileChooser filechooser=new JFileChooser(); + File file=null; + int windowNum=0; + UndoManager undomanager=new UndoManager(); + boolean isSaved=true; + JPopupMenu popM; + JComboBox box; + JCheckBox check; + public Notepad() {} + public Notepad(String s){ + init(s); + setVisible(true); + createPanel(); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + @SuppressWarnings("deprecation") + void init(String s){ + setTitle(s); + textArea=new JTextArea(); + jsp=new JScrollPane(textArea); + jsp.setVerticalScrollBarPolicy(jsp.VERTICAL_SCROLLBAR_ALWAYS); + check=new JCheckBox("状态栏"); + menubar=new JMenuBar(); + //文件 + menu_file=new JMenu("文件"); + item_new=new JMenuItem("新建"); + item_new.setAccelerator(KeyStroke. getKeyStroke (KeyEvent.VK_N, InputEvent. CTRL_MASK)); + item_open=new JMenuItem("打开"); + item_open.setAccelerator(KeyStroke. getKeyStroke (KeyEvent.VK_O, InputEvent. CTRL_MASK)); + item_save=new JMenuItem("保存"); + item_save.setAccelerator(KeyStroke. getKeyStroke(KeyEvent.VK_S, InputEvent. SHIFT_MASK)); + item_saveas=new JMenuItem("另存为"); + item_saveas.setAccelerator(KeyStroke. getKeyStroke (KeyEvent.VK_P, InputEvent. CTRL_MASK)); + item_exit=new JMenuItem("退出"); + item_exit.setAccelerator(KeyStroke.getKeyStroke("X")); + menu_file.addSeparator(); + //编辑 + menu_edit=new JMenu("编辑"); + item_undo=new JMenuItem("撤销"); + item_undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_MASK)); + item_redo=new JMenuItem("重做"); + item_redo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK)); + item_cut=new JMenuItem("剪切"); + item_cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_MASK)); + item_copy=new JMenuItem("复制"); + item_copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK)); + item_paste=new JMenuItem("粘贴"); + item_paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_MASK)); + item_delete=new JMenuItem("删除"); + item_delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0)); + item_allselected=new JMenuItem("全选"); + item_allselected.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK)); + item_time=new JMenuItem("时间/日期"); + item_time.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M,InputEvent.CTRL_MASK)); + menu_edit.addSeparator(); + //格式 + menu_format=new JMenu("格式"); + item_autoEnter=new JMenuItem("自动换行"); + item_autoEnter.setAccelerator(KeyStroke.getKeyStroke("A")); + menu_format.addSeparator(); + //视图 + menu_view=new JMenu("视图"); + item_status=new JMenuItem("状态栏"); + item_status.setAccelerator(KeyStroke.getKeyStroke("S")); + menu_view.addSeparator(); + //帮助 + menu_help=new JMenu("帮助"); + item_help=new JMenuItem("查看帮助"); + item_help.setAccelerator(KeyStroke.getKeyStroke("H")); + item_about=new JMenuItem("关于记事本"); + item_about.setAccelerator(KeyStroke.getKeyStroke("A")); + menu_help.addSeparator(); + //添加菜单项 + menu_file.add(item_new); + menu_file.add(item_open); + menu_file.add(item_save); + menu_file.add(item_saveas); + menu_file.add(item_exit); + menu_edit.add(item_undo); + menu_edit.add(item_cut); + menu_edit.add(item_copy); + menu_edit.add(item_paste); + menu_edit.add(item_delete); + menu_edit.add(item_allselected); + menu_edit.add(item_time); + menu_format.add(item_autoEnter); + menu_view.add(item_status); + menu_help.add(item_help); + menu_help.add(item_about); + //添加菜单 + menubar.add(menu_file); + menubar.add(menu_edit); + menubar.add(menu_format); + menubar.add(menu_view); + menubar.add(menu_help); + add(check); + setJMenuBar(menubar);//添加菜单条 + textArea.setFont(new Font("", Font.PLAIN, 18));//设置常用字体 + this.add(jsp,BorderLayout.CENTER); + add(createPanel(), BorderLayout.PAGE_END); + //添加弹出菜单 + popM=new JPopupMenu(); + p_undo=new JMenuItem("撤销(U)"); + p_cut=new JMenuItem("剪切(T)"); + p_copy=new JMenuItem("复制(C)"); + p_paste=new JMenuItem("粘贴(V)"); + p_delete=new JMenuItem("删除(D)"); + p_allselected=new JMenuItem("全选(A)"); + popM.add(p_undo); + popM.add(p_cut); + popM.add(p_copy); + popM.add(p_paste); + popM.add(p_delete); + popM.add(p_allselected); + + popM.setPreferredSize(new Dimension(300,200)); + popM.setBackground(Color.LIGHT_GRAY); + addActionListener();//添加监听器 + + //组件监听器 + this.addComponentListener(new ComponentListener() { + @Override + public void componentResized(ComponentEvent e) { + // TODO 自动生成的方法存根 + labelTips.setPreferredSize(new Dimension(800,20)); + } + @Override + public void componentMoved(ComponentEvent e) {} + @Override + public void componentShown(ComponentEvent e) {} + + @Override + public void componentHidden(ComponentEvent e) {}}); + + //窗口监听器 + this.addWindowListener(new WindowListener() { + + @Override + public void windowOpened(WindowEvent e) { + // TODO 自动生成的方法存根 + windowNum++; + } + + @Override + public void windowClosing(WindowEvent e) {} + @Override + public void windowClosed(WindowEvent e) { + // TODO 自动生成的方法存根 + windowNum--; + if(windowNum==0) { + System.exit(0); + } + } + + @Override + public void windowIconified(WindowEvent e) {} + @Override + public void windowDeiconified(WindowEvent e) {} + @Override + public void windowActivated(WindowEvent e) {} + @Override + public void windowDeactivated(WindowEvent e) {} + }); + + //监听文本光标移动事件 + textArea.addCaretListener(new CaretListener() { + public void caretUpdate(CaretEvent e) { + try { + int pos = textArea.getCaretPosition(); // 获取行数 + int linecounter = textArea.getLineOfOffset(pos) + 1;// 获取列数 + int columncounter = pos - textArea.getLineStartOffset(linecounter - 1) + 1; + labelLine.setText("行数:" + linecounter); + labelColumn.setText("列数:" + columncounter); + labelNum.setText("字数:" + textArea.getText().length()); + } + catch (Exception ec) { + labelTips.setText("无法获得当前光标位置 "); + } + } + }); + //鼠标监听器 + textArea.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if(e.isPopupTrigger()) { + popM.show(e.getComponent(), e.getX(), e.getY()); + } + textArea.requestFocus(); + } + + public void mouseReleased(MouseEvent e) { + if(e.isPopupTrigger()) { + popM.show(e.getComponent(), e.getX(), e.getY()); + } + textArea.requestFocus(); + } + + @Override + public void mousePressed(MouseEvent e) {} + @Override + public void mouseEntered(MouseEvent e) {} + @Override + public void mouseExited(MouseEvent e) {} + }); + + //文本监听器 + textArea.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + change(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + change(); + } + @Override + public void changedUpdate(DocumentEvent e) {} + }); + + + textArea.getDocument().addUndoableEditListener(new UndoableEditListener() { + @Override + public void undoableEditHappened(UndoableEditEvent e) { + // TODO 自动生成的方法存根 + undomanager.addEdit(e.getEdit()); + item_undo.setEnabled(undomanager.canUndo()); + item_redo.setEnabled(undomanager.canRedo()); + } + }); + } + //设置文本状态未保存 + public void change() { + isSaved=false; + } + + + JPanel createPanel(){ + endPanel=new JPanel(); + endPanel.setPreferredSize(new Dimension(800,25)); + endPanel.setBackground(Color.LIGHT_GRAY); + endPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); + endPanel.add(labelLine = new JLabel("行数:1")); + endPanel.add(labelColumn = new JLabel("列数:1")); + endPanel.add(labelNum = new JLabel("字数:0")); + return endPanel; + } + + private void addActionListener() { + //文件 + item_new.addActionListener(this); + item_open.addActionListener(this); + item_save.addActionListener(this); + item_saveas.addActionListener(this); + item_exit.addActionListener(this); + //编辑 + item_undo.addActionListener(this); + item_cut.addActionListener(this); + item_copy.addActionListener(this); + item_paste.addActionListener(this); + item_delete.addActionListener(this); + item_allselected.addActionListener(this); + item_time.addActionListener(this); + //格式 + item_autoEnter.addActionListener(this); + //视图 + item_status.addActionListener(this); + //帮助 + item_help.addActionListener(this); + item_about.addActionListener(this); + //弹出菜单 + p_undo.addActionListener(this); + p_cut.addActionListener(this); + p_copy.addActionListener(this); + p_paste.addActionListener(this); + p_delete.addActionListener(this); + p_allselected.addActionListener(this); + } + public void actionPerformed(ActionEvent e) { + if(e.getSource()==item_new) { + create(); + } + else if(e.getSource()==item_open) { + open(); + } + else if(e.getSource()==item_save) { + save(); + } + else if(e.getSource()==item_saveas) { + saveas(); + } + else if(e.getSource()==item_exit) { + this.dispose(); + windowNum--; + if(windowNum==0) { + System.exit(0); + } + } + else if(e.getSource()==item_undo||e.getSource()==p_undo) { + try { + undomanager.undo(); + labelTips.setText("撤销"); + } catch (CannotRedoException cre) {} + item_undo.setEnabled(undomanager.canUndo()); + item_redo.setEnabled(undomanager.canRedo()); + } + else if(e.getSource()==item_cut||e.getSource()==p_cut) { + + textArea.cut(); + } + else if(e.getSource()==item_copy||e.getSource()==p_copy) { + + textArea.copy(); + } + else if(e.getSource()==item_paste||e.getSource()==p_paste) { + textArea.paste(); + } + else if(e.getSource()==item_delete||e.getSource()==p_delete) { + textArea.requestFocus(); + textArea.replaceRange("", textArea.getSelectionStart(), textArea.getSelectionEnd()); + } + else if(e.getSource()==item_allselected||e.getSource()==p_allselected) { + textArea.selectAll(); + } + else if(e.getSource()==item_time) { + Calendar now=Calendar.getInstance(); + java.util.Date date=now.getTime(); + textArea.insert(date.toString(), textArea.getCaretPosition()); + } + else if(e.getSource()==item_autoEnter) { + textArea.setLineWrap(true); + } + //实现状态栏功能 + else if(e.getSource()==item_status) { + if (item_status.isSelected()) { + endPanel.setVisible(true); + } + else { + endPanel.setVisible(false); + } + } + + //实现帮助功能 + else if(e.getSource()==item_help) { + Help(); + } + //实现关于记事本功能 + else if(e.getSource()==item_about) { + JOptionPane.showMessageDialog(this, "简易记事本\n作者:huangyingchun\n版本:version 1.0", "关于记事本", JOptionPane.CLOSED_OPTION); + } + } + //新建 + public void create() { + new Notepad(); + } + //打开 + public void open() { + if(isSaved) { + openTo(); + } + else { + int a=JOptionPane.showConfirmDialog(null, "还没有保存,是否保存", "提示", JOptionPane.YES_NO_CANCEL_OPTION); + if(a==0) { + labelTips.setText("保存文件"); + save(); + } + else if(a==2||a==-1) { + labelTips.setText("您还没选中任何文件"); + } + else + openTo(); + } + } + + public void openTo() { + filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + filechooser.setDialogTitle("打开"); + if(filechooser.showOpenDialog(this)==JFileChooser.APPROVE_OPTION) { + file=filechooser.getSelectedFile(); + try { + BufferedReader bufferreader=new BufferedReader(new InputStreamReader(new FileInputStream(file))); + String line=null; + textArea.setText(""); + while((line=bufferreader.readLine())!=null) { + textArea.append(line); + textArea.append(System.getProperty("line.separator")); + } + labelTips.setText("打开文件:"+file.getName()); + this.setTitle(file.toString()+"记事本"); + } + catch(IOException e) {} + } + } + //保存 + public void save(){ + if (file == null) { + filechooser.setDialogTitle("保存文件"); + if (filechooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { + file = filechooser.getSelectedFile(); + } else { + labelTips.setText("取消了保存操作"); + return; + } + } + String str = file.getAbsolutePath(); + if (!str.toLowerCase().endsWith(".txt")) { + str = str + ".txt"; + file = new File(str); + } + try (BufferedOutputStream outputstream = new BufferedOutputStream(new FileOutputStream(file))) { + byte[] b = textArea.getText().getBytes(); + outputstream.write(b); + isSaved = true; + labelTips.setText("文件已保存"); + this.setTitle(file.getName() + "记事本"); + } catch (IOException e) {} + } + //另存为 + public void saveas() { + filechooser.setDialogTitle("保存文件到"); + if(filechooser.showSaveDialog(this)==JFileChooser.APPROVE_OPTION) { + file=filechooser.getSelectedFile(); + } + else { + labelTips.setText("取消保存"); + return; + } + String str = file.getAbsolutePath(); + if (!str.toLowerCase().endsWith(".txt")) { + str = str + ".txt"; + file = new File(str); + } + try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file))) { + byte[] bytes = textArea.getText().getBytes(); + out.write(bytes); + isSaved = true; + labelTips.setText("文件已保存"); + } catch (IOException e) { + labelTips.setText("文件保存失败"); + } + } + //帮助 + public void Help() { + JOptionPane.showMessageDialog(this, "基于Java编写的一个简易的记事本程序", "帮助", JOptionPane.CLOSED_OPTION); + } + +} + + + + diff --git a/src/java2020spring/Test.java b/src/java2020spring/Test.java index fc09c195f566d0e707f5e8a2f05fd168069c73a7..f446b297f4934f97f8c2caebd0f2e097ce812741 100644 --- a/src/java2020spring/Test.java +++ b/src/java2020spring/Test.java @@ -1,10 +1,13 @@ package java2020spring; +import java.awt.Color; + public class Test { public static void main(String[] args) { - System.out.println("Hello world!"); - + Notepad note=new Notepad("简易记事本"); + note.setBounds(100, 100, 800, 600); + note.setBackground(Color.CYAN); } }