第七次作业解析——日志文件程序

Theodosia ·
更新时间:2024-09-20
· 933 次阅读

题目及解析

仿照讲义上的TextIO类,设计一个日志文件程序,每天在图形式的GUI界面上添加当天的Java学习笔记,注意不要改写,而是不断追加内容写入同一个文本文件中。有余力的同学,可以设计日志格式,添加日期或时间戳,以及完成的代码行数等。

这次作业其实不难吧,要点如我所涂画的部分,我认为就是让我们实践一下IO流怎么用吧,既然都说了是仿照了,那么完全可以直接copy老师的代码参考着讲义上的代码来写嘛。

我的设计

我的设计
基本样式如上图。对于日志格式方面我认为应该有标题,作者,时间戳,标题和作者通过使用者自己输入,时间戳通过调用java.sql.Date和java.text.SimpleDateFormat获取及显示。最上面的File Source用来获取存储日志的文件,下面两个按钮可以理解为用来刷新对应界面的。GUI界面的结构如下:

myJournal(JFrame) basicData(JPanel) fileSource(JLabel) fileSourceIn(JTextField) title(JLabel) titleIn(JTextField) author(JLabel) authorIn(JTextField) read(JButton) write(JButton) display(JLabel) journal(JLabel) IOPanel(JPanel) displaySP(JScrollPane) displayArea(JTextArea) journalSP(JScrollPane) journalIn(JTextArea) 需要用到的小知识 在IDEA中可以通过ctrl+左键进入(跳转)到想要了解类或方法中。 在IDEA中可以通过CTRL+ALT+T快速添加try/catch 在IDEA中可以通过ALT+INSERT重构(override)代码 在IDEA中可以通过ALT+7查看某个类的结构 使JLabel居中:JLabel display=new JLabel("Display:",SwingConstants.CENTER);左边的参数就不解释了,右边的参数可以通过快捷键ctrl+左键进行查看,也可以改成SwingConstants.LEFT变成右对齐 添加滚动条: JScrollPane displaySP=new JScrollPane( displayArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ),一共三个参数第一个表示需要显示滚动条的视图组件,第二个和第三个分别表示垂直、水平滚动条的显示方式,其中ALWAYS表示总是,NEVER表示绝不,NEEDED表示在需要时显示。 使文本框可以自动换行journalIn.setLineWrap(true); 修改为追加模式FileWriter outStream = new FileWriter (fileName ,true);,第二个参数表示设置追加模式为真。 代码 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.sql.Date; import java.text.SimpleDateFormat; public class myJournal extends JFrame implements ActionListener{ JPanel basicData=new JPanel(),//基本信息面板 IOPanel=new JPanel();//输入输出面板 JTextField authorIn=new JTextField(20),//作者框 titleIn=new JTextField(20),//标题框 fileSourceIn=new JTextField("Journal.txt",20);//文件名框 JTextArea displayArea=new JTextArea(),//输出区 journalIn=new JTextArea();//日志区(输入区) JLabel display=new JLabel("Display:",SwingConstants.CENTER),//输出标签 journal=new JLabel("Journal:",SwingConstants.CENTER),//日志标签 author=new JLabel("Author:",SwingConstants.CENTER),//作者标签 title=new JLabel("Title:",SwingConstants.CENTER),//标题标签 fileSource=new JLabel("File Source:",SwingConstants.CENTER);//文件名标签 JButton read=new JButton("Read From File"),//读取文件按钮 write=new JButton("Write To The File");//写出文件按钮 JScrollPane displaySP=new JScrollPane( displayArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ),//封装输出区并设置垂直滚动条 journalSP=new JScrollPane( journalIn, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );//封装日志区并设置垂直滚动条 myJournal(){ //书写得顺序逻辑是从上到下,从左到右,从小到大 //添加监听器 read.addActionListener(this); write.addActionListener(this); //basicData基本设置 basicData.setLayout(new GridLayout(5,2)); basicData.add(fileSource); basicData.add(fileSourceIn); basicData.add(title); basicData.add(titleIn); basicData.add(author); basicData.add(authorIn); basicData.add(read); basicData.add(write); basicData.add(display); basicData.add(journal); //IOPanel基本设设置 displayArea.setBorder(BorderFactory.createLineBorder(Color.black, 1)); journalIn.setBorder(BorderFactory.createLineBorder(Color.black, 1));//加边界 IOPanel.setLayout(new GridLayout(1,2)); displayArea.setLineWrap(true); //设置自动换行 IOPanel.add(displaySP); IOPanel.add(journalSP); setLayout(new BorderLayout()); //窗体设置 setBounds(300,300,640,360); setLayout(new BorderLayout()); add("North",basicData); add("Center",IOPanel); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } @Override public void actionPerformed(ActionEvent actionEvent) { String fileName = fileSourceIn.getText(); JButton buttonSource=(JButton) actionEvent.getSource(); if(buttonSource==read){ displayArea.setText(""); readTextFile (displayArea , fileName); } else writeTextFile (journalIn,fileName ); } private void readTextFile (JTextArea display , String fileName) { try { BufferedReader inStream = new BufferedReader (new FileReader(fileName )); String line = inStream.readLine (); while ( line != null) { display .append( line + "\n" ); line = inStream.readLine (); } inStream.close (); } catch (FileNotFoundException e) { display.setText ("IOERROR: "+ fileName +" NOT found\n" ); e. printStackTrace (); } catch (IOException e) { display.setText ("IOERROR: " + e. getMessage () + "\n" ); e. printStackTrace (); } } private void writeTextFile (JTextArea display , String fileName) { try { SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");//设置时间的格式 Date date = new Date(System.currentTimeMillis());//获取当前时间 FileWriter outStream = new FileWriter (fileName ,true); outStream.write("Title:"+titleIn.getText ()+"\n"+"Author:"+authorIn.getText ()+"\n"+formatter.format(date)+'\n'); outStream.write(display.getText ()+"\n\n"); outStream.close(); } catch (IOException e) { display.setText ("IOERROR: " + e. getMessage () + "\n" ); e. printStackTrace (); } } public static void main(String[] args) { myJournal myjournal=new myJournal(); }//主函数 }
作者:S.A.



程序 日志文件

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章