Java JavaFX: Controller - initialize() / FXML Anbindung

CitroenDsVier

Lt. Commander
Registriert
Dez. 2013
Beiträge
1.885
Hallo zusammen,

ich habe folgendes Problem: Die FXML-Anbindung an den Controller funktioniert soweit (IntelliJ zeigt kleine Icons und markiert Quellcode entsprechend). Ich kann aber keinem Element eine Eigenschaft setzen oder korregt abfragen.

Erstmal der Code zum besseren Verständnis:

Controller.java
Code:
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable {
    public TabPane tabPane;
    public Tab tClients;
    public Tab tDocs;
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        tabPane = new TabPane();
        tClients = new Tab("Kunden");
        tDocs = new Tab("Ärzte");
        tClients.setClosable(false);
        tabPane.getTabs().add(tClients);
        tabPane.getTabs().add(tDocs);

        System.out.println("initialized.");
        System.out.println(tClients.isClosable() + " - " + tDocs.isClosable());
    }
}

gui.fxml
Code:
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.Tab?>
<TabPane fx:controller="Controller" fx:id="tabPane" xmlns:fx="http://javafx.com/fxml">
    <Tab fx:id="tClients" text="Kunden">

    </Tab>
    <Tab fx:id="tDocs" text="Ärzte" closable="false">

    </Tab>
</TabPane>

Konkret geht es jetzt um die Eigenschaft "closable" der Tabs. Diese kann ich im FXML problemlos setzen, funktioniert auch bei Ausführung des Programms. Allerdings kann ich diesen Zustand der Tab-Objekte vom Controller aus nicht einsehen, da sind alle Tabs immer (unabhängig von dem, was in der FXML steht) closable=true.
Setze ich die Closable-Eigenschaft im Controller (mit meiner Zeile "tClients.setClosable(false);"), stimmt zwar meine System out println-Abfrage nach der Eigenschaft mit dem Gesetzten überein, dafür sind bei Ausführung des Programms beide Tabs trotz im Controller auf "false" gesetzter closable-Eigenschaft trotzdem closable.

Ebenso war das Verhalten beim Titel der Tabs: Im Controller erstelle ich die Tabs, übergebe dem Konstruktor den Titel, der aber nicht angezeigt wird. Erst das Setzen des "text" Feldes in der FXML hat den Titel bei Ausführung des Programms auch in die Tabs gebracht.

IntelliJ suggeriert aber wie gesagt eine "Verbindung" zwischen Controller und FXML über die kleinen Icons am Rand (siehe Screenshot), außerdem gibt es in der FXML keine "not bound" oder andere Fehler.

Wo liegt hier das Problem?
 

Anhänge

  • JavaFX.png
    JavaFX.png
    63,4 KB · Aufrufe: 596
Kann es sein, dass du die 3 Attribute im Controller noch jeweils mit @FXML annotieren musst?
 
Ich hab's nochmal in IntelliJ probiert. Das Problem ist, dass du mit
Java:
tClients = new Tab("Kunden");
tDocs = new Tab("Ärzte");
die Tabs, die aus dem FXML geladen werden, mit zwei neuen überschreibst.

Wenn du dir die Werte von isClosable vorher anschaust, stimmen sie.

Die Implementierung von isClosable liefert dir dann natürlich einen default Wert von true zurück.
 
Ah, logisch! Vielen Dank für die Mühe :)

Ich kann mir sogar das manuelle adden:
Java:
tabPane.getTabs().add(tClients);
tabPane.getTabs().add(tDocs);
schenken, sonst hab ich am Ende 4 Tabs. - Gerade herausgefunden.
 
Zurück
Oben