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 }