樣品溶液
您可以使用該技術從控制器初始化階段: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>
替代解決方案
的從@FXML組件剛剛起步的階段tarrsalah的回答也是一個很好的方式,如果你知道控制器的根組件已添加到已經被添加到舞臺的場景(這通常是在類似按鈕事件處理程序的情況下被觸發的情況)。
另一種做法與tarrsalah的答案類似,但在@FXML節點的scene屬性和更改場景的window屬性上使用ChangeListeners。這使您可以跟蹤對場景和舞臺的更改,以防將窗格移動到新的場景或舞臺。大多數情況下,您不需要跟蹤這些更改,因爲大多數窗格只會添加到停留在一個舞臺上的單個場景中。
回答更多的問題並評論
我可以得到一個簡單的答案嗎?
tarrsalah已經提供了一個更簡單的答案。
在這種情況下,答案更簡單的唯一問題是,它可能無法提供足夠的上下文,以便您複製答案的解決方案並將其適用於您的工作。
我儘可能簡單地回答了當前的答案,但不幸的是,即使是最基本的JavaFX FXML應用程序也需要相當多的代碼和標記才能工作。
我在Java
僅僅初學者不要使用FXML當你第一次開始開發您最初的Java和JavaFX應用程序。相反,只需在您的JavaFX代碼中使用標準Java API即可,其中還有很多tutorials以及優秀的Ensemble Sample可供參考。
請確保在開始JavaFX之前,您已完成所有Java Tutorial Trails Covering the Basics。只有Java的基礎知識才能開始使用JavaFX,您不需要分支學習Java企業版,就可以忘記Swing。
一旦您編寫了幾個基本的JavaFX應用程序,根據Java API手動編碼了一些佈局,並且達到了核心技術的舒適程度,則可以考慮在較大的應用程序中使用SceneBuilder和FXML。那時你可能會發現學習FXML非常簡單。 FXML屬性和元素只是Java API的反映。
請解釋一下你的代碼的其他-比平常位
我真的不能做,因爲我不知道什麼是不尋常的你。
如果您通過自己的知識或研究無法瞭解代碼的某些特定部分,則可針對每個困難的概念使用create a new StackOverflow question。
每當我試試這個,會出現以下錯誤: https://docs.google.com/document/d/1-meEWGRc94_RswP966e44tJiLeSWM_x3JQ9i119-kWQ/edit?usp=sharing –
也許是另一個問題,請打開一個新問題併發布'DarknessFXMLController'和您的'fxml'文件的代碼。 – tarrsalah
@PratikAnand你得到'NPE'是因爲在調用'load()'('load()'在內部調用'initialize()'''時''stage'不會附加到'scene'。 –