Probenlösung
Sie die Bühne, die Technik von in der Steuerung initialisieren kann mit: Passing Parameters JavaFX FXML.
Hier ist ein Beispielprogramm, das ein Dienstprogrammfenster erstellt, das die X- und Y-Koordinaten des Bildschirms verfolgt, während Sie das Dienstprogrammfenster ziehen. Der Inhalt des Dienstprogrammfensters wird in einem für fxml definierten Fenster gerendert.
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>
Alternative Lösungen
tarrsalah Antwort nur die Bühne von einer @FXML Komponente immer ist auch ein guter Weg, wenn Sie, dass die Wurzelkomponente des Controllers kennen bereits zu einem hinzugefügt Szene, die bereits zu einer Bühne hinzugefügt wurde (was oft der Fall ist, wenn so etwas wie ein Button Event Handler ausgelöst wird).
Eine andere Möglichkeit, dies zu tun, ist ähnlich der Antwort von tarrsalah, aber ChangeListeners für die scene -Eigenschaft eines @ FXML-Knotens und die window -Eigenschaft der geänderten Szene zu verwenden. Auf diese Weise können Sie Änderungen an Szene und Bühne verfolgen, falls das Fenster in eine neue Szene oder Bühne verschoben wird. Meistens müssen Sie diese Änderungen jedoch nicht verfolgen, da die meisten Fenster nur zu einer einzelnen Szene hinzugefügt werden, die auf einer Bühne bleibt.
Antworten auf weitere Fragen und Kommentare
Kann ich eine einfachere Antwort?
tarrsalah bereits eine einfachere Antwort zur Verfügung gestellt.
Das einzige Problem mit einer einfacheren Antwort in diesem Fall ist, dass es nicht genügend Kontext bietet, um die Antwortlösung zu replizieren und an Ihre Arbeit anzupassen.
Ich machte meine aktuelle Antwort so einfach wie ich konnte, aber leider benötigt sogar die grundlegendste JavaFX FXML-Anwendung einiges an Code und Markup, um zu funktionieren.
Ich bin nur ein Anfänger in Java
nicht FXML verwenden, wenn Sie zuerst beginnen, Ihre ersten Java und JavaFX-Anwendungen zu entwickeln. Stattdessen bleiben Sie einfach mit dem Standard in Ihrem JavaFX-Code, für den es viele weitere tutorials sowie die ausgezeichnete Ensemble Sample zu beziehen gibt.
Vergewissern Sie sich vor Beginn von JavaFX, dass Sie alle Java Tutorial Trails Covering the Basics abgeschlossen haben. Nur die Grundlagen von Java sind erforderlich, um JavaFX zu verwenden, Sie müssen nicht in Java Enterprise Edition verzweigen und können Swing vergessen.
Erwägen Sie die Verwendung von SceneBuilder und FXML für größere Anwendungen, sobald Sie ein paar grundlegende JavaFX-Anwendungen geschrieben haben, einige Layouts nach Java-API handkodiert und ein hohes Maß an Komfort mit den Kerntechnologien erreicht haben. Zu dieser Zeit werden Sie wahrscheinlich feststellen, dass das Lernen von FXML ziemlich einfach ist. FXML-Attribute und -Elemente spiegeln nur die Java-APIs wider.
erklären Sie bitte die anderen als üblich Bits des Codes
kann ich nicht wirklich tun, dass ich weiß nicht, was für Sie ungewöhnlich ist.
Wenn es bestimmte Teile des Codes gibt, die Sie nicht durch Ihr eigenes Wissen oder Forschung verstehen können, create a new StackOverflow question für jedes schwierige Konzept.
Immer, wenn ich dies versuchen, der folgende Fehler auftritt: https://docs.google.com/document/d/1-meEWGRc94_RswP966e44tJiLeSWM_x3JQ9i119-kWQ/edit?usp=sharing –
Vielleicht ist ein anderes Problem, öffne eine neue Frage und poste den Code 'DarknessFXMLController' und deine' fxml' Datei. – tarrsalah
@PratikAnand Sie haben 'NPE', weil beim Aufruf von' load() 'keine' stage' an die 'scene' angehängt ist (wobei' load() 'intern' initialize() 'aufruft). –