В моем приложении есть два раздела: список данных и раздел для редактирования деталей этих данных.Пользователь выбирает элемент из ListView
или TableView
, и свойства этого элемента появляются и редактируются в правой части окна. MCVE ниже продемонстрирует это.
Что мне нужно сделать, это проверить значения этих элементов управления «редактор» перед изменением выбора в ListView
.
MCVE: import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// Simple Interface
HBox root = new HBox(10);
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10));
// Simple ListView
ListView<Person> listView = new ListView<>();
listView.getItems().setAll(
new Person("Jack", "j@email.com"),
new Person("Bill", "bill@email.com"),
new Person("Diane", "dd@email.com")
);
// TextFields to edit values
TextField txtName = new TextField();
TextField txtEmail = new TextField();
// Add controls to the root layout
root.getChildren().addAll(
listView,
new VBox() {{
getChildren().addAll(
new Label("Name:"),
txtName,
new Label("Email:"),
txtEmail);
}}
);
// Add listener to update bindings for the TextFields
listView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
// Unbind previously bound values
if (oldValue != null) {
// If name or email are missing, prevent the change
if (!validate(oldValue))
return; // *** This is where I need help as this obviously is not correct *** //
txtName.textProperty().unbindBidirectional(oldValue.nameProperty());
txtEmail.textProperty().unbindBidirectional(oldValue.emailProperty());
}
// Bind the new values
if (newValue != null) {
txtName.textProperty().bindBidirectional(newValue.nameProperty());
txtEmail.textProperty().bindBidirectional(newValue.emailProperty());
// Refresh the ListView to show changes
listView.refresh();
}
});
// Show the stage
primaryStage.setScene(new Scene(root));
primaryStage.setTitle("Sample");
primaryStage.show();
}
private boolean validate(Person oldValue) {
return !(oldValue.getName().trim().isEmpty() || oldValue.getName().trim().isEmpty());
}
}
class Person {
private StringProperty name = new SimpleStringProperty();
private StringProperty email = new SimpleStringProperty();
public Person(String name, String email) {
this.name.set(name);
this.email.set(email);
}
public String getName() {
return name.get();
}
public void setName(String name) {
this.name.set(name);
}
public StringProperty nameProperty() {
return name;
}
public String getEmail() {
return email.get();
}
public void setEmail(String email) {
this.email.set(email);
}
public StringProperty emailProperty() {
return email;
}
@Override
public String toString() {
return name.get();
}
}
Когда пользователь выбирает другой элемент из
ListView
, как мне сначала проверить, что
txtName
и
txtEmail
содержатдопустимые значения?
Я следовал этим вопросам и ответам , чтобы полностью запретить выбор, но я не могу найти способ разрешить изменение выбора (одновременно обновляя привязки), если значениядействительны.
По сути, в этом примере я хочу убедиться, что текстовые поля не пусты, прежде чем перейти к новому выделению.