Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swing 如何在JTable中创建用于输入密码的列单元格_Swing_Jtable_Jpasswordfield - Fatal编程技术网

Swing 如何在JTable中创建用于输入密码的列单元格

Swing 如何在JTable中创建用于输入密码的列单元格,swing,jtable,jpasswordfield,Swing,Jtable,Jpasswordfield,我正在JTable中创建一列密码 我可以使用以下代码将单元格编辑器更改为密码编辑器: JPasswordField pwf = new JPasswordField(); DefaultCellEditor editor = new DefaultCellEditor(pwf); jTable1.getColumnModel().getColumn(3).setCellEditor(editor); 我无法找到正确的解决方案来呈现与JPassword控件相同行为的密码字段内容。

我正在JTable中创建一列密码

我可以使用以下代码将单元格编辑器更改为密码编辑器:

JPasswordField pwf = new JPasswordField();
    DefaultCellEditor editor = new DefaultCellEditor(pwf);
    jTable1.getColumnModel().getColumn(3).setCellEditor(editor);
我无法找到正确的解决方案来呈现与JPassword控件相同行为的密码字段内容。默认情况下,它将呈现输入的文本并显示它。如何覆盖它,以便渲染器渲染时只显示与输入密码长度相同的“*”或黑点

谢谢, 钱德拉

更新1:目前我正在使用下面给出的密码字段渲染器:

class PasswordCellRenderer extends JPasswordField
implements TableCellRenderer {

    public PasswordCellRenderer() {
        super();
        // This displays astericks in fields since it is a password.
        // It does not affect the actual value of the cell.
        this.setText("filler123");
    }

    public Component getTableCellRendererComponent(
    JTable arg0,
    Object arg1,
    boolean arg2,
    boolean arg3,
    int arg4,
    int arg5) {
        return this;
    }
}
使用以下命令调用上述渲染器:

jTableJDBCPools.getColumnModel().getColumn(3).setCellRenderer(new PasswordCellRenderer());
即使密码字段为空,此渲染器仍在屏蔽。因此,用户很难确定密码单元格是空的还是满的(因为它总是显示一些隐藏的内容)


如何编写在密码字段中未输入任何内容时保持空白的呈现器,以及在密码字段中输入内容时,呈现器必须显示在密码字段中输入的字符长度?

您需要为该列设置专用单元格呈现器,使用该呈现器将返回密码的屏蔽版本。请参阅中的更多信息

编辑

大致如下:

class PasswordCellRenderer extends DefaultTableCellRenderer {

    private static final String ASTERISKS = "************************";

    @Override
    public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) {
        int length =0;
        if (arg1 instanceof String) {
            length =  ((String) arg1).length();
        } else if (arg1 instanceof char[]) {
            length = ((char[])arg1).length;
        }
        setText(asterisks(length));
        return this;
    }

    private String asterisks(int length) {
        if (length > ASTERISKS.length()) {
            StringBuilder sb = new StringBuilder(length);
            for (int i = 0; i < length; i++) {
                sb.append('*');
            }
            return sb.toString();
        } else {
            return ASTERISKS.substring(0, length);
        }
    }
}
class PasswordCellRenderer扩展了DefaultTableCellRenderer{
私有静态最终字符串星号=“*************************”;
@凌驾
公共组件GetTableCellRenderComponent(JTable arg0、对象arg1、布尔值arg2、布尔值arg3、int arg4、int arg5){
整数长度=0;
if(字符串的arg1实例){
长度=((字符串)arg1).length();
}else if(arg1 instanceof char[]{
长度=((字符[])arg1.length;
}
setText(星号(长度));
归还这个;
}
专用字符串星号(整数长度){
如果(长度>星号.length()){
StringBuilder sb=新StringBuilder(长度);
for(int i=0;i
您需要为该列设置一个专用的单元格渲染器,使用该渲染器将返回密码的屏蔽版本。请参阅中的更多信息

编辑

大致如下:

class PasswordCellRenderer extends DefaultTableCellRenderer {

    private static final String ASTERISKS = "************************";

    @Override
    public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) {
        int length =0;
        if (arg1 instanceof String) {
            length =  ((String) arg1).length();
        } else if (arg1 instanceof char[]) {
            length = ((char[])arg1).length;
        }
        setText(asterisks(length));
        return this;
    }

    private String asterisks(int length) {
        if (length > ASTERISKS.length()) {
            StringBuilder sb = new StringBuilder(length);
            for (int i = 0; i < length; i++) {
                sb.append('*');
            }
            return sb.toString();
        } else {
            return ASTERISKS.substring(0, length);
        }
    }
}
class PasswordCellRenderer扩展了DefaultTableCellRenderer{
私有静态最终字符串星号=“*************************”;
@凌驾
公共组件GetTableCellRenderComponent(JTable arg0、对象arg1、布尔值arg2、布尔值arg3、int arg4、int arg5){
整数长度=0;
if(字符串的arg1实例){
长度=((字符串)arg1).length();
}else if(arg1 instanceof char[]{
长度=((字符[])arg1.length;
}
setText(星号(长度));
归还这个;
}
专用字符串星号(整数长度){
如果(长度>星号.length()){
StringBuilder sb=新StringBuilder(长度);
for(int i=0;i
@Guillaume polet:请在问题中找到我的更新(update-1)。谢谢Guillaume polet。你的回答对我有帮助。但是,既然我正在开发企业应用程序,我们能得到与密码字段(大黑点)相同类型的屏蔽吗?@merlachandra只需将所有的“*”替换为“\u2022”或您喜欢的任何其他字符。@Guillaume polet:请在问题中找到我的更新(update-1)。谢谢Guillaume polet。你的回答对我有帮助。但是,既然我正在开发企业应用程序,我们可以得到与密码字段(大黑点)相同类型的屏蔽吗?@merlachandra只需将所有的“*”替换为“\u2022”或任何其他您喜欢的字符。为什么这个问题被否决?为什么这个问题被否决?