diff --git a/src/javademo/AboutTextEditor.java b/src/javademo/AboutTextEditor.java new file mode 100644 index 0000000000000000000000000000000000000000..ab30547cc4156706d8d4dc71fd160db4c7532606 --- /dev/null +++ b/src/javademo/AboutTextEditor.java @@ -0,0 +1,22 @@ +package javademo; +import javax.swing.*; +public class AboutTextEditor extends JFrame{ + /** + * + */ + private static final long serialVersionUID = 4736295741120264846L; + + public AboutTextEditor(){ + super.setTitle("关于记事本"); + this.setVisible(true); + this.setSize(400, 200); + this.setLocation(200,300); + this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + JPanel panel = new JPanel(); + JLabel label1 = new JLabel("简单文本编辑器 scau202025710308"); + JLabel label2 = new JLabel("一些方法学习参考于网络,不足请提出:1500912092@qq.com"); + this.add(panel); + panel.add(label1); + panel.add(label2); + } +} diff --git a/src/javademo/EditorWindow.java b/src/javademo/EditorWindow.java new file mode 100644 index 0000000000000000000000000000000000000000..bbdcdc1f25ff50ca753a155ae48d2f7df14ba4a0 --- /dev/null +++ b/src/javademo/EditorWindow.java @@ -0,0 +1,444 @@ +package javademo; +import javax.swing.*; +import javax.swing.event.*; +import javax.swing.text.JTextComponent; +import javax.swing.undo.*; +import java.awt.*; +import java.awt.event.*; +import java.io.*; +import java.text.*; +import java.util.*; +public class EditorWindow extends JFrame implements ActionListener{ + /** + * + */ + private static final long serialVersionUID = 2368117138424502007L; + JMenuBar menuBar; + JTextArea textArea; + FileReader fileReader; + FileWriter fileWriter; + JMenuItem itemF1,itemF2,itemF3,itemF4,itemF5,itemE1,itemE2,itemE3,itemE4,itemE5,itemE6,itemE7, + item1,item2,item3,item4,item5,item6,item7,itemO2,itemH1,itemH2,itemV2; + JCheckBoxMenuItem itemO1,itemV1; + JLabel label1,label2,label3; + JToolBar toolBar; + String oldText=""; + boolean isNewFile=true; + File currentFile; + int line = 1; + int column = 1; + JFileChooser fileDialog=new JFileChooser(); + UndoManager undomg=new UndoManager(); + EditorWindow() { + init(); + } + void init(){ + //设置文本编辑区的布局 + menuBar=new JMenuBar(); + textArea=new JTextArea(); + JScrollPane scroll=new JScrollPane(textArea); + toolBar = new JToolBar(); + this.add(toolBar,BorderLayout.SOUTH); + this.add(menuBar,BorderLayout.NORTH); + this.add(scroll,BorderLayout.CENTER); + textArea.getDocument().addUndoableEditListener(undomg); + //菜单及其快捷键 + JMenu menu1=new JMenu("文件(F)"); + JMenu menu2=new JMenu("编辑(E)"); + JMenu menu3=new JMenu("格式(O)"); + JMenu menu4=new JMenu("查看(V)"); + JMenu menu5=new JMenu("帮助(H)"); + menuBar.add(menu1); + menuBar.add(menu2); + menuBar.add(menu3); + menuBar.add(menu4); + menuBar.add(menu5); + menu1.setMnemonic('F'); + menu2.setMnemonic('E'); + menu3.setMnemonic('O'); + menu4.setMnemonic('V'); + menu5.setMnemonic('H'); + //菜单‘文件’内菜单项及其快捷键,并注册事件监听器 + itemF1=new JMenuItem("新建(N)"); + itemF2=new JMenuItem("打开(O)"); + itemF3=new JMenuItem("保存(S)"); + itemF4=new JMenuItem("另存为(C)"); + itemF5=new JMenuItem("退出(X)"); + itemF1.addActionListener(this); + itemF2.addActionListener(this); + itemF3.addActionListener(this); + itemF4.addActionListener(this); + itemF5.addActionListener(this); + itemF1.setAccelerator(KeyStroke.getKeyStroke("control N")); + itemF2.setAccelerator(KeyStroke.getKeyStroke("control O")); + itemF3.setAccelerator(KeyStroke.getKeyStroke("control S")); + itemF4.setAccelerator(KeyStroke.getKeyStroke("control shift S")); + itemF1.setMnemonic('N'); + itemF2.setMnemonic('O'); + itemF2.setMnemonic('S'); + itemF2.setMnemonic('C'); + itemF5.setMnemonic('X'); + menu1.add(itemF1); + menu1.add(itemF2); + menu1.add(itemF3); + menu1.add(itemF4); + menu1.addSeparator(); + menu1.add(itemF5); + //菜单‘编辑’内菜单项及其快捷键,并注册事件监听器 + itemE1=new JMenuItem("撤销(U)"); + itemE2=new JMenuItem("剪切(T)"); + itemE3=new JMenuItem("复制(C)"); + itemE4=new JMenuItem("粘贴(P)"); + itemE5=new JMenuItem("删除(Del)"); + itemE6=new JMenuItem("全选(A)"); + itemE7=new JMenuItem("时间/日期(D)"); + itemE1.addActionListener(this); + itemE2.addActionListener(this); + itemE3.addActionListener(this); + itemE4.addActionListener(this); + itemE5.addActionListener(this); + itemE6.addActionListener(this); + itemE7.addActionListener(this); + itemE1.setAccelerator(KeyStroke.getKeyStroke("control Z")); + itemE2.setAccelerator(KeyStroke.getKeyStroke("control X")); + itemE3.setAccelerator(KeyStroke.getKeyStroke("control C")); + itemE4.setAccelerator(KeyStroke.getKeyStroke("control V")); + itemE5.setAccelerator(KeyStroke.getKeyStroke("Del")); + itemE6.setAccelerator(KeyStroke.getKeyStroke("control A")); + itemE7.setAccelerator(KeyStroke.getKeyStroke("F5")); + itemE1.setMnemonic('U'); + itemE2.setMnemonic('T'); + itemE3.setMnemonic('C'); + itemE4.setMnemonic('P'); + itemE6.setMnemonic('A'); + itemE7.setMnemonic('D'); + menu2.add(itemE1); + menu2.addSeparator(); + menu2.add(itemE2); + menu2.add(itemE3); + menu2.add(itemE4); + menu2.add(itemE5); + menu2.addSeparator(); + menu2.add(itemE6); + menu2.add(itemE7); + //菜单‘格式’内菜单项及其快捷键,并注册事件监听器 + itemO1=new JCheckBoxMenuItem("自动换行(W)"); + itemO2=new JMenuItem("字体(F)"); + itemO1.addActionListener(this); + itemO2.addActionListener(this); + itemO1.setMnemonic('W'); + itemO2.setMnemonic('F'); + menu3.add(itemO1); + menu3.add(itemO2); + //菜单‘查看’内菜单项及其快捷键,并注册事件监听器 + itemV1=new JCheckBoxMenuItem("状态栏(S)",true); + itemV2=new JMenuItem("统计字数(B)"); + itemV1.addActionListener(this); + itemV2.addActionListener(this); + itemV1.setMnemonic('S'); + itemV2.setMnemonic('B'); + menu4.add(itemV1); + menu4.add(itemV2); + //菜单‘帮助’内菜单项及其快捷键,并注册事件监听器 + itemH1=new JMenuItem("查看帮助(H)"); + itemH2=new JMenuItem("关于记事本(A)"); + itemH1.addActionListener(this); + itemH2.addActionListener(this); + itemH1.setMnemonic('H'); + itemH2.setMnemonic('A'); + menu5.add(itemH1); + menu5.addSeparator(); + menu5.add(itemH2); + + //状态栏功能 + label1 = new JLabel("状态栏"); + label2 = new JLabel("第 " + line + " 行, 第 " + column+" 列 "); + toolBar.add(label1); + toolBar.add(label2); + textArea.addCaretListener(new CaretListener() { + public void caretUpdate(CaretEvent e) { + try { + int caretPositon = ((JTextComponent) e.getSource()).getCaretPosition(); + line = ((JTextArea) e.getSource()).getLineOfOffset(caretPositon); + column = caretPositon - textArea.getLineStartOffset(line); + line += 1; + label2.setText("第 " + line + " 行,第 " + (column+1)+" 列  "); + } + catch(Exception ee) {} + } + }); + + //右键弹出菜单 + JPopupMenu popup=new JPopupMenu(); + item1=new JMenuItem("撤销(U)"); + item2=new JMenuItem("剪切(T)"); + item3=new JMenuItem("复制(C)"); + item4=new JMenuItem("粘贴(P)"); + item5=new JMenuItem("删除(Del)"); + item6=new JMenuItem("全选(A)"); + item7=new JMenuItem("时间/日期(D)"); + item1.addActionListener(this); + item2.addActionListener(this); + item3.addActionListener(this); + item4.addActionListener(this); + item5.addActionListener(this); + item6.addActionListener(this); + item7.addActionListener(this); + popup.add(item1); + popup.addSeparator(); + popup.add(item2); + popup.add(item3); + popup.add(item4); + popup.add(item5); + popup.addSeparator(); + popup.add(item6); + popup.add(item7); + item1.setMnemonic('U'); + item2.setMnemonic('T'); + item3.setMnemonic('C'); + item4.setMnemonic('P'); + item6.setMnemonic('A'); + item7.setMnemonic('D'); + item1.setAccelerator(KeyStroke.getKeyStroke("control Z")); + item2.setAccelerator(KeyStroke.getKeyStroke("control X")); + item3.setAccelerator(KeyStroke.getKeyStroke("control C")); + item4.setAccelerator(KeyStroke.getKeyStroke("control V")); + item5.setAccelerator(KeyStroke.getKeyStroke("Del")); + textArea.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if(e.getButton()==MouseEvent.BUTTON3) { + popup.show(e.getComponent(), e.getX(),e.getY()); + } + } + }); + } + + + public void actionPerformed(ActionEvent e){ + //新建功能 + if(e.getSource()==itemF1){ + String currentText=textArea.getText(); + boolean isTextChange=(currentText.equals(oldText))?false:true; + if(isTextChange) { + int choose=JOptionPane.showConfirmDialog(this, "文件尚未保存,是否保存","提示", JOptionPane.YES_NO_CANCEL_OPTION); + if(choose==JOptionPane.YES_OPTION){ + save(); + } + else if(choose==JOptionPane.NO_OPTION) { + textArea.setText(null); + this.setTitle("无标题 -记事本"); + isNewFile=true; + oldText=textArea.getText(); + } + else if(choose==JOptionPane.CANCEL_OPTION) { + return; + } + } + else { + textArea.setText(null); + this.setTitle("无标题 -记事本"); + isNewFile=true; + oldText=textArea.getText(); + } + } + + //打开功能 + else if(e.getSource()==itemF2){ + String currentText=textArea.getText(); + boolean isTextChange=(currentText.equals(oldText))?false:true; + if(isTextChange) { + int choose=JOptionPane.showConfirmDialog(this, "文件尚未保存,是否保存","提示", JOptionPane.YES_NO_CANCEL_OPTION); + if(choose==JOptionPane.YES_OPTION){ + save(); + } + else if(choose==JOptionPane.NO_OPTION) { + open(); + } + else if(choose==JOptionPane.CANCEL_OPTION) { + return; + } + } + else { + open(); + } + } + + //保存功能 + else if(e.getSource()==itemF3){ + if(isNewFile) { + save(); + } + else { + try{ + FileWriter fw=new FileWriter(currentFile); + BufferedWriter out=new BufferedWriter(fw) ; + out.write(textArea.getText()); + out.flush(); + fw.close(); + oldText=textArea.getText(); + }catch(IOException ee){} + } + } + + //另存为 功能 + else if(e.getSource()==itemF4){ + fileDialog.setDialogTitle("另存为"); + save(); + } + + //退出功能 + else if(e.getSource()==itemF5){ + String currentText=textArea.getText(); + boolean isTextChange=(currentText.equals(oldText))?false:true; + if(isTextChange) { + int choose=JOptionPane.showConfirmDialog(this, "文件尚未保存,是否保存","提示", JOptionPane.YES_NO_CANCEL_OPTION); + if(choose==JOptionPane.YES_OPTION){ + save(); + } + else if(choose==JOptionPane.NO_OPTION) { + System.exit(0); + } + else if(choose==JOptionPane.CANCEL_OPTION) { + return; + } + } + else { + System.exit(0); + } + } + + //撤销功能 + else if(e.getSource()==itemE1||e.getSource()==item1){ + if(undomg.canUndo()) { + undomg.undo(); + } + else { + JOptionPane.showMessageDialog(null, "无法撤销"); + } + } + + //剪切功能 + else if(e.getSource()==itemE2||e.getSource()==item2) { + textArea.cut(); + } + + //复制功能 + else if(e.getSource()==itemE3||e.getSource()==item3) { + textArea.copy(); + } + + //粘贴功能 + else if(e.getSource()==itemE4||e.getSource()==item4) { + textArea.paste(); + } + + //删除功能 + else if(e.getSource()==itemE5||e.getSource()==item5) { + StringBuffer tempString = new StringBuffer (textArea.getText()); + int start = textArea.getSelectionStart(); + int len = textArea.getSelectedText().length(); + tempString.delete(start, start+len); + textArea.setText(tempString.toString()); + } + + //全选功能 + else if(e.getSource()==itemE6||e.getSource()==item6) { + textArea.selectAll(); + } + + //时间/日期功能 + else if(e.getSource()==itemE7||e.getSource()==item7) { + Date date=new Date(); + SimpleDateFormat currentDateTime=new SimpleDateFormat("HH:mm yyyy-MM-dd"); + textArea.insert(currentDateTime.format(date),textArea.getCaretPosition()); + } + + //自动换行功能 + else if(e.getSource()==itemO1) { + if(itemO1.isSelected()) + textArea.setLineWrap(true); + else + textArea.setLineWrap(false); + } + + //字体功能 + else if(e.getSource()==itemO2) { + new SetFont(EditorWindow.this, textArea); + } + + //设置状态栏是否可见 + else if(e.getSource()==itemV1) { + if(itemV1.isSelected()) + toolBar.setVisible(true); + else + toolBar.setVisible(false); + } + + //统计字数功能 + else if(e.getSource()==itemV2) { + String line=textArea.getText(); + JOptionPane.showMessageDialog(null, "字符数:"+line.length(),"统计字数",JOptionPane.PLAIN_MESSAGE); + } + + //查看帮助功能 + else if(e.getSource()==itemH1) { + new LookHelp(); + } + + //关于记事本功能 + else if(e.getSource()==itemH2) { + new AboutTextEditor(); + } + + } + + //save方法和open方法 + void save() { + int state=fileDialog.showSaveDialog(this); + if(state==JFileChooser.APPROVE_OPTION){ + try{ + File dir=fileDialog.getCurrentDirectory(); + String name=fileDialog.getSelectedFile().getName(); + File file=new File(dir,name); + fileWriter=new FileWriter(file); + BufferedWriter out; + out=new BufferedWriter(fileWriter) ; + out.write(textArea.getText()); + out.close(); + fileWriter.close(); + isNewFile=false; + oldText=textArea.getText(); + currentFile= fileDialog.getSelectedFile(); + this.setTitle(name); + }catch(IOException exp){} + } + } + + void open() { + int state=fileDialog.showOpenDialog(this); + if(state==JFileChooser.APPROVE_OPTION){ + textArea.setText(null); + try{ + File dir=fileDialog.getCurrentDirectory(); + String name=fileDialog.getSelectedFile().getName(); + File file=new File(dir,name); + fileReader=new FileReader(file); + BufferedReader in=new BufferedReader(fileReader); + String s=null; + while((s=in.readLine())!=null){ + textArea.append(s+"\n"); + } + in.close(); + fileReader.close(); + isNewFile=false; + oldText=textArea.getText(); + currentFile=fileDialog.getSelectedFile(); + this.setTitle(name); + }catch(IOException exp){} + } + } +} + + + diff --git a/src/javademo/LookHelp.java b/src/javademo/LookHelp.java new file mode 100644 index 0000000000000000000000000000000000000000..8db0b1104ed50de5a459ffb15d89487cb44df657 --- /dev/null +++ b/src/javademo/LookHelp.java @@ -0,0 +1,29 @@ +package javademo; +import javax.swing.*; +import java.awt.*; +public class LookHelp extends JFrame{ + /** + * + */ + private static final long serialVersionUID = 2638641194782942490L; + + public LookHelp() { + super.setTitle("查看帮助"); + this.setVisible(true); + this.setSize(500, 300); + this.setLocation(200,300); + this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + JLabel label1 = new JLabel("1、点击菜单、菜单项可选择功能"); + JLabel label2 = new JLabel("2、菜单快捷键为Alt+括号内字母"); + JLabel label3 = new JLabel("3、菜单项快捷键为菜单项后蓝色提示"); + JLabel label4 = new JLabel("4、右键弹出编辑菜单"); + JLabel label5 = new JLabel("5、格式可设置是否自动换行和设置字体"); + JPanel panel = new JPanel(new GridLayout(5,1)); + this.add(panel); + panel.add(label1); + panel.add(label2); + panel.add(label3); + panel.add(label4); + panel.add(label5); + } +} diff --git a/src/javademo/MainClass.java b/src/javademo/MainClass.java new file mode 100644 index 0000000000000000000000000000000000000000..f87b0aafc60d1420be39cd51f4134e03fb8abcfb --- /dev/null +++ b/src/javademo/MainClass.java @@ -0,0 +1,12 @@ +package javademo; +import javax.swing.JFrame; +public class MainClass { + public static void main(String[] args) { + EditorWindow win=new EditorWindow(); + win.setTitle("文本编辑器"); + win.setVisible(true); + win.setSize(500,500); + win.setLocation(30,30); + win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } +} diff --git a/src/javademo/SetFont.java b/src/javademo/SetFont.java new file mode 100644 index 0000000000000000000000000000000000000000..6bd5037ac47fa2b99db7b4e0cac5d2218798c9d7 --- /dev/null +++ b/src/javademo/SetFont.java @@ -0,0 +1,126 @@ +package javademo; +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +public class SetFont extends JDialog{ + /** + * + */ + private static final long serialVersionUID = 6532360107996711727L; + + public SetFont(JFrame frame,JTextArea textArea) { + JPanel panel=new JPanel(); + JLabel fonts=new JLabel("字体:"); + JLabel style=new JLabel("字形:"); + JLabel size=new JLabel("大小:"); + JButton yes=new JButton("确定"); + JButton cancel=new JButton("取消"); + JLabel example=new JLabel("示例:AaBbCc"); + JButton colorButton=new JButton("字体颜色"); + this.setTitle("字体"); + this.setSize(500,370); + this.setContentPane(panel); + this.setVisible(true); + this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + this.setResizable(false); + //获取系统字体库 + GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment(); + String[] fontNames = e.getAvailableFontFamilyNames(); + String[] fontStyle=new String[]{"常规","粗体","斜体","粗斜体"}; + Integer[] fontSize=new Integer[] {8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72}; + final JComboBox comboBox1 = new JComboBox(fontNames); + final JComboBox comboBox2=new JComboBox(fontStyle); + final JComboBox comboBox3=new JComboBox(fontSize); + //设置对话框布局 + panel.setLayout(null); + panel.add(fonts); + panel.add(style); + panel.add(size); + panel.add(yes); + panel.add(cancel); + panel.add(example); + panel.add(colorButton); + panel.add(comboBox1); + panel.add(comboBox2); + panel.add(comboBox3); + fonts.setBounds(20,20,45,18); + style.setBounds(190,20,45,18); + size.setBounds(310,20,45,18); + comboBox1.setBounds(20,45,160,22); + comboBox2.setBounds(190,45,110,22); + comboBox3.setBounds(310, 45, 110, 22); + example.setBounds(50,90,380,140); + colorButton.setBounds(20,250,85,30); + yes.setBounds(300,250,60,30); + cancel.setBounds(365,250,60,30); + + comboBox1.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.SELECTED) { + example.setFont(new Font((String) comboBox1.getSelectedItem(), + example.getFont().getStyle(), example.getFont().getSize())); + } + } + }); + + comboBox2.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + if(e.getStateChange()==ItemEvent.SELECTED) { + if(comboBox2.getSelectedItem().equals("常规")) { + example.setFont(new Font(example.getFont().getName(), Font.PLAIN, + example.getFont().getSize())); + } + else if(comboBox2.getSelectedItem().equals("粗体")){ + example.setFont(new Font(example.getFont().getName(), Font.BOLD, + example.getFont().getSize())); + } + else if(comboBox2.getSelectedItem().equals("斜体")){ + example.setFont(new Font(example.getFont().getName(), Font.ITALIC, + example.getFont().getSize())); + } + else if(comboBox2.getSelectedItem().equals("粗偏斜体")) { + example.setFont(new Font(example.getFont().getName(), Font.BOLD+ Font.ITALIC, + example.getFont().getSize())); + } + } + } + }); + + comboBox3.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + if(e.getStateChange()==ItemEvent.SELECTED) { + example.setFont(new Font(example.getFont().getName(),example.getFont().getStyle(), + (int) comboBox3.getSelectedItem())); + + } + } + }); + + colorButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Color color = JColorChooser.showDialog(null, "设置字体颜色", null); + if (color==null) { + return; + } + example.setForeground(color); + textArea.setForeground(color); + } + }); + + yes.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + textArea.setFont(example.getFont()); + SetFont.this.setVisible(false); + } + }); + + cancel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + SetFont.this.setVisible(false); + } + }); + + } +}