Как настроить содержимое TableCell/TableColumn в соответствии с его элементом строки в TableView (JavaFX)

введите здесь описание изображения

Проблема

У меня есть TableColumn<User, String> colPassword, который в настоящее время только отображает существующие пароли (строка) как замаскированные для каждой записи (строки).

Потребности

Мне нужна ваша помощь, чтобы каждый TableCell отображал только замаскированный пароль, если пользователь для соответствующей строки: user.isManager == true, в противном случае пароль должен быть демаскирован.

Мой текущий подход

Я приведу только важные части, чтобы облегчить понимание.

public class User implements Serializable {

    private Long id;
    private boolean deleted = false;
    private final BooleanProperty manager = new SimpleBooleanProperty();
    private final StringProperty password = new SimpleStringProperty("");

    public User() {
    }

    public boolean isManager() {
        return manager.get();
    }

    public void setManager(boolean value) {
        manager.set(value);
    }

    public BooleanProperty managerProperty() {
        return manager;
    }

UserController для графического интерфейса

public class UsersController {
    @FXML
    private TableView<User> tblUsers;
    @FXML
    private TableColumn<User, String> colPassword;

    private void initTableColumns() {
        colPassword.setCellValueFactory(cellData
                    -> cellData.getValue().passwordProperty()
        );
        colPassword.setCellFactory((TableColumn<User, String> param) -> {
            return new PasswordFieldCell();
        });
    }

вот пользовательский TabelCell

public class PasswordFieldCell extends TableCell<User, String> {

    private final Label lbl;

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

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

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

        return dots;
    }

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

Решение

С помощью VGR я смог найти это решение в PasswordFieldCell.

public class PasswordFieldCell extends TableCell<User, String> {

    private final Label lbl;

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

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

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

        return dots;
    }

    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if (!empty) {
            int row = getIndex();
            User user = getTableView().getItems().get(row);

            if (user.isManager()) { // mask password
                lbl.setText(generatePasswordString(item.length()));
            } else { // unmask password
                lbl.setText(item);
            }

            setGraphic(lbl);
        } else {
            setGraphic(null);
        }
    }
}

person Chiggiddi    schedule 07.02.2017    source источник


Ответы (1)


Ваш класс PasswordFieldCell наследует множество полезных методов от Ячейка таблицы.

В частности, вы наследуете метод getTableView() и метод getIndex(), который возвращает строку текущей ячейки. Это все, что вам нужно для поиска значения строки ячейки в вашем методе updateItem:

int row = getIndex();
User user = getTableView().getItems().get(row);
person VGR    schedule 07.02.2017
comment
спасибо вам за ваши усилия! Вы спасли мой день! Я обновил свою запись, чтобы включить ваш ответ! - person Chiggiddi; 08.02.2017