示例解决方案
您可以使用以下技术在控制器中初始化阶段:Passing Parameters JavaFX FXML。
这是一个示例程序,它创建一个实用程序窗口,当您拖动实用程序窗口时,它会跟踪屏幕的 x 和 y 坐标。实用程序窗口的内容呈现在 fxml 定义的窗格中。
StageTrackingSample.java
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.*;
import javafx.stage.*;
public class StageTrackingSample extends Application {
@Override public void start(final Stage stage) throws Exception {
final FXMLLoader loader = new FXMLLoader(
getClass().getResource(
"stagetracking.fxml"
)
);
final Parent root = (Parent) loader.load();
final StageTrackingController controller = loader.getController();
controller.initData(stage);
stage.initStyle(StageStyle.UTILITY);
stage.setResizable(false);
stage.setScene(new Scene(root));
stage.show();
}
public static void main(String[] args) { launch(args); }
}
StageTrackingController.java
import javafx.beans.binding.Bindings;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.stage.Stage;
public class StageTrackingController {
@FXML private Label stageX;
public void initialize() {}
public void initData(final Stage stage) {
stageX.textProperty().bind(
Bindings.format(
"(%1$.2f, %2$.2f)",
stage.xProperty(),
stage.yProperty()
)
);
}
}
stagetracking.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="30" minWidth="100" xmlns:fx="http://javafx.com/fxml" fx:controller="test.StageTrackingController">
<Label fx:id="stageX" layoutX="0" layoutY="0"/>
</AnchorPane>
替代解决方案
如果您知道控制器的根组件已经添加到已经添加到舞台的场景(通常是触发按钮事件处理程序之类的情况)。
另一种方法类似于 tarrsalah 的答案,但在 @FXML 节点的场景属性和已更改场景的窗口属性上使用 ChangeListeners。这使您可以跟踪对场景和舞台的更改,以防窗格移动到新的场景或舞台。大多数情况下,您不需要跟踪这些更改,因为大多数窗格只是添加到单个场景中,并停留在一个阶段。
其他问题和评论的答案
我能得到一个更简单的答案吗?
tarrsalah 已经提供了一个更简单的答案。
在这种情况下,简单答案的唯一问题是它可能无法提供足够的上下文来复制答案的解决方案并使其适应您的工作。
我尽可能简单地回答了当前的问题,但不幸的是,即使是最基本的 JavaFX FXML 应用程序也需要相当多的代码和标记才能工作。
我只是一个java初学者
当您刚开始开发初始 Java 和 JavaFX 应用程序时,不要使用 FXML。相反,只需在您的 JavaFX 代码中坚持使用标准的 Java API,还有更多的 tutorials 以及优秀的 Ensemble Sample 可供参考。
确保在开始 JavaFX 之前,您已完成所有 Java Tutorial Trails Covering the Basics。开始使用 JavaFX 只需要 Java 的基础知识,您不需要分支到学习 Java 企业版并且可以忘记 Swing。
一旦您编写了一些基本的 JavaFX 应用程序、根据 Java API 对一些布局进行手动编码并对核心技术达到一定程度的熟悉程度,就可以考虑将 SceneBuilder 和 FXML 用于大型应用程序。那时您可能会发现学习 FXML 非常简单。 FXML 属性和元素只是 Java API 的反映。
请解释您的代码中不寻常的部分
我真的不能这样做,因为我不知道你有什么不寻常的地方。
如果您通过自己的知识或研究无法理解代码的某些特定部分,请create a new StackOverflow question 处理每个困难的概念。