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) { fileOpen(); } }); [2]
private void fileOpen() { //文件对话框
int flag=fileDialog.showOpenDialog(this);
if(flag==JFileChooser.APPROVE_OPTION) {
//获得该文件
File f=fileDialog.getSelectedFile(); textArea.setText(null); try{
File dir = fileDialog.getCurrentDirectory(); //返回当前目录
String
name=fileDialog.getSelectedFile().getName();
File file=new File(dir,name);
fileReader = new FileReader(file); in=new BufferedReader(fileReader); String s=null;
while((s=in.readLine())!=null){ textArea.append(s+\"\\n\"); }
in.close();
fileReader.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);
//jtextFile.setEditable(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);
}
//一旦点击“取消”按钮后对话框马上消失
jtextFile.setText(null);//点击“取消”按钮之后,文本框清空 i=0;//点击“取消”按钮之后,i重新赋值0,即下一次查找从头开始
}
});
(jtextFile.getDocument()).addDocumentListener(this);
//监视文本框P251
@Override
public void actionPerformed(ActionEvent e) {
String string= jtextFile.getText().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学习中需要更加的用心去学
因篇幅问题不能全部显示,请点此查看更多更全内容