Java简易记事本
Java作业,写一个简易记事本。
要求:
使用swing编写一个记事本程序。可以打开现有文本文件进行编辑,也可以新建文件进行编辑。新建、打开和保存文件使用菜单实现。如果是新建的文件或者对已有修改过但没有保存,程序将使用对话框提示用户,用户可以选择重新保存或者放弃保存直接退出。(提示,使用JFileChooser类获得打开文件名或者保存文件名,详见API帮助文档)。
这里记录一下步骤。
【1】实现文本区域的现实
1 package bao; 2 3 import java.awt.BorderLayout; 4 import java.awt.Container; 5 import javax.swing.JFrame; 6 import javax.swing.JScrollPane; 7 import javax.swing.JTextArea; 8 import javax.swing.ScrollPaneConstants; 9 10 @SuppressWarnings("serial") 11 public class J_Line extends JFrame{ 12 public J_Line(){ 13 super("NewFile"); 14 setUpUIComponent();//添加各个组件 15 setUpEventListener();//添加事件监听器 16 setVisible(true);//窗口可见 17 } 18 private void setUpUIComponent(){ 19 setSize(640,480);//设定窗口大小 20 JTextArea textArea=new JTextArea(); 21 textArea.setLineWrap(true);//换行 22 23 JScrollPane panel = new JScrollPane(textArea, 24 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 25 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);//只有垂直方向滚动条 26 Container contentPane=getContentPane(); 27 contentPane.add(panel, BorderLayout.CENTER); 28 29 } 30 private void setUpEventListener(){ 31 //add sth about event listener... 32 } 33 public static void main(String[] args){ 34 J_Line app=new J_Line(); 35 app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 36 } 37 }
textarea已经显示出来了。
【2】显示菜单栏
这里实现了打开和关闭的菜单操作。
1 package bao; 2 3 import java.awt.BorderLayout; 4 import java.awt.Container; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ActionListener; 7 import java.io.BufferedReader; 8 import java.io.FileReader; 9 import java.io.IOException; 10 import javax.swing.JFileChooser; 11 import javax.swing.JFrame; 12 import javax.swing.JMenu; 13 import javax.swing.JMenuBar; 14 import javax.swing.JMenuItem; 15 import javax.swing.JOptionPane; 16 import javax.swing.JScrollPane; 17 import javax.swing.JTextArea; 18 import javax.swing.ScrollPaneConstants; 19 20 @SuppressWarnings("serial") 21 public class J_Line extends JFrame{ 22 JTextArea textArea; 23 private JMenuItem menuNewfile; 24 private JMenuItem menuOpen; 25 private JMenuItem menuClose; 26 private JFileChooser fileChooser; 27 public J_Line(){ 28 super("NewFile"); 29 setUpUIComponent();//添加各个组件 30 setUpEventListener();//添加事件监听器 31 setVisible(true);//窗口可见 32 } 33 private void setUpUIComponent(){ 34 setSize(640,480);//设定窗口大小 35 36 //text area 37 textArea=new JTextArea(); 38 textArea.setLineWrap(true);//换行 39 40 JScrollPane panel = new JScrollPane(textArea, 41 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 42 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);//只有垂直方向滚动条 43 Container contentPane=getContentPane(); 44 contentPane.add(panel, BorderLayout.CENTER); 45 46 //menu bar 47 JMenuBar menuBar = new JMenuBar(); 48 49 JMenu fileMenu = new JMenu("文件"); 50 51 menuNewfile = new JMenuItem("新建"); 52 menuOpen = new JMenuItem("打开"); 53 menuClose = new JMenuItem("关闭"); 54 55 56 fileMenu.add(menuNewfile); 57 fileMenu.addSeparator(); // 分隔线 58 fileMenu.add(menuOpen); 59 fileMenu.addSeparator(); // 分隔线 60 fileMenu.add(menuClose); 61 62 menuBar.add(fileMenu); 63 64 setJMenuBar(menuBar); 65 66 fileChooser=new JFileChooser();//!!!!!!!!!! 67 } 68 69 private void setUpEventListener(){ 70 //打开 71 menuOpen.addActionListener( 72 new ActionListener() { 73 public void actionPerformed(ActionEvent e) { 74 // openFile(); 75 open(); 76 } 77 } 78 ); 79 80 menuClose.addActionListener( 81 new ActionListener(){ 82 public void actionPerformed(ActionEvent e){ 83 dispose(); 84 } 85 } 86 ); 87 } 88 89 private void open() { 90 fileChooser.setDialogTitle("Open file"); 91 fileChooser.showDialog(null, null); 92 93 try { 94 // 开启选取的文件 95 BufferedReader buf = 96 new BufferedReader( 97 new FileReader( 98 fileChooser.getSelectedFile())); 99 100 // 设定文件标题 101 setTitle(fileChooser.getSelectedFile().toString()); 102 // 清除前一次文件 103 textArea.setText(""); 104 // 设定状态栏 105 // stateBar.setText("未修改"); 106 // 取得系统相依的换行字符 107 String lineSeparator = System.getProperty("line.separator"); 108 // 读取文件并附加至文字编辑区 109 String text; 110 while((text = buf.readLine()) != null) { 111 textArea.append(text); 112 textArea.append(lineSeparator); 113 } 114 115 buf.close(); 116 } 117 catch(IOException e) { 118 JOptionPane.showMessageDialog(null, e.toString(), 119 "开启文件失败", JOptionPane.ERROR_MESSAGE); 120 } 121 } 122 123 public static void main(String[] args){ 124 J_Line app=new J_Line(); 125 app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 126 } 127 }
用清除文本区域内容的方式实现了新建。。。
1 package bao; 2 3 import java.awt.BorderLayout; 4 import java.awt.Container; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ActionListener; 7 import java.awt.event.KeyAdapter; 8 import java.awt.event.KeyEvent; 9 import java.awt.event.WindowAdapter; 10 import java.awt.event.WindowEvent; 11 import java.io.BufferedReader; 12 import java.io.BufferedWriter; 13 import java.io.File; 14 import java.io.FileReader; 15 import java.io.FileWriter; 16 import java.io.IOException; 17 import javax.swing.BorderFactory; 18 import javax.swing.JFileChooser; 19 import javax.swing.JFrame; 20 import javax.swing.JLabel; 21 import javax.swing.JMenu; 22 import javax.swing.JMenuBar; 23 import javax.swing.JMenuItem; 24 import javax.swing.JOptionPane; 25 import javax.swing.JScrollPane; 26 import javax.swing.JTextArea; 27 import javax.swing.ScrollPaneConstants; 28 import javax.swing.SwingConstants; 29 30 @SuppressWarnings("serial") 31 public class J_Line extends JFrame{ 32 JTextArea textArea; 33 private JMenuItem menuNewfile; 34 private JMenuItem menuOpen; 35 private JMenuItem menuSave; 36 private JMenuItem menuClose; 37 private JFileChooser fileChooser; 38 private JLabel stateBar; 39 40 public J_Line(){ 41 super("NewFile"); 42 setUpUIComponent();//添加各个组件 43 setUpEventListener();//添加事件监听器 44 setVisible(true);//窗口可见 45 } 46 private void setUpUIComponent(){ 47 setSize(640,480);//设定窗口大小 48 49 //文本区域 50 textArea=new JTextArea(); 51 textArea.setLineWrap(true);//换行 52 53 JScrollPane panel = new JScrollPane(textArea, 54 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 55 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);//只有垂直方向滚动条 56 Container contentPane=getContentPane(); 57 contentPane.add(panel, BorderLayout.CENTER); 58 59 //菜单栏 60 JMenuBar menuBar = new JMenuBar(); 61 62 JMenu fileMenu = new JMenu("文件"); 63 64 menuNewfile = new JMenuItem("新建"); 65 menuOpen = new JMenuItem("打开"); 66 menuSave = new JMenuItem("保存"); 67 menuClose = new JMenuItem("关闭"); 68 69 70 fileMenu.add(menuNewfile); 71 fileMenu.addSeparator(); // 分隔线 72 fileMenu.add(menuOpen); 73 fileMenu.addSeparator(); // 分隔线 74 fileMenu.add(menuSave); 75 fileMenu.addSeparator();// 分隔线 76 fileMenu.add(menuClose); 77 78 menuBar.add(fileMenu); 79 80 setJMenuBar(menuBar); 81 82 fileChooser=new JFileChooser();//!!!!!!!!!! 83 84 // 状态栏 85 stateBar = new JLabel("未修改"); 86 stateBar.setHorizontalAlignment(SwingConstants.LEFT); 87 stateBar.setBorder( 88 BorderFactory.createEtchedBorder()); 89 contentPane.add(stateBar, BorderLayout.SOUTH); 90 91 fileChooser = new JFileChooser(); 92 } 93 94 private void setUpEventListener(){ 95 //X关闭 96 addWindowListener( 97 new WindowAdapter() { 98 public void windowClosing(WindowEvent e) { 99 closeFile(); 100 } 101 } 102 ); 103 //新建 104 menuNewfile.addActionListener( 105 new ActionListener(){ 106 public void actionPerformed(ActionEvent e){ 107 newFile(); 108 } 109 } 110 ); 111 //打开 112 menuOpen.addActionListener( 113 new ActionListener() { 114 public void actionPerformed(ActionEvent e) { 115 // openFile(); 116 openFile(); 117 } 118 } 119 ); 120 //保存 121 menuSave.addActionListener( 122 new ActionListener() { 123 public void actionPerformed(ActionEvent e) { 124 saveFile(); 125 } 126 } 127 ); 128 //关闭 129 menuClose.addActionListener( 130 new ActionListener() { 131 public void actionPerformed(ActionEvent e) { 132 closeFile(); 133 } 134 } 135 ); 136 //状态 137 textArea.addKeyListener( 138 new KeyAdapter() { 139 public void keyTyped(KeyEvent e) { 140 processTextArea(); 141 } 142 } 143 ); 144 } 145 146 private void open() { 147 fileChooser.setDialogTitle("Open file"); 148 int option=fileChooser.showDialog(null, null); 149 // 使用者按下确认键 150 if(option == JFileChooser.APPROVE_OPTION) { 151 try { 152 // 开启选取的文件 153 BufferedReader buf = 154 new BufferedReader( 155 new FileReader( 156 fileChooser.getSelectedFile())); 157 158 // 设定文件标题 159 setTitle(fileChooser.getSelectedFile().toString()); 160 // 清除前一次文件 161 clearTextArea(); 162 // 设定状态栏 163 // stateBar.setText("未修改"); 164 // 取得系统相依的换行字符 165 String lineSeparator = System.getProperty("line.separator"); 166 // 读取文件并附加至文字编辑区 167 String text; 168 while((text = buf.readLine()) != null) { 169 textArea.append(text); 170 textArea.append(lineSeparator); 171 } 172 173 buf.close(); 174 } 175 catch(IOException e) { 176 JOptionPane.showMessageDialog(null, e.toString(), 177 "开启文件失败", JOptionPane.ERROR_MESSAGE); 178 } 179 } 180 } 181 private boolean isCurrentFileSaved() { 182 if(!stateBar.getText().equals("未修改")) { 183 return false; 184 } 185 else { 186 return true; 187 } 188 } 189 private void saveFile() { 190 // 从标题栏取得文件名称 191 File file = new File(getTitle()); 192 193 // 若指定的文件不存在 194 if(!file.exists()) { 195 // 执行另存为 196 saveFileAs(); 197 } 198 else { 199 try { 200 // 开启指定的文件 201 BufferedWriter buf = 202 new BufferedWriter( 203 new FileWriter(file)); 204 // 将文字编辑区的文字写入文件 205 buf.write(textArea.getText()); 206 buf.close(); 207 // 设定状态栏为未修改 208 stateBar.setText("未修改"); 209 } 210 catch(IOException e) { 211 JOptionPane.showMessageDialog(null, e.toString(), 212 "写入文件失败", JOptionPane.ERROR_MESSAGE); 213 } 214 } 215 } 216 217 private void saveFileAs() { 218 // 显示文件对话框 219 int option = fileChooser.showSaveDialog(null); 220 221 // 如果确认选取文件 222 if(option == JFileChooser.APPROVE_OPTION) { 223 // 取得选择的文件 224 File file = fileChooser.getSelectedFile(); 225 226 // 在标题栏上设定文件名称 227 setTitle(file.toString()); 228 229 try { 230 // 建立文件 231 file.createNewFile(); 232 // 进行文件保存 233 saveFile(); 234 } 235 catch(IOException e) { 236 JOptionPane.showMessageDialog(null, e.toString(), 237 "无法建立新文件", JOptionPane.ERROR_MESSAGE); 238 } 239 } 240 } 241 private void closeFile() { 242 // 是否已保存文件 243 if(isCurrentFileSaved()) { 244 // 释放窗口资源,而后关闭程序 245 dispose(); 246 } 247 else { 248 int option = JOptionPane.showConfirmDialog( 249 null, "文件已修改,是否保存?", 250 "保存文件?", JOptionPane.YES_NO_OPTION, 251 JOptionPane.WARNING_MESSAGE, null); 252 253 switch(option) { 254 case JOptionPane.YES_OPTION: 255 saveFile(); 256 break; 257 case JOptionPane.NO_OPTION: 258 dispose(); 259 } 260 } 261 } 262 private void processTextArea() { 263 stateBar.setText("已修改"); 264 } 265 private void openFile() { 266 if(isCurrentFileSaved()) { // 文件是否为保存状态 267 open(); // 打开 268 } 269 else { 270 // 显示对话框 271 int option = JOptionPane.showConfirmDialog( 272 null, "文件已修改,是否保存?", 273 "保存文件?", JOptionPane.YES_NO_OPTION, 274 JOptionPane.WARNING_MESSAGE, null); 275 switch(option) { 276 // 确认文件保存 277 case JOptionPane.YES_OPTION: 278 saveFile(); // 保存文件 279 break; 280 // 放弃文件保存 281 case JOptionPane.NO_OPTION: 282 open(); 283 break; 284 } 285 } 286 } 287 private void clearTextArea(){ 288 textArea.selectAll(); 289 textArea.replaceSelection(""); 290 stateBar.setText("未修改"); 291 } 292 private void newFile(){ 293 if(isCurrentFileSaved()) { // 文件是否为保存状态 294 open(); // 打开 295 }else { 296 // 显示对话框 297 int option = JOptionPane.showConfirmDialog( 298 null, "文件已修改,是否保存?", 299 "保存文件?", JOptionPane.YES_NO_OPTION, 300 JOptionPane.WARNING_MESSAGE, null); 301 switch(option) { 302 // 确认文件保存 303 case JOptionPane.YES_OPTION: 304 saveFile(); // 保存文件 305 break; 306 // 放弃文件保存 307 case JOptionPane.NO_OPTION: 308 break; 309 } 310 clearTextArea(); 311 } 312 } 313 public static void main(String[] args){ 314 J_Line app=new J_Line(); 315 app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 316 } 317 }
Greatness is never a given, it must be earned.