加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Java 用户登录界面

(2011-11-05 15:18:57)
标签:

读取显示图像

密码输入控件

文件读写

分类: Java
其实还没写完,心情不好,就把目前做的先总结下吧。

界面:
http://s5/middle/6ccd0a11gb0f7bb21d314&690用户登录界面" TITLE="Java 用户登录界面" />

http://s12/middle/6ccd0a11gb0f7bb6e103b&690用户登录界面" TITLE="Java 用户登录界面" />

几个新学的东西:
一、图片的添加和现实 BufferedImage、ImageIO、ImageIcon
验证码中的数字是从硬盘中读入的图片。
1 从硬盘中读取图像文件: BufferedImage img = ImageIO.read(String filepath);
其中,BufferedImage是Java中存储图像数据的变量,ImageIO.read是读取图像的静态方法,接受一个String变量作为输入参数,该String变量存储的是图像文件的路径。

2 在面板上显示图像:JPanel.add(new JLabel(new ImageIcon(img)));
其中,ImageIcon接受一个BufferedImage变量来初始化,然后该变量再用于初始化JLabel,使得图像显示在JLabel上。最后将JLabel添加到JPanel上。


二、密码输入区 JPasswordField
    通常在输入密码的时候,我们希望不要显示在屏幕上,以防止别人偷看窃取。通常都是用“·”或“*”来代替显示。
    刚开始我使用JTextField来生成密码输入区,然后通过添加事件监听函数来达到上述效果。
    JTextField有一个事件是TextEvent,当控件中的文本发生变化(插入,删除,修改)时触发该事件。可以通过实现TextListener接口来监听该事件。但问题是很多Java版本中不提供addTextListener函数。
    后来在网上找到一个解决办法:在JTextField有一个绑定的Document,可以通过JTextField.getDocument()函数来获得,然后实现Document的事件监听函数DocumentListener,可以实现对JTextField中文本被修改事件的监听。详见:http://zhidao.baidu.com/question/91287080.html
    
Bug
**************************************************************************************************
    但最后还是出了bug。错误的地方在实现DocumentListener的类中有一句
JTextField.setText(String display);
运行到这一句,程序throw出了一个java.lang.IllegalStateException。在网上搜了下也没有什么头绪。根据自己的理解是,JTextField.getDocument()得到的Document是从属于JTextField,,而监听函数是Document调用的,在Document中修改JTextField的状态必然会导致自身的改变。窃以为这是不被允许的。。。
(这些理由是自己想的,估计也不对。。。不过暂时能说服自己。。。)
**************************************************************************************************


后来超爷告诉我,原来Java中有现成的控件来实现密码输入的。。。只需要将密码输入的控件由JTextField改为JPasswordField即可。
JPasswordField是为了实现密码输入的控件,输入的字符在界面上都是以“·”的形式显示。想得到实际输入的密码,只需调用函数JPasswordField.getPassword()。该函数返回的是一个char[]


三、不擦除地写文件
首先复习下读文件。。
BufferedReader in = new BufferedReader(new FileReader(file_path));
String s;
while((s=in.readLine())!=null){
//operations
}
in.close();

:其中BufferedReader作为装饰器,为读取文件提供了缓冲功能。结尾一定要记得close()

写文件和上述代码类似:
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file_path)));
out.println();
out.close();

:与输入类似,BufferedWriter提供了缓冲机制,而再外一层的装饰器PrintWriter则提供了格式化机制(如println,printlb等方法)。

但是上述代码仅仅实现的是擦除后写入,即在文件头写入。这样会将文件中原有内容删除。
为了实现追加(append)功能,即不修改文件原有内容,而是从文件尾部写入,将上述代码第一句改为:
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file_path, true)));
与之前相比,仅仅是在FileWriter的初始化中增加了一个boolean参数--true
这是因为FileWriter的构造函数接受两个参数,第一个是文件的路径,另一个则是“是否在文件后追加内容”。该参数为false时从文件头写入,即擦除后写;当该参数为true时,就从文件尾写入,即追加。默认为false。

0

阅读 收藏 喜欢 打印举报/Report
后一篇:矩阵求导
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有