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

时间:2012-05-21 05:14:54

标签: swing jtable jpasswordfield

我正在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());

此密码字段为空时,此渲染器正在屏蔽。因此,用户很难找出密码单元格是空的还是填充的(因为它总是显示一些掩盖的内容)。

如果在密码字段中没有输入任何内容时保持空白的渲染器,并且在密码字段中输入了某些内容,它必须显示在密码字段中输入的字符的长度?

1 个答案:

答案 0 :(得分:4)

您需要使用setCellRenderer为该列设置专用的单元格渲染器,该渲染器将返回屏蔽的密码版本。请参阅Oracle's tutorial

中的详细信息

修改

沿着这些方向:

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);
        }
    }
}