2

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

パスワードフィールドが空であっても、このレンダラーはマスキングしています。そのため、ユーザーがパスワードセルが空であるか塗りつぶされているかを確認するのは困難です(常にマスクされたコンテンツが表示されるため)。

パスワードフィールドに何も入力されていない場合、およびパスワードフィールドに何かが入力されている場合に空白のままになるレンダラーを作成するには、パスワードフィールドに入力されている文字の長さを表示する必要がありますか?

4

2 に答える 2

4

パスワードのマスクされたバージョンを返すsetCellRendererを使用して、その列に専用のセルレンダラーを設定する必要があります。詳細については、Oracleのチュートリアルを参照してください。

編集

それらの線に沿った何か:

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);
        }
    }
}
于 2012-05-21T08:38:14.670 に答える
2

実装された回答は、ニンバスのルックアンドフィールでは面白く見えます。代わりに次のようなことをします。

public class PasswordCellRenderer extends DefaultTableCellRenderer {

    private static final long serialVersionUID = 1L;
    private static final int MAX_LENGTH = 25;

    @Override public Component getTableCellRendererComponent(
            JTable table, 
            Object value, 
            boolean isSelected, 
            boolean hasFocus,
            int row,
            int column) {

        String maskedValue = "";
        for(int index = 0; index < value.toString().length(); index++) {
            maskedValue += "*";
            if(index > MAX_LENGTH) {
                break;
            }
        }

        return super.getTableCellRendererComponent(
                table,
                maskedValue,
                isSelected,
                hasFocus, 
                row, 
                column);
    }
}

これにより、マスクされたデータを除くすべての元のデフォルトレンダラーの動作が保持されます。

于 2021-10-21T20:00:23.997 に答える