第七次作业解析——日志文件程序
程序员文章站
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)
- displaySP(JScrollPane)
- basicData(JPanel)
需要用到的小知识
- 在IDEA中可以通过ctrl+左键进入(跳转)到想要了解类或方法中。
- 在IDEA中可以通过CTRL+ALT+T快速添加try/catch
- 在IDEA中可以通过ALT+INSERT重构(override)代码
- 使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();
}//主函数
}
上一篇: Flink On YARN使用