问题
我有一个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/