Как создать поле пароля или скрыть пароль в виде таблицы

Здесь я создаю один TableView и отображаю данные в этом TableView, передавая ObservableList. Здесь наблюдаемый список берется из базы данных. И отображается в виде таблицы в столбцах «Имя-значение». Здесь также присутствуют некоторые пароли в данных. Итак, как скрыть эти поля пароля от пользователя?


person Rohan    schedule 13.05.2013    source источник
comment
Почему бы вам просто не хэшировать пароль, чтобы вам не приходилось использовать маскировку пароля всякий раз, когда вы хотите отобразить пароль.   -  person AsirC    schedule 13.05.2013


Ответы (4)


Вы можете создать фабрику ячеек с полем PasswordField.

Во-первых, вы должны установить фабрику ячеек.

tableColumnPass.setCellFactory(new Callback<TableColumn<YourTableBean,String>, TableCell<YourTableBean,String>>() {         
        @Override
        public TableCell<YourTableBean, String> call(TableColumn<YourTableBean, String> cell) {
            return new PasswordFieldCell();
        }
    });

И в вашем PasswordFieldCell вы можете иметь следующий код, устанавливая на графике ячейки поле пароля в методе элемента обновления.

public class PasswordFieldCell extends TableCell<YourTableBean, String> {
private PasswordField passwordField;    
public PasswordFieldCell() {
    passwordField = new PasswordField();
    passwordField.setEditable(false);
    this.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    this.setGraphic(null);
}

@Override
protected void updateItem(String item, boolean empty) {
    super.updateItem(item, empty);
    if(!isEmpty()){
        passwordField.setText(item);
        setGraphic(passwordField);
    }else{
        setGraphic(null);
    }
}}

Если у вас нет Bean, вы все равно можете это сделать. Просто нужно изменить клеточную фабрику конкретного столбца.

Надеюсь, поможет.

person Antonio J.    schedule 13.05.2013

Я думаю, что лейбл может сделать это лучше.. (Основано на ответе @Antonio J.)

public class PasswordLabelCell extends TableCell<YourTableBean, String> {
    private Label label;

    public PasswordLabelCell() {
        label = new Label();
        this.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        this.setGraphic(null);
    }

    private String genDotString(int len) {
        String dots = "";

        for (int i = 0; i < len; i++) {
            dots += "\u2022";
        }

        return dots;
    }

    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if (!empty) {
            label.setText(genDotString(item.length()));
            setGraphic(label);
        } else {
            setGraphic(null);
        }
    }
}

А теперь установите фабрику ячеек столбца

myPasswordColumn.setCellFactory(param -> new PasswordLabelCell());
person EFernandes    schedule 29.01.2015

Я посетил это, ища решение. Однако предлагаемые методы не показывают, как обновить поле.

Мое решение довольно простое. Используйте текстовое поле. При заполнении ObservableList просто замените текст на ******

person Bonifacey    schedule 01.08.2019

Я сделал этот готовый к использованию класс для ячеек паролей, который поддерживает редактирование.

import javafx.geometry.Pos;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.input.KeyCode;
import javafx.scene.text.TextAlignment;
import javafx.util.Callback;
import javafx.util.StringConverter;
import javafx.util.converter.DefaultStringConverter;

/**
 *
 * @author Rami Manaf Abdullah
 */
public class PasswordFieldTableCell<S, T> extends TableCell<S, T> {

    public static <S> Callback<TableColumn<S, String>, TableCell<S, String>> forTableColumn() {
        return forTableColumn(new DefaultStringConverter());
    }

    public static <S, T> Callback<TableColumn<S, T>, TableCell<S, T>> forTableColumn(StringConverter<T> converter) {
        return (param) -> {
            return new PasswordFieldTableCell<S, T>(converter);
        };
    }

    private StringConverter<T> converter;
    private PasswordField passwordField;
    private Label text;
    
    public PasswordFieldTableCell(StringConverter<T> converter) {
        super();
        this.converter = converter;
        passwordField = new PasswordField();
        passwordField.setAlignment(Pos.CENTER);
        passwordField.setOnAction(event -> {
            commitEdit(converter.fromString(passwordField.getText()));
            event.consume();
        });
        passwordField.setOnKeyReleased(t -> {
            if (t.getCode() == KeyCode.ESCAPE) {
                cancelEdit();
                t.consume();
            }
        });
        text = new Label();
        text.setTextAlignment(TextAlignment.CENTER);
        text.setAlignment(Pos.CENTER);
        text.prefWidthProperty().bind(widthProperty());
        this.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        this.setGraphic(null);
    }

    @Override
    protected void updateItem(T item, boolean empty) {
        super.updateItem(item, empty);
        if (empty || item == null) {
            setGraphic(null);
        } else {
            if (isEditing()) {
                passwordField.setText(item.toString());
                setGraphic(passwordField);
            } else {
                StringBuilder builder = new StringBuilder(item.toString().length());
                for (int i = 0; i < item.toString().length(); i++) {
                    builder.append('\u2022');
                }
                text.setText(builder.toString());
                setGraphic(text);
            }
        }
    }

    @Override
    public void startEdit() {
        if (!isEditable()
                || !getTableView().isEditable()
                || !getTableColumn().isEditable()) {
            return;
        }
        super.startEdit();

        if (isEditing()) {
            passwordField.setText(converter.toString(getItem()));
            setGraphic(passwordField);
            passwordField.selectAll();
            passwordField.requestFocus();
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void cancelEdit() {
        super.cancelEdit();
        setGraphic(text);
    }
}
person رامي عبد الله    schedule 08.02.2021