好久没写博客了,因为需要看的东西太多,需要学习的东西也太多。本人对java里面的东西也只是了解了大概。这几天写了一个文档扫描器,算是对之前的所学东西的一个总结吧。
在java中,每一个东西都可以抽象成一个类,(为了更好的使用这些东西,有的会被抽象成抽象类,或者接口。)对于那些具具体体的有血有肉的实物,就是一个对象。每一个对象都有自己拥有自己的属性,我们可以通过对象给我们提供方法经行某些操作。当然最重要的还是对象与对象之间的信息交互。
这些是一些简单的面向对象编程的思想。
下面一个简单的文档编辑扫描器。(暂时实现的功能有限)
下面看代码(具体的注释都在上面)
package com.scnnerwords.mukever.www;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ScannerWord extends JFrame implements Runnable {
private JTextArea jta; //文本域
private HistogramBarChart histogram = new HistogramBarChart(); //创建一个文件的扫描panel类
private JFrame histogramFrame = new JFrame();//在框架中定义一个窗体
public ScannerWord() {//构造函数
histogramFrame.setLocation(100, 100);//设置条形图窗体位置
histogramFrame.setSize(400,300);//设置条形图窗体大小
histogramFrame.setVisible(true);//设置条形图可见
JScrollPane scrollPane = new JScrollPane(jta = new JTextArea());//使文本具有滑动功能
scrollPane.setPreferredSize(new Dimension(300, 200));//为文本域设置一个新的大小
jta.setWrapStyleWord(true);//使文本不会出现断字现象
jta.setLineWrap(true);//设置自动换行
histogramFrame.add(histogram);//为窗体添加一个panel
add(scrollPane);//将具有滑动功能的文本域的窗体添加到主窗体中
histogramFrame.pack();//将条形图窗体打包一下
histogramFrame.setTitle("字符统计");//设置条形图窗体的题目
}
class Listener implements ActionListener { //监听者类
public void actionPerformed(ActionEvent e) { //没监听到有Action发生就会调用此方法
int[] count = countLetters(); //通过countLetter方法得到一个包含字符数
double[] data = new double[26]; //计算百分比
String[] letters = new String[26]; //得到相应字符,方便打印在panel上
for (int i = 0; i < 26; i++)
data[i] = count[i];
for (int i = 0; i < 26; i++)
letters[i] = "" + (char)('A' + i);
histogram.showHistogram(count);//调用histogram方法计算出相应的结果并画出条形图。
}
private int[] countLetters() {
int[] count = new int[26]; //声明一个数组
String text = jta.getText();//得到jta的字符串
for (int i=0; i<text.length(); i++) {//通过扫描统计得到相关字符的个数
char character = text.charAt(i);//使用charAt()方法得到相应的字符
//下面两个判断是为了区别大小写----------用到了简单的Hash
if ((character >= 'A') && (character <= 'Z')) {
count[(int)character - 65]++;
}
else if ((character >= 'a') && (character <= 'z')) {
count[(int)character - 97]++;
}
}
return count; //返回一个数组
}
}
public void run(){//实现了一个Runnable接口,并实现了run方法,同时声明一个定时器,每1ms就会触发一次Action,
//并会被Listner监听到,监听者就会调用相应的方法来处理。
//到此处就实现了对输入文本扫描的动态展现。
Timer timer = new Timer(1, new Listener());
timer.start();//触发器
}
public static void main(String[] args) {
ScannerWord frame = new ScannerWord();//生成一个主窗体
//设置相应的信息
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("文件扫描仪");
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
//启动一个线程----一边输入,一同统计,并且动态展现
Thread time = new Thread(frame);
time.start();
}
}
下面是另外一个类
package com.scnnerwords.mukever.www;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;
public class HistogramBarChart extends JPanel{
private int [] count;
public void showHistogram(int [] count){//得到更改后重画图形
this.count = count;
repaint();//调用paintComponent()方法再次重画
}
protected void paintComponent(Graphics g) { //在本panel上重画相应的条形图
if(count == null) return; //没有得到count就不会在panel上画图
super.paintComponent(g);//得到一个简单的画笔
int width = getWidth();//得到panel的宽度
int height = getHeight();//得到panel的高度
int interval = (width-40)/count.length; //计算每个字符所对应的条形图中柱形的宽度
int indiv = (int)(((width-40)/24)*0.6);//设置间隔
int maxCount = 0; //得到最多的字符
for(int i=0;i<count.length;i++){
if(maxCount<count[i])
maxCount = count[i];
}
int x = 30;//设置下面直线相对于其他边框的具距离
g.setColor(Color.blue);//设置直线的颜色
g.drawLine(10, height-45, width-10, height-45);//画直线
g.setColor(Color.BLACK);//设置color
for(int i=0;i<count.length;i++){
int barHeight = (int)((double) count[i]/(double)maxCount*(height-55));//计算条形主柱的长度
g.drawRect(x, height-45-barHeight, indiv, barHeight);//画柱形
g.drawString((char)(65+i)+"", x, height-30);//画字符串
x+=interval;//间隔往后移
}
}
public Dimension getPreferredSize() {
return new Dimension(400,300);//设置panel的大小,不改变其他属性
}
}
实现的效果如下: