Здесь я создаю один TableView и отображаю данные в этом TableView, передавая ObservableList. Здесь наблюдаемый список берется из базы данных. И отображается в виде таблицы в столбцах «Имя-значение». Здесь также присутствуют некоторые пароли в данных. Итак, как скрыть эти поля пароля от пользователя?
Как создать поле пароля или скрыть пароль в виде таблицы
Ответы (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, вы все равно можете это сделать. Просто нужно изменить клеточную фабрику конкретного столбца.
Надеюсь, поможет.
Я думаю, что лейбл может сделать это лучше.. (Основано на ответе @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());
Я посетил это, ища решение. Однако предлагаемые методы не показывают, как обновить поле.
Мое решение довольно простое. Используйте текстовое поле. При заполнении ObservableList просто замените текст на ******
Я сделал этот готовый к использованию класс для ячеек паролей, который поддерживает редактирование.
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);
}
}