gpt4 book ai didi

java - 如何在允许更改选择之前验证数据?

转载 作者:行者123 更新时间:2023-12-02 10:42:28 25 4
gpt4 key购买 nike

在我的应用程序中,有两个部分:数据列表和用于编辑该数据详细信息的部分。用户从 ListViewTableView 中选择一个项目,该项目的属性就会出现在窗口的右侧,并且可以进行编辑。 下面的 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 中选择不同的项目时,如何首先验证 txtNametxtEmail 是否包含有效值?

我已关注this Q&A为了完全防止选择,但如果值有效,我找不到允许更改选择(同时更新绑定(bind))的方法。

本质上,在这个示例中,我想在继续进行新选择之前确保 TextFields 不为空。

最佳答案

据我所知,您无法从 ChangeListener 内部使用此事件,因为它是一个监听器,它会通知您已经发生的更改。

但是,如果您不满意,您可以添加鼠标过滤器,监听鼠标单击,验证此事件中所需的数据并使用它。

  listView.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
if(!validate(listView.getSelectionModel().getSelectedItem())) event.consume();
});

我也相信您可以实现自己的 MultipleSelectionModel,但这会花费更多时间

关于java - 如何在允许更改选择之前验证数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52838444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com