******** 在线等待,关于JPasswordField的,解决问题后立即给分 *******

freelybird 2003-06-05 04:15:37
现在我有这样一个需求, 就是有一组口令需要JPasswordField来显示.
如:
password1,password2,password3
我需要在文本框显示为********,********,*********


怎样解决呢? 各位兄弟请帮忙.高分回报!
...全文
81 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymoto 2003-06-06
  • 打赏
  • 举报
回复
不错
XKP 2003-06-06
  • 打赏
  • 举报
回复
试试看这个把
System.out.println( MyTextField.this.getText() );
这一句是用来测试用的,没什么意义

public String getText(){
return myDoc.getText();
}
这个就是得到TextField里面原来的值,我覆盖掉了
XKP 2003-06-06
  • 打赏
  • 举报
回复
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JFrame {
MyTextField jtf;
public Test() {
jtf = new MyTextField( );
getContentPane().add( jtf );
}

public static void main(String args[]) {
GraphicJavaApplication.launch(new Test(),
"Vetoing Node Expansion/Collapse",300,300,300,200);
}
}

class MyTextField extends JTextField{
MyDocument myDoc;
public MyTextField(){
myDoc = new MyDocument();
this.setDocument( myDoc );
}
public String getText(){
return myDoc.getText();
}
class MyDocument extends PlainDocument{
private String fieldText = "";
public void insertString( int offset, String s, AttributeSet attributeSet ) throws BadLocationException{
// System.out.println( s );
fieldText += s;
String newS = s.replaceAll( "[^,]", "*" );
// System.out.println( newS );
super.insertString( offset, newS, attributeSet );
System.out.println( MyTextField.this.getText() );
}
public String getText(){
return fieldText;
}
}
}

class GraphicJavaApplication extends WindowAdapter {
public static void launch(final JFrame f, String title,
final int x, final int y,
final int w, int h) {
f.setTitle(title);
f.setBounds(x,y,w,h);
f.setVisible(true);

f.setDefaultCloseOperation(
WindowConstants.DISPOSE_ON_CLOSE);

f.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
}
}
freelybird 2003-06-06
  • 打赏
  • 举报
回复
to: teaky2002(种田硬手)

我们的前提是密码中不存在这个字符,当然不一定是豆号.

所以这个可以不考虑.


关键是遇到这个"分隔符" 就不显示为*


******,******,****
teaky2002 2003-06-06
  • 打赏
  • 举报
回复
当然有难度啊。因为如果你的密码中就有","这个字符的话,不容易判断哪是你的分割符,哪是你的密码。
mymoto 2003-06-06
  • 打赏
  • 举报
回复
昨天我简单做了一下,的确不是那么简单的事,呵呵,关键是在哪做变换,首先不能在DocumentListener里做,而又不能在CaretListener里做,那只有在他的视图里做,JTextPane用的视图是PlainView,JTextField用的是什么我就不记得了,原来书上写过,你查查。你可以在覆盖view的drawUnselectedText和drawSelectedText两个方法,就是在这里面做变换,当然,在变化前要把直给一个全局变量,使能获得正确的直。大概说一个方向,你做做试试
freelybird 2003-06-06
  • 打赏
  • 举报
回复
我急需, 谁能写一个这样的class

奉上400分!


要求的功能如上.


谢谢帮忙!!!
hlding 2003-06-06
  • 打赏
  • 举报
回复
JPasswordField默认显示的字符就是'*',但可以通过方法setEchoChar()进行设置
freelybird 2003-06-06
  • 打赏
  • 举报
回复
to XKP(低等下人) :


我明白你的意思,但你这样一来JTextField.getText()的值也被替换了.


要想JPasswordField一样,只是显示时要求"把不是;的字符显示为*


你这样做相当是"字符的替换"
mymoto 2003-06-06
  • 打赏
  • 举报
回复
呵呵,写到这个程度还搞不定,那楼主就太懒了
XKP 2003-06-06
  • 打赏
  • 举报
回复
顺便说一下
document里面有一个方法是这样的

public void remove(int offs,
int len)
throws BadLocationException

你自己覆盖掉他吧,也就是你说的删除的意思了,至于其他的代码
我也不想写了。
XKP 2003-06-06
  • 打赏
  • 举报
回复
这样说吧,你要的效果我不可能帮你全作了,甚至你前面的一个说
因为你说的这个和上一个要求都只是在程序里面改一点东西而已
如果他按的是back的话,你就自己处理一下了,判断一下是否原来已经有
String,如果有,就删掉最后面一个,我敢说,我做出来的东西肯定不可能
所有的东西都考虑到了,主要也就是给个类似例子的意思
如果说到用户可能的按键的话,那么用户可能的按键有特殊意义的还很多
比如有些特殊字符的话,也是要自己处理的。
freelybird 2003-06-06
  • 打赏
  • 举报
回复
sorry, 一直忙,才来!

to : XKP(低等下人)

你这样行吗? 用户可以backspace delete insert字符.

显然你这样处理不对, 你只考虑字符一直追加


XKP 2003-06-05
  • 打赏
  • 举报
回复
你要在什么地方得到阿?
String newS = s.replaceAll( "[^,]", "*" );
这里面的 s 就是你原来真实的值了
如果你要在JTextField里面用到这个值
那么你就在MyDocument的构造函数里面传递这个jtf的引用
然后再MyDocument里面某个地方保存这个 s

明白了?
freelybird 2003-06-05
  • 打赏
  • 举报
回复
to XKP(低等下人) :

这样能得到真实的值吗?
freelybird 2003-06-05
  • 打赏
  • 举报
回复
没人知道吗?

200分感谢!
XKP 2003-06-05
  • 打赏
  • 举报
回复
这样吧,比如你的TextField是这样添加的
JTextField jtf = new JTextField( );
getContentPane().add( jtf );
那么你就增加一句
jtf.setDocument( new MyDocument() );

然后找个地方增加一个自己的类
class MyDocument extends PlainDocument{
public void insertString( int offset, String s, AttributeSet attributeSet ) throws BadLocationException{
// System.out.println( s );
String newS = s.replaceAll( "[^,]", "*" );
// System.out.println( newS );
super.insertString( offset, newS, attributeSet );
}
}

这样就可以了
你可以试试看·········

import javax.swing.text.*;
在开头加入这一句
freelybird 2003-06-05
  • 打赏
  • 举报
回复
to geyf(我在学java) :
我是有一组口令,所以我要以豆号隔开.

即: 除逗号以外的其它字符显示为'*'

********,********,*******
mymoto 2003-06-05
  • 打赏
  • 举报
回复
哦,这个意思啊,那就是做一个YourJTextField类扩展JTextField,然后添加一个成员变量,例如value,是String类型,然后添加一个getValue()方法,这个方法是返回value字符串,再做一个setValue()方法,是对value字符串设置,然后对这个类的对象添加DocumentListener监听器,在他的insertUpdate和changedUpdate和removeUpdate函数中写把功能,就是把不是,的字符都替换为*,但是记住在增加删除之前先使用setValue()把value的内容记下来,这个你在getValue()的时候才能取得正确的内容
freelybird 2003-06-05
  • 打赏
  • 举报
回复
to XKP(低等下人):

非常感谢!

我也是这样想的, 从JTextField派生一个类,但不知道怎样实现这样的功能,应该覆盖哪个函数呢?
加载更多回复(4)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧