从对话框控制器[javaFX]中访问OK按钮

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从对话框控制器[javaFX]中访问OK按钮相关的知识,希望对你有一定的参考价值。

我试图在javaFX对话框中禁用“确定”按钮,直到所有文本字段都有内容。

由于ButtonType没有FXML支持,因此必须将其添加到主窗口的Controller类中的Dialog。由于这个原因,我无法(无法找到方法)将按钮链接到对话框控制器内的变量。

我尝试在主Controller类中处理该过程,如下所示:

FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("addDialog.fxml")); 

    try {

        dialog.getDialogPane().setContent(loader.load());

    } catch(IOException e) {

        e.getStackTrace();

    }

    dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
    dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);

    dialog.getDialogPane().lookupButton(ButtonType.OK).setDisable(true);

    AddDialogController controller = loader.getController();

    // below calls on a getter from the addDialogController.java file to check if the input fields are full

    if (controller.getInputsFull()) {
        dialog.getDialogPane().lookupButton(ButtonType.OK).setDisable(false);
    }

不幸的是,这不起作用,上面的代码只能在调用窗口之前或之后运行一次并且不能运行。

那么有没有办法访问对话框控制器中的javaFX附带的OK ButtonType,如果它已在外面声明?

或者是否有另一种方法来禁用基于来自用户正在更新的对话框控制器的信息的按钮?

谢谢你的帮助

编辑1:

按照addDialogController的要求,这是非常简单的骨头和不完整的,希望它有助于:

import data.Contact;
import data.ContactData;
import javafx.fxml.FXML;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;

public class AddDialogController {
    @FXML
    private TextField firstNameField;

    @FXML
    private TextField lastNameField;

    @FXML
    private TextField numberField;

    @FXML
    private TextArea notesArea;

    private boolean inputsFull;

    public void processResults() {
        String first = firstNameField.getText().trim();
        String last = lastNameField.getText().trim();
        String number =  numberField.getText().trim();
        String notes = notesArea.getText().trim();

        Contact contact = new Contact(first, last, number, notes);

    //      ContactData.add(contact);
    }



    @FXML
    public void handleKeyRelease() {
        boolean firstEmpty  = firstNameField.getText().trim().isEmpty() && firstNameField.getText().isEmpty();
        boolean lastEmpty  = lastNameField.getText().trim().isEmpty() && lastNameField.getText().isEmpty();
        boolean numberEmpty  = numberField.getText().trim().isEmpty() && numberField.getText().isEmpty();
        boolean notesEmpty  = notesArea.getText().trim().isEmpty() && notesArea.getText().isEmpty();

        inputsFull = !firstEmpty && !lastEmpty && !numberEmpty && !notesEmpty;

        System.out.println(firstEmpty);
        System.out.println(lastEmpty);
        System.out.println(numberEmpty);
        System.out.println(notesEmpty);
        System.out.println(inputsFull);
        System.out.println();


    }

    public boolean isInputsFull() {
        return this.inputsFull;
    }
答案

首先,删除您的handleKeyRelease方法。切勿在文本输入组件上使用键事件处理程序:首先,如果用户使用鼠标将文本复制并粘贴到文本字段中,它们将无法工作。如果需要,只需用textProperty()注册听众。另外,不是(例如)

firstNameField.getText().trim().isEmpty() && firstNameField.getText().isEmpty()

当且仅当

firstNameField.getText().isEmpty();

是真的?目前尚不清楚你想在那里实施什么逻辑。

您应该将inputsFull公开为JavaFX属性:

public class AddDialogController {
    @FXML
    private TextField firstNameField;

    @FXML
    private TextField lastNameField;

    @FXML
    private TextField numberField;

    @FXML
    private TextArea notesArea;

    private BooleanBinding inputsFull ;

    public BooleanBinding inputsFullBinding() {
        return inputsFull ;
    }

    public final boolean getInputsFull() {
        return inputsFull.get();
    }

    public void initialize() {
        inputsFull = new BooleanBinding() {
            {
                bind(firstNameField.textProperty(),
                     lastNameField.textProperty(),
                     numberField.textProperty(),
                     notesArea.textProperty());
            }
            @Override
            protected boolean computeValue() {
                return ! (firstNameTextField.getText().trim().isEmpty()
                       || lastNameTextField.getText().trim().isEmpty()
                       || numberField.getText().trim().isEmpty()
                       || notesArea.getText().trim().isEmpty());
            }
        };
    }

    public void processResults() {
        String first = firstNameField.getText().trim();
        String last = lastNameField.getText().trim();
        String number =  numberField.getText().trim();
        String notes = notesArea.getText().trim();

        Contact contact = new Contact(first, last, number, notes);

    //      ContactData.add(contact);
    }

}

然后你需要的只是

dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);

AddDialogController controller = loader.getController();
dialog.getDialogPane().lookupButton(ButtonType.OK)
    .disableProperty()
    .bind(controller.inputsFullBinding().not());

以上是关于从对话框控制器[javaFX]中访问OK按钮的主要内容,如果未能解决你的问题,请参考以下文章

从 javafx 平台运行后返回结果

动态访问/遍历/操作从控制器类外部的 FXML 创建的 JavaFX 节点

JavaFX 动态添加按钮

JavaFX 对话框

如何从 JavaFX 中的另一个控制器类访问 UI 元素?

JavaFX 从控制器获取场景