Hallo, das Thema gehört vermutlich eher zu den Anfängerfragen - aber hier ist es wegen der Verwendung von JavaFX auch angebracht.
Ich möchte für die bessere Übersicht ein JavaFX-Projekt so gestalten, dass es ein Haupfenster gibt (eine "Main"FXML mit dem "MainController").
In dieses kommt dann eine TabPane rein.
Jedes Tab soll seine eigene FXML und seinen eigenen Controller haben, da sich das meiste immer innerhalb dieser "Unterprogramme" abspielt.
Da es sich aber um eine einzige Gesamt-Applikation handelt, ist es teilweise notwendig, dass ein Controller auf Methoden eines anderen Controllers zugreifen kann und mit diesem Daten austauschen kann.
Sowohl der "MainController" muss auf die einzelnen "TabController" zugreifen können (wie auch umgekehrt die TabController auf den MainController) und die TabController untereinander ebenso.
Hier fehlt mir komplett der intellektuelle Zugang...
Ich habe den ganzen Tag verschiedene Ansätze aus anderen Post der weltweiten Intelligenz verfolgt, scheitere aber immer. Oft liest man auch den Vorschlag, eine "Factory" dafür zu verwenden - aber das ist dann sicher auch nicht banal und vor allem verstehe ich dann die tiefere Funktionsweise garantiert nicht. Und ein Verständnis wäre mir schon angenehm...
Ich habe ein simples Gerüst für so eine Anwendung erstellt, nur 2 Tabs, einmal mit einem Label und der andere mit einer CheckBox, das MainFormular hat außer der TabPane, welche mit diesen beiden Tabs gefüllt ist noch einen Button:
der Tab1Controller "FXMLTab1Controller.java":
und dazu das FXML-file "FXMLTab1.fxml":
der Tab2Controller "FXMLTab2Controller.java":
und dazu das FXML-file"FXMLTab2.fxml":
dann der MainController "FXMLmainController.java":
und dessen FXML-file "FXMLmain.fxml":
und die "Projekt-Chefdatei""MyControllerTest.java"::
Dieses Gerüst macht natürlich noch nichts - aber alle meine Versuche mit den zusammengelesenen Tips scheiterten.
Was muss ich z.B. tun, um in der "do_something()" Methode des MainControllers das Label des Tab1Controllers zu beeinflussen?
Die Existenz des Tab1Controllers und dessen Elementen muss doch irgendwie im MainController bekannt gemacht werden können (was ja mit " @FXML private FXMLTab1Controller fXMLTab1Controller;" bereits möglich sein könnte? Aber irgendwelche Zuweisungen mit fXMLTab1Controller.label1 wie beiner einfachen Komponente funktionieren nicht, da das keine echte Instanz ist. Aber wie deklariere ich das dann?
Sorry, ich tue mir zugegebenermaßen schon mächtig schwer mit der Struktur dieser Hochsprache und hoffe auf größtmögliche Nachsicht.
Kann mich jemand erleuchten und meine Pein mildern?
Danke!
meine Entwicklungsumgebung:
Product Version: NetBeans IDE 8.2 (Build 201705191307)
Updates: NetBeans IDE is updated to version NetBeans 8.2 Patch 2
Java: 1.8.0_112; Java HotSpot(TM) 64-Bit Server VM 25.112-b15
Runtime: Java(TM) SE Runtime Environment 1.8.0_112-b15
System: Windows 7 version 6.1 running on amd64; Cp1252; de_DE (nb)
Ich möchte für die bessere Übersicht ein JavaFX-Projekt so gestalten, dass es ein Haupfenster gibt (eine "Main"FXML mit dem "MainController").
In dieses kommt dann eine TabPane rein.
Jedes Tab soll seine eigene FXML und seinen eigenen Controller haben, da sich das meiste immer innerhalb dieser "Unterprogramme" abspielt.
Da es sich aber um eine einzige Gesamt-Applikation handelt, ist es teilweise notwendig, dass ein Controller auf Methoden eines anderen Controllers zugreifen kann und mit diesem Daten austauschen kann.
Sowohl der "MainController" muss auf die einzelnen "TabController" zugreifen können (wie auch umgekehrt die TabController auf den MainController) und die TabController untereinander ebenso.
Hier fehlt mir komplett der intellektuelle Zugang...
Ich habe den ganzen Tag verschiedene Ansätze aus anderen Post der weltweiten Intelligenz verfolgt, scheitere aber immer. Oft liest man auch den Vorschlag, eine "Factory" dafür zu verwenden - aber das ist dann sicher auch nicht banal und vor allem verstehe ich dann die tiefere Funktionsweise garantiert nicht. Und ein Verständnis wäre mir schon angenehm...
Ich habe ein simples Gerüst für so eine Anwendung erstellt, nur 2 Tabs, einmal mit einem Label und der andere mit einer CheckBox, das MainFormular hat außer der TabPane, welche mit diesen beiden Tabs gefüllt ist noch einen Button:
der Tab1Controller "FXMLTab1Controller.java":
Java:
package mytest;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
/**
* FXML Controller class
*
* @author hth
*/
public class FXMLTab1Controller implements Initializable {
@FXML
private AnchorPane tab1;
@FXML
public Label label1;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
und dazu das FXML-file "FXMLTab1.fxml":
Java:
<?xml version="1.0" encoding="UTF-8"?>
<?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.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mytest.FXMLTab1Controller">
<children>
<Label fx:id="label1" layoutX="42.0" layoutY="46.0" prefHeight="17.0" prefWidth="50.0" text="Label" />
</children>
</AnchorPane>
der Tab2Controller "FXMLTab2Controller.java":
Java:
package mytest;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.AnchorPane;
/**
* FXML Controller class
*
* @author hth
*/
public class FXMLTab2Controller implements Initializable {
@FXML
private AnchorPane tab2;
@FXML
private CheckBox checkbox1;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
und dazu das FXML-file"FXMLTab2.fxml":
Java:
<?xml version="1.0" encoding="UTF-8"?>
<?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.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mytest.FXMLTab2Controller">
<children>
<CheckBox fx:id="checkbox1" layoutX="23.0" layoutY="59.0" mnemonicParsing="false" text="CheckBox" />
</children>
</AnchorPane>
dann der MainController "FXMLmainController.java":
Code:
package mycontrollertest;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
/**
*
* @author hth
*/
public class FXMLmainController implements Initializable {
@FXML private Button but_main;
@FXML private FXMLTab1Controller fXMLTab1Controller;
@FXML private FXMLTab2Controller fXMLTab2Controller;
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
@FXML
private void do_something(ActionEvent event) {
}
}
und dessen FXML-file "FXMLmain.fxml":
Code:
<?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 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="mycontrollertest.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>
und die "Projekt-Chefdatei""MyControllerTest.java"::
Java:
package mycontrollertest;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
*
* @author hth
*/
public class MyControllerTest extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLmain.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
Dieses Gerüst macht natürlich noch nichts - aber alle meine Versuche mit den zusammengelesenen Tips scheiterten.
Was muss ich z.B. tun, um in der "do_something()" Methode des MainControllers das Label des Tab1Controllers zu beeinflussen?
Die Existenz des Tab1Controllers und dessen Elementen muss doch irgendwie im MainController bekannt gemacht werden können (was ja mit " @FXML private FXMLTab1Controller fXMLTab1Controller;" bereits möglich sein könnte? Aber irgendwelche Zuweisungen mit fXMLTab1Controller.label1 wie beiner einfachen Komponente funktionieren nicht, da das keine echte Instanz ist. Aber wie deklariere ich das dann?
Sorry, ich tue mir zugegebenermaßen schon mächtig schwer mit der Struktur dieser Hochsprache und hoffe auf größtmögliche Nachsicht.
Kann mich jemand erleuchten und meine Pein mildern?
Danke!
meine Entwicklungsumgebung:
Product Version: NetBeans IDE 8.2 (Build 201705191307)
Updates: NetBeans IDE is updated to version NetBeans 8.2 Patch 2
Java: 1.8.0_112; Java HotSpot(TM) 64-Bit Server VM 25.112-b15
Runtime: Java(TM) SE Runtime Environment 1.8.0_112-b15
System: Windows 7 version 6.1 running on amd64; Cp1252; de_DE (nb)