java - 如何根据 TableView 中的行元素自定义表格单元格/表格列内容(JavaFX)

标签 java javafx tableview tablecell tablecolumn

enter image description here

问题

我有一个TableColumn<User, String> colPassword目前将现有密码(字符串)显示为每个条目(行)的掩码。

需求

我需要你的帮助,以便每个TableCell如果相应行的用户:user.isManager == true,则仅显示屏蔽密码,否则密码应为< em>揭开面纱

我目前的方法

我将只提供关键部分以方便理解。

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

GUI 的用户 Controller

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

最佳答案

您的PasswordFieldCell类从TableCell继承了许多有用的方法。 .

特别是,您继承了 getTableView() 方法和返回当前单元格行的 getIndex() 方法。这些是您在 updateItem 方法中查找单元格行值所需的全部内容:

int row = getIndex();
User user = getTableView().getItems().get(row);

关于java - 如何根据 TableView 中的行元素自定义表格单元格/表格列内容(JavaFX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42099211/

相关文章:

java - SVN通知 : Do not send notification email when a special keyword is present in the svn log message

java - 如何更新 javafx TableView 值

java - 如何在 FX 线程上放置某些内容?

ios - 防止 TableView 在 insertRows 后滚动到顶部

java - org.springframework.security.oauth 和 org.codehaus.spring-security-oauth 之间有什么区别?

java - 线程 "main"中出现异常错误,我需要输入一条消息

java - 动态压缩记录器文件

java - 每次单击鼠标时如何在颜色之间切换/更改?[JavaFX]

ios - Collection View 作为 swift 中的粘性标题

ios - swift ActivityIndi​​cator 自动停止动画