当前位置: 首页 > 面试题库 >

如何从JavaFX的内部舞台获取TextField?

张华池
2023-03-14
问题内容

我已经为两个窗口/阶段编写了一个控制器。在MainClass中打开第一个窗口。如果用户单击按钮,则控制器中的第二个按钮。如何在applyFor()方法中从second.fxml获取TextFields?

谢谢。

@FXML
    protected void requestNewAccount(ActionEvent event) {
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("second.fxml")); // TextFields in there
            Parent root = (Parent) fxmlLoader.load();
            Stage stage = new Stage();
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.setTitle("Second Window");
            Scene scene = new Scene(root);
            String css = MainOnlineCustomer.class.getResource("/style.css").toExternalForm();
            scene.getStylesheets().clear();
            scene.getStylesheets().add(css);
            stage.setScene(scene);
            stage.show();
        } catch (IOException e) {
            logger.error(e);
        }
    }

    /**
     * closes the "second"-Window
     * @param event
     */
    @FXML
    protected void cancel(ActionEvent event) {
        final Node source = (Node) event.getSource();
        final Stage stage = (Stage) source.getScene().getWindow();
        stage.close();
    }

    @FXML
    protected void applyFor(ActionEvent event) {
        // get values from TextField in second.fxml here!!!
    }

问题答案:

在fxml之间共享控制器不是很好,除非它们具有相同的用途。在这里,这两个fxml似乎有不同的用途(帐户管理,登录或其中一个类似,并为另一个创建新帐户)。更糟糕的是,这些类没有共享相同的控制器实例,这意味着此处未使用通过使用相同的控制器可能会获得的很小(可能仅仅是)好处。您最好使用其他控制器。

由于您将其Modality.APPLICATION_MODAL用作模态,因此建议您使用showAndWait而不是show来打开新阶段。这将进入一个嵌套的事件循环,该循环使UI保持响应,并showAndWait在阶段关闭后调用后继续。

此外,将方法添加到控制器的方法中second.fxml,使您可以检索结果。

这将创建Person具有给定名称和姓氏的对象。

“主要窗口(打开“内部”阶段)

FXMLLoader loader = new FXMLLoader(getClass().getResource("second.fxml"));
Stage subStage = new Stage();
subStage.initModality(Modality.APPLICATION_MODAL);
subStage.setTitle("Second Window");
Scene scene = new Scene(loader.load());
subStage.setScene(scene);
subStage.showAndWait();

Optional<Person> result = loader.<Supplier<Optional<Person>>>getController().get();

if (result.isPresent()) {
    // do something with the result
}

“内部”内容的控制

public class SecondController implements Supplier<Optional<Person>> {
    @FXML
    private TextField givenName;
    @FXML
    private TextField familyName;

    private boolean submitted = false;

    // handler for submit action
    @FXML
    private void submit() {
        submitted = true;
        givenName.getScene().getWindow().hide();
    }

    // handler for cancel action
    @FXML
    private void cancel() {
        givenName.getScene().getWindow().hide();
    }

    @Override
    public Optional<Person> get() {
        return submitted ? Optional.of(new Person(givenName.getText(), familyName.getText())) : Optional.empty();
    }

}

请注意,您可以通过这种方式访问​​控制器可用的任何数据。我不建议TextField直接访问任何节点(例如),因为这会使更改UI变得更加困难。

Supplier此处不必使用该接口,但我选择这样做是为了实现SecondController与主窗口之间的松散耦合。



 类似资料:
  • 假设我在JavaFX中有一个舞台。我没有按X关闭按钮来关闭窗口,而是隐藏窗口,或者说切换到计算机上的其他应用程序。无论何时我隐藏窗口或切换到PC的任何其他窗口,我都希望舞台自动关闭。 我尝试了这三种方法,但所有这些方法仅在我自己关闭窗口时激活,而不是在我隐藏窗口时激活。 任何帮助将不胜感激。谢谢。

  • 问题内容: 我们正在Windows中构建JavaFX应用程序,我们希望能够做一些事情来操纵我们的应用程序在Windows 7/8任务栏中的显示方式。这需要修改Windows变量,称为“ 应用程序用户模型ID ”。 我们已经通过使用JNA设法完全完成了我们在Swing中想要的工作,并且我们想在JavaFX中重复我们的解决方案。不幸的是,要做到这一点,我们需要能够为应用程序中的每个窗口检索(窗口句柄)

  • 我想写一个包含以下类的游戏: 我希望所有这些课程都能在舞台上使用。首先,我启动startUp类,几秒钟后,我想删除startUp stackpane并更改场景(例如从fxml文件读取),但我是javafx中的noob。有什么想法吗?

  • 问题内容: 我目前正在使用两个控制器类。 在Controller1中,它创建一个新的阶段,该阶段在主要阶段的顶部打开。 现在,一旦该阶段打开,我希望它在关闭之前保持打开状态约5秒钟。 在Controller2中,我尝试实现类似 但是我不知道在while循环中放入什么来关闭它。我已经尝试了各种方法,但没有任何效果。 问题答案: 使用:

  • 问题内容: 我想在屏幕上居中放置一个舞台。 这是我尝试过的: 调用centerOnScreen()后,舞台过高。它似乎无法正常工作。我需要自己计算x和y pos吗?或者如何正确使用此功能? 问题答案: 的默认实现如下: 哪里 总是将舞台设置为比中心高一点。 要将舞台定位在精确的中心,可以使用您设置的 自定义X和Y值 。

  • 问题内容: 我如何从javafx image / imageview类获取byte []?我想将图像作为Blob存储到数据库中。这是我使用的方法 有没有一种方法可以将当前对象(图像视图,图像)转换为byte [] ?,还是应该开始考虑对图像使用其他类/或者指向带有引用的位置并使用路径/ URL? 问题答案: 试试这个: 应该根据徽标类别工作 您需要在写入和读取时指定一种格式,据我所知,不支持bmp