如何在对话框中将事件侦听器绑定到 JavaFX 文本字段.当字段为空时,"确定"按钮将变为禁用状态,



以下是支持我尝试完成的代码:

对话框控制器代码:

public class DialogController {
@FXML private TextField firstName;
@FXML private TextField lastName;
@FXML private TextField phoneNumber;
@FXML private TextField notes;
@FXML private DialogPane dialogPane;
//All getters defined here
public void keyReleasedHandler(){
Boolean firstNameEmpty = (firstName.getText().isEmpty() || firstName.getText().trim().isEmpty());
Boolean lastNameEmpty = (lastName.getText().isEmpty() || lastName.getText().trim().isEmpty());
Boolean phoneNumberEmpty = (phoneNumber.getText().isEmpty() || phoneNumber.getText().trim().isEmpty());
if (firstNameEmpty || lastNameEmpty || phoneNumberEmpty){
//When the dialog box opens and I type or a delete a letter from any of the event binded fields, a null pointer exception is thrown
dialogPane.lookupButton(ButtonType.OK).setDisable(true);
}
dialogPane.lookupButton(ButtonType.OK).setDisable(false);
}
public Contact processResults(){
String firstName = getFirstName().getText().trim();
String lastName = getLastName().getText().trim();
String phoneNumber = getPhoneNumber().getText().trim();
String notes = getNotes().getText().trim();
return new Contact(phoneNumber, firstName, lastName, notes);
}}

我的主控制器中的相关方法和 UI 定义:

public class Controller {
@FXML private TableView<Contact> tableView;
@FXML private BorderPane mainBorderPane;
public void handleNewContact(){
Dialog<ButtonType> dialog = new Dialog<>();
dialog.initOwner(mainBorderPane.getScene().getWindow());
dialog.setTitle("Add a new contact to your list");
dialog.setHeaderText("Use this dialog to create a new contact");
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("dialogWindow.fxml"));
try {
dialog.getDialogPane().setContent(loader.load());
} catch (IOException e) {
System.out.println("Couldn't load the dialog");
e.printStackTrace();
return;
}
dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);
Optional<ButtonType> result = dialog.showAndWait();
if (result.isPresent() && result.get() == ButtonType.OK){
DialogController controller = loader.getController();
Contact contact = controller.processResults();
contactData.addContact(contact);
tableView.getSelectionModel().select(contact);
}
}

我在keyReleaseHandler()背后的思考过程是,它可以在我的"新联系人对话框"中作为我的文本字段的验证。在我的主控制器中,我通过其 FXML 处理了对话框 UI 的创建,并在代码中手动添加了按钮类型确定和取消。我将所有对话框 TextFields onKeyRelease 绑定到我的 keyReleaseHandler()。每当我在"已验证"字段中键入任何内容时,都会抛出空指针异常(我假设 dialogPane 查找方法以某种方式返回 null)。

此验证功能的替代实现也将不胜感激。

你正在做的事情看起来像一个 Swing 实现。很多事情都可以通过绑定来完成。

无论你在keyReleasedHandler()做什么,你都可以用这个代替:

dialogPane.lookupButton(ButtonType.OK).disableProperty()
.bind(Bindings.createBooleanBinding(
() -> firstName.getText().trim().isEmpty() ||
lastName.getText().trim().isEmpty() ||
phoneNumber.getText().trim().isEmpty(),
firstName.textProperty(),
lastName.textProperty(),
phoneNumber.textProperty()
));

这将导致当 3 个TextField中的任何一个文本为空时禁用按钮。

一些旁注(与答案无关):

  • getText().isEmpty()并不是真正需要的,因为你有getText().trim().isEmpty(),尽管包含它可以说更快
  • 在您的问题中,您使用Boolean来存储布尔值。使用基元boolean类型肯定更好。

相关内容

  • 没有找到相关文章

最新更新