欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-17 09:29:43
...

题目及解析

仿照讲义上的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)

需要用到的小知识

  1. 在IDEA中可以通过ctrl+左键进入(跳转)到想要了解类或方法中。
  2. 在IDEA中可以通过CTRL+ALT+T快速添加try/catch
  3. 在IDEA中可以通过ALT+INSERT重构(override)代码
  4. 使JLabel居中:JLabel display=new JLabel("Display:",SwingConstants.CENTER);左边的参数就不解释了,右边的参数可以通过快捷键ctrl+左键进行查看,也可以改成SwingConstants.LEFT变成右对齐
  5. 添加滚动条: JScrollPane displaySP=new JScrollPane( displayArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ),一共三个参数第一个表示需要显示滚动条的视图组件,第二个和第三个分别表示垂直、水平滚动条的显示方式,其中ALWAYS表示总是,NEVER表示绝不,NEEDED表示在需要时显示。
  6. 使文本框可以自动换行journalIn.setLineWrap(true);
  7. 修改为追加模式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();
    }//主函数
}

相关标签: 作业解析