资源描述
Javatxt小说阅读器实验报告
1. 功能分析
打开文件
功能逻辑图:
文件
退出
字体
格式
颜色
背景颜色
txt
小说阅读器
滚屏速度
帮助
查找
关于
查找
帮助信息
首页
上一页
自动滚屏
底部按钮
下一页
尾页
根据功能逻辑分析图,txt小说阅读器应该具备以下功能:
[1]文件的打开及关闭
[2]字体的设置
[3]查找功能
[4]底部按钮(首页、尾页、上一页,下一页,滚屏)
[5]双击窗体自动滚屏,单击窗体停止滚屏
2. 功能实现、设计,分析
2.1文件的打开
2.1.1功能实现
2.1.2功能设计
实现的关键代码:
[1]监视器:
open.addActionListener(new ActionListener() { //打开
public void actionPerformed(ActionEvent e) {
();
}
});
[2]
private void () { //文件对话框
int flag=.showOpenDialog(this);
if(flag==J.APPROVE_OPTION)
{
//获得该文件
();
textArea.setText(null);
try{
= .getCurrentDirectory(); //返回当前目录
String name=.getSelectedFile().getName();
);
= new (file);
in=new BufferedReader();
String s=null;
while((s=in.readLine())!=null){
textArea.append(s+"\n");
}
in.close();
.close();
textArea.setCaretPosition(0);
//让一开始滚动条就在最上方
}
catch(IOException exp){}
}
}
2.1.3 功能分析
经过实验及测试,实现的文件对话框可以正常打开任何文件txt文件,但打开doc文件时会出现乱码的情况
2.2字体的设置
2.2.1功能实现
2.2.2功能设计
实现的关键代码:
[1]监视器:
font.addActionListener(new ActionListener() { //字体设置
public void actionPerformed(ActionEvent e) {
font1.addEventHandler();
}
});
[2]
class font { //字体设置
private JTextArea textArea;
private JButton ok, cancel;
private JComboBox fontName, fontSize, fontStyle;
GraphicsEnvironment ge;// 定义系统字体对象
String[] size = { "8", "10", "12", "14", "16", "18", "20", "22", "24", "26", "28", "32", "36", "48", "72", "96" };
String[] style = { "PLAIN", "BOLD", "ITALIC" };
JFrame jf = new JFrame("字体设置");
public font(JTextArea textArea) {
this.textArea = textArea;
JLabel label1 = new JLabel(" 字体 ");
JLabel label2 = new JLabel(" 字号 ");
JLabel label3 = new JLabel(" 样式 ");
ge = GraphicsEnvironment.getLocalGraphicsEnvironment();// 获取系统字体
String[] fontname = ge.getAvailableFontFamilyNames();
fontName = new JComboBox(fontname);
fontSize = new JComboBox(size);
fontStyle = new JComboBox(style);
ok = new JButton("确定");
cancel = new JButton("取消");
jf.setLayout(new BorderLayout());
JPanel p1 = new JPanel(); //P236
JPanel p2 = new JPanel();
JPanel p3 = new JPanel();
p1.add(label1);
p1.add(label2);
p1.add(label3);
p2.add(fontName);
p2.add(fontSize);
p2.add(fontStyle);
p3.add(ok);
p3.add(cancel);
jf.add(p1, BorderLayout.NORTH); //布局,放置的位置
jf.add(p2, BorderLayout.CENTER);
jf.add(p3, BorderLayout.SOUTH);
jf.setSize(360, 200);
jf.setLocation(300, 200);
jf.setVisible(false);
jf.setResizable(false);//大小不可调整
}
public void addEventHandler() {
// TODO Auto-generated method stub
jf.setVisible(true); //由原先的不可见-->可见
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String n1 = (String) fontName.getSelectedItem();
int n2 = fontStyle.getSelectedIndex();
String n3 = (String) fontSize.getSelectedItem();
textArea.setFont(new Font(n1, n2, Integer.parseInt(n3)));
jf.setVisible(false); //点击“确定”按钮后-->不可见
}
});
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jf.setVisible(false);
// 若是点击了“取消”按钮-->仅仅让对话框消失即可
}
});
}
}
2.2.3 功能分析
实现设置字体的该窗体可以实现设置字体的类型、大小、颜色、是否加粗、倾斜等设置,但当设置为一些字体类型时,文本会出现乱码的情况,原因可能是字体编码不一样导致的
2.3查找功能
2.3.1功能实现
2.3.2功能设计
实现的关键代码:
[1]监视器:
find.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
findtest = new Find(textArea,x,y);
findtest.findset();
}
});
[2]
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Find implements ActionListener,DocumentListener{
private JFrame jframe;
private JLabel jlabel;
private JTextField jtextFile;
private JButton jbtNext;
private JButton jbtCancel;
JTextArea textArea;
int i=0;
int x,y;
public Find(JTextArea textArea,int x,int y) {
this.x=x;
this.y=y;
this.textArea = textArea;
jframe = new JFrame();
jlabel = new JLabel("查找内容:");
jtextFile= new JTextField(10);
jbtNext = new JButton("查找下一个");
jbtCancel = new JButton("取消");
jframe.setLayout(new FlowLayout());
jframe.add(jlabel);
jframe.add(jtextFile);
jframe.add(jbtNext);
jframe.add(jbtCancel);
jframe.setBounds(x+200,y+200,220, 120);
jframe.setVisible(false);
//jtext(true);
jframe.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
//jframe.pack();
}
void findset() {
jframe.setVisible(true);
jbtNext.addActionListener(this);
jbtCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
jframe.setVisible(false);
//一旦点击“取消”按钮后对话框马上消失
jtext(null);//点击“取消”按钮之后,文本框清空
i=0;//点击“取消”按钮之后,i重新赋值0,即下一次查找从头开始
}
});
(jtext()).addDocumentListener(this);
//监视文本框P251
}
@Override
public void actionPerformed(ActionEvent e) {
String string= jtext().trim();//获取文本框中的内容
if(!("".equals(string))){ //空字符串及用户输入的字符串作比较 P189
String str=textArea.getText(); //获取textArea的内容
if(i!=-1) //防止当i=-1时,下面这行代码会把i=-1重新赋值,导致从头再查找-->查找到尾部后不允许从头重新查找
i=str.indexOf(string,i);//192
if(i>=0){
textArea.setSelectionStart(i);
textArea.setSelectionEnd(i + string.length());
}
else{
JOptionPane.showMessageDialog(null,"没有找到 "+string);//消息对话框P285,放置在屏幕中间
}
}else{
JOptionPane.showMessageDialog(null,"输入不能为空");
}
if(i!=(-1)){//为了能继续查找下一个关键字
i+=1;
}
//System.out.println(i);
}
//监听文本框 文本框一旦改变(增加、删除、改变),i=0
@Override
public void changedUpdate(DocumentEvent arg0) { //没有下面两个函数,查找一次到头了就不能再继续查找下一次了(即使修改查找内容)
// TODO Auto-generated method stub
i=0;
}
@Override
public void insertUpdate(DocumentEvent arg0) {//在查找内容的基础上删除
// TODO Auto-generated method stub
changedUpdate(arg0);
}
@Override
public void removeUpdate(DocumentEvent arg0) {//在查找内容的基础上删除
// TODO Auto-generated method stub
changedUpdate(arg0);
}
}
2.3.3功能分析
经过试验,测试,改进,以及再测试,该查找功能能完善地实现查找的功能,精确定位到关键字,符合查找的规则
2.4自动滚屏
2.4.1功能实现
2.4.2功能设计
实现的关键代码:
Timer timer = new Timer(delay, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jsb.setValue(jsb.getValue() + jsb.getUnitIncrement());
} //设置滚动条的值
});
textArea.addMouseListener(new MouseListener() {
//监听鼠标的点击数,执行相应的操作 P252
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) { //滚屏
//timer.start();
count=1; //为的是及底部的“滚屏按钮对应”
timer.start(); //为的是及底部的“滚屏按钮对应”
roll.setText("暂停滚屏");
}
if (e.getClickCount() == 1) { //停止滚屏
//timer.stop();
count=0;
timer.stop();
roll.setText("自动滚屏");
}
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
});
或者:
roll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if((++count)%2==1){ //滚屏
timer.start();
roll.setText("暂停滚屏");
}else{ //停止滚屏
timer.stop();
roll.setText("自动滚屏");
}
}
});
2.4.3功能分析
经过试验,测试,改进,以及再测试,点击窗体下方的“自动/暂停滚屏”按钮可以实现滚屏或是暂停滚屏。鼠标双击/单击窗体,可以实现实现滚屏或是暂停滚屏,并且及窗体下方的“自动/暂停滚屏”按钮的文字相互协调、互相一致,保持同步
2.5设计滚屏速度
2.5.1功能实现
2.5.2功能设计
实现的关键代码:
[1]监视器:
speed.addActionListener(new ActionListener() { //滚屏速度的设置
public void actionPerformed(ActionEvent e) {
sped.liser();
}
});
[2]
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Speed implements ItemListener {
private JScrollBar jsb;
private JFrame jfrm;
private JLabel jlb1;
private JButton jbt;
private JComboBox jcbb;
Integer sudu; //速度
Timer timer; //计时器
private Integer msg[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
public Speed(final JScrollBar jsb, final Timer timer) {
this.jsb = jsb;
this.timer = timer;
jfrm = new JFrame();
jlb1 = new JLabel("滚屏速度");
jbt = new JButton("确定");
jcbb = new JComboBox(msg);
jfrm.setLayout(new FlowLayout());
jfrm.add(jlb1);
jfrm.add(jcbb);
jfrm.add(jbt);
jfrm.setVisible(false);
jcbb.setEditable(true);
jfrm.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
jfrm.pack();
}
void liser() {
jfrm.setVisible(true);
jcbb.addItemListener(this);//*************************关键
jbt.addActionListener(new ActionListener() { //“确定”按钮的监听
public void actionPerformed(ActionEvent arg0) {
jfrm.setVisible(false); //一旦点击“确定”按钮后对话框马上消失
}
});
}
@Override
public void itemStateChanged(ItemEvent arg0) {
sudu = (Integer) jcbb.getSelectedItem();
jsb.setUnitIncrement(sudu.intValue());
}
}
2.5.3功能分析
经过试验及测试,该功能可以实现对滚屏速度的设置,而且设置合理
2.6分页
2.6.1功能实现
2.6.2功能设计
[1]上一页:
PageUp.addActionListener(new ActionListener() { //上一页
public void actionPerformed(ActionEvent e) {
jspValue=scroll.getVerticalScrollBar().getValue();
scroll.getVerticalScrollBar().setValue(jspValue-=scroll.getHeight());
}
});
[2]下一页:
PageDown.addActionListener(new ActionListener() { //下一页
public void actionPerformed(ActionEvent e) {
jspValue=scroll.getVerticalScrollBar().getValue();
scroll.getVerticalScrollBar().setValue(jspValue+=scroll.getHeight())
}
});
[3]首页:
HomePage.addActionListener(new ActionListener() { //首页
public void actionPerformed(ActionEvent e) {
scroll.getVerticalScrollBar().setValue(HEIGHT);//顶点
}
});
[4]尾页:
EndPage.addActionListener(new ActionListener() { //尾页
public void actionPerformed(ActionEvent e) {
jsb.setValue(jsb.getMaximum());
}
});
2.6.3功能分析
经过试验及测试,以上4个功能按钮完全可以实现上下翻页、返回首尾页,满足读者阅读小说的需要
3. 学习心得
在前期准备过程中,先要策划好自己所要表达的内容,主要实现哪些功能,如上一页、下一页、打开、退出、字体设置,查找等,在编写好这些功能后,又是怎么样在面板中布局这些都是我们事先要考虑的问题,只有这样我们考虑周到了,明白了,才能顺利实现更多的功能,达到事半功倍的效果。
对于java语言编程,我们决不能只看不编写。只有自己亲手做了才能体会到学习java语言编程的快乐以及奥妙,也只有自己亲手做了才能学到更多的知识,自己才可以学会应用java语言的知识来解决我们现实生活中的一些实际问题。 学习java语言已经一个学期了,在这个学期,踉踉跄跄,学得不精,还得再下很大的功夫才能领会到它的博大精深,而我只是学习了皮毛而已,许多人把其一生奉献给它,它是另一个世界的通行证。
通过本项目的练习,发现自己在java基础上还是很薄弱,对一些java类掌握的还不够扎实,对一些知识还不够了解,发现写程序和读程序还是有着本质上的区别,自己敲的代码太少,同时这个程序还不够完善,如分页功能还没有完全实现等等,在以后的java学习中需要更加的用心去学
26 / 26
展开阅读全文