Hallo,
ich definiere FXML innerhalb eines FXLM-Files. Das funktioniert recht gut mit
<fx:include fx:id="xxx" source="FXMLxxx.fxml" />
Beim Zugriff auf Nodes von diesem auf auf weitere FXML hatte ich erhebliche Probleme.
Die Lösung vom User Knoten (JavaFX in mehrere Controller aufteilen) funktioniert, scheint mir aber recht mühsam mit 100 und mehr Nodes.
Deshalb habe ich eine andere Lösung gesucht, welche ich hier zur Diskussion stellen will.
meine Applikation:
- ich öffne mehrere gleiche Fenster (haben den gleichen Controller)
- ich öffne verschiedene Fenster (haben verschiedene Controller)
da die FXLM in der Reihenfolge FXMLTab1, FXMLTab2, FXMLMain abgearbeitet werden generiere ich nach dem laden von ein Event auf Tab1 und Tab2.
Damit habe ich auch alle Components in Tab1 und Tab2.
Vielleicht hat jemand von euch eine bessere Lösung ??
FXMLMain.xml:
FXMLMainController.java:
FXMLTab1.fxml:
FXMLTab1Controller.java
FXMLTab2.fxml:
FXMLTab2Controller.java
Cla1.java
ich definiere FXML innerhalb eines FXLM-Files. Das funktioniert recht gut mit
<fx:include fx:id="xxx" source="FXMLxxx.fxml" />
Beim Zugriff auf Nodes von diesem auf auf weitere FXML hatte ich erhebliche Probleme.
Die Lösung vom User Knoten (JavaFX in mehrere Controller aufteilen) funktioniert, scheint mir aber recht mühsam mit 100 und mehr Nodes.
Deshalb habe ich eine andere Lösung gesucht, welche ich hier zur Diskussion stellen will.
meine Applikation:
- ich öffne mehrere gleiche Fenster (haben den gleichen Controller)
- ich öffne verschiedene Fenster (haben verschiedene Controller)
da die FXLM in der Reihenfolge FXMLTab1, FXMLTab2, FXMLMain abgearbeitet werden generiere ich nach dem laden von ein Event auf Tab1 und Tab2.
Damit habe ich auch alle Components in Tab1 und Tab2.
Vielleicht hat jemand von euch eine bessere Lösung ??
FXMLMain.xml:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane fx:id="AnchorPane" id="AnchorPane" prefHeight="329.0" prefWidth="308.0" xmlns="http://javafx.com/javafx/8.0.60"
xmlns:fx="http://javafx.com/fxml/1" fx:controller="mytest.FXMLMainController" >
<children>
<TabPane layoutX="26.0" layoutY="10.0" prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
<tabs>
<Tab text="tab1">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="106.0" prefWidth="200.0">
<children>
<fx:include fx:id="tab1" source="FXMLTab1.fxml" />
</children>
</AnchorPane>
</content>
</Tab>
<Tab text="tab2">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<fx:include fx:id="tab2" source="FXMLTab2.fxml" />
</children>
</AnchorPane>
</content>
</Tab>
</tabs>
</TabPane>
<Button fx:id="but_main" layoutX="126.0" layoutY="290.0" mnemonicParsing="false" onAction="#do_something" text="mainbutton" />
</children>
</AnchorPane>
FXMLMainController.java:
Java:
package mytest;
import java.net.URL;
import java.util.HashMap;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
public class FXMLMainController implements Initializable {
private HashMap<String, Node> Comps = new HashMap<>();
@FXML private AnchorPane AnchorPane;
@Override
public void initialize(URL url, ResourceBundle rb) {
Comps = (HashMap) Cla1.LeseComps(AnchorPane).clone();
((Button) Comps.get("B1")).fire();
((Button) Comps.get("B2")).fire();
}
@FXML
private void do_something(ActionEvent event) {
((Label)Comps.get("label1")).setRotate(((Label)Comps.get("label1")).getRotate()+20);
}
}
XML:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane id="AnchorPane" fx:id="tab1" prefHeight="126.0" prefWidth="127.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mytest.FXMLTab1Controller">
<children>
<Label fx:id="label1" layoutX="44.0" layoutY="14.0" prefHeight="17.0" prefWidth="104.0" text="Label" />
<Button fx:id="B1" layoutX="14.0" layoutY="87.0" mnemonicParsing="false" onAction="#ini_Comp" text="B1" />
<TextField fx:id="text1" layoutX="14.0" layoutY="51.0" onAction="#rot_but_main" prefHeight="25.0" prefWidth="126.0" text="Text" />
</children>
</AnchorPane>
Java:
package mytest;
import java.net.URL;
import java.util.HashMap;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
public class FXMLTab1Controller implements Initializable {
@FXML private Button B1;
@FXML private TextField text1;
private HashMap<String, Node> Comps = new HashMap<>();
@Override
public void initialize(URL url, ResourceBundle rb) {
B1.setVisible(false);
}
@FXML private void ini_Comp(ActionEvent event) {
Comps = (HashMap) Cla1.Comps.clone();
}
@FXML private void rot_but_main(ActionEvent event) {
((Button) Comps.get("but_main")).setRotate(((Button) Comps.get("but_main")).getRotate() + 20);
}
}
XML:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane id="AnchorPane" fx:id="tab2" prefHeight="135.0" prefWidth="118.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mytest.FXMLTab2Controller">
<children>
<CheckBox fx:id="checkbox1" layoutX="23.0" layoutY="25.0" mnemonicParsing="false" onAction="#rot_text1" text="CheckBox" />
<Button fx:id="B2" layoutX="23.0" layoutY="83.0" mnemonicParsing="false" onAction="#ini_Comp" text="B2" />
</children>
</AnchorPane>
Java:
package mytest;
import java.net.URL;
import java.util.HashMap;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
public class FXMLTab2Controller implements Initializable {
@FXML private Button B2;
@FXML private CheckBox checkbox1;
private HashMap<String, Node> Comps = new HashMap<>();
@Override
public void initialize(URL url, ResourceBundle rb) {
B2.setVisible(false);
}
@FXML private void ini_Comp(ActionEvent event) {
Comps = (HashMap) Cla1.Comps.clone();
}
@FXML private void rot_text1(ActionEvent event) {
((TextField) Comps.get("text1")).setRotate(((TextField) Comps.get("text1")).getRotate() + 20);
}
}
Java:
package mytest;
import java.util.HashMap;
import javafx.scene.Node;
import javafx.scene.control.SplitPane;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextArea;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
public class Cla1 {
static public HashMap<String, Node> Comps = new HashMap<>();
public static HashMap LeseComps(Node N) {
Comps.clear();
LeseCompsSub(N);
return Comps;
}
private static void LeseCompsSub(Node N) {
int anz = ((AnchorPane) N).getChildren().size();
for (int i = 0; i < anz; i++) {
Node N1 = ((AnchorPane) N).getChildren().get(i);
switch (N1.getClass().getSimpleName()) {
case "AnchorPane": {
LeseCompsSub(((AnchorPane) N1));
break;
}
case "TabPane": {
int CNT = ((TabPane) N1).getTabs().size();
for (int j = 0; j < CNT; j++) {
LeseCompsSub((((TabPane) N1).getTabs().get(j)).getContent());
//Comps = LeseCompsSub((((TabPane) ((AnchorPane) N).getChildren().get(i)).getTabs().get(j)).getContent(), Comps);
}
break;
}
case "SplitPane": {
int CNT = ((SplitPane) N1).getItems().size();
for (int j = 0; j < CNT; j++) {
LeseCompsSub(((SplitPane) N1).getItems().get(j));
}
break;
}
case "VBox": {
int CNT = ((VBox) N1).getChildren().size();
for (int j = 0; j < CNT; j++) {
if (((VBox) N1).getChildren().get(j).getClass().getSimpleName().equals("AnchorPane")) {
LeseCompsSub(((VBox) N1).getChildren().get(j));
} else {
Comps.put(((VBox) N1).getChildren().get(j).getId(), ((VBox) N1).getChildren().get(j));
}
}
break;
}
case "HBox": {
int CNT = ((HBox) N1).getChildren().size();
for (int j = 0; j < CNT; j++) {
if (((HBox) N1).getChildren().get(j).getClass().getSimpleName().equals("AnchorPane")) {
LeseCompsSub(((HBox) N1).getChildren().get(j));
} else {
Comps.put(((HBox) N1).getChildren().get(j).getId(), ((HBox) N1).getChildren().get(j));
}
}
break;
}
default:
Comps.put(((AnchorPane) N).getChildren().get(i).getId(), ((AnchorPane) N).getChildren().get(i));
switch (((AnchorPane) N).getChildren().get(i).getClass().getSimpleName()) {
case "TextArea": {
((TextArea) ((AnchorPane) N).getChildren().get(i)).setText("gaga");
break;
}
}
}
}
}
}