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

题目及解析

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

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值