JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen

Nemesys88

Bekanntes Mitglied
Hallo zusammen!

Bin noch JavaFX - Neuling und habe jetzt ein Problem:

Angenommen ich habe 2 Fenster mit entsprechenden Controllern:

A.fxml mit A.java (Controller) und
B.fxml mit B.java (Controller)

Jetzt hab ich in der A.fxml eine Combobox und in der B.fxml einen Button "Bearbeiten".

Ich möchte jetzt gerne im Fenster B auf den Button klicken und eine Action hervorrufen, die in Fenster A der ComboBox ein Item hinzufügt.

Leider bringt es nichts in B.java einfach:

b_bearbeiten.setOnAction(e -> {
A.tueEtwas();
});

aufzurufen und in

A.java:

public void tueEtwas()
{
cb.getItems().add("neues Item");
}

Der Versuch endet trotzdem in einer NullPointerException - obwohl der A-Controller ja seine GUI-Elemente kennen müsste....

Also wie mache ich sowas, so generell?

Danke schonmal!
 

Flown

Administrator
Mitarbeiter
Wenn beide Controller geladen wurden(über den FXMLLoader), hat man die Möglichkeit den Controller(loader.getController()) als Referenz weiterzugeben und auf diesen Operationen auszuführen.
 

Nemesys88

Bekanntes Mitglied
Okay, jetzt hab ich in der Buttonverarbeitung (B.java) folgendes stehen:

Java:
        b_bearbeiten.setOnAction(e -> {
          
            FXMLLoader loader = new FXMLLoader(getClass().getResource("A.fxml"));
            try {
                loader.load();
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            A controller = loader.getController();
            controller.tueEtwas();
        
        });

und im Controller von Klasse A steht:

Java:
public void tueEtwas()
{
System.out.println("Test");
cb.getItems().add("neues Item");
}

Er führt jetzt alles ohne zu meckern aus, die Testausgabe kommt, aber die ComboBox reagiert noch nicht...
 

Flown

Administrator
Mitarbeiter
Weil du wahrscheinlich die FXML schon mal geladen hast. Du musst aber den loader verwenden den du zuerst genutzt hast und nicht neu laden!
 

Nemesys88

Bekanntes Mitglied
Ja, die wird in der Main.java geladen. Die sieht so aus (gekürzt):

Java:
        Parent root = FXMLLoader.load(getClass().getResource("A.fxml"));

        Scene scene = new Scene(root);

Weiss grade nicht, wie ich das jetzt codetechnisch umsetzen muss... :/
 

Flown

Administrator
Mitarbeiter
Ja und jetzt machst du sowas wie:
Java:
FXMLLoader loader = new FXMLLoader(getClass().getResource("A.fxml"));
AController aController = loader.getController();
FXMLLoader loaderB = ...; // Load B
BController bController = loader.getController();
bController.setAController(aController);

Und schon weiß dein Controller von B welcher der richtige für A ist.
 

Nemesys88

Bekanntes Mitglied
Java:
        b_bearbeiten.setOnAction(e -> {
           
            loader = new FXMLLoader(getClass().getResource("A.fxml"));
            AController aController = loader.getController();
            loaderB = new FXMLLoader(getClass().getResource("B.fxml"));
            BController bcontroller = loader.getController();
            bcontroller.setAController(aController);
              
    }

private void setAController(AController aController) {
        loaderB.setController(aController);
    }

Irgendwie kann ich auch nicht glauben, dass das so kompliziert sein soll die ComboBox aus'm AController anzusprechen...

zumal ich nach wie vor nicht verstehe, warum auch der AController die Komponente nicht mehr ansprechen kann wenn ich aus B.java "A.tueEtwas()" aufrufe, findet die Verarbeitung ja in meinem AController (A.java) statt... (siehe start-post)
 

Flown

Administrator
Mitarbeiter
Ein kleine Beispiel dazu:
Java:
import javafx.event.ActionEvent;
import javafx.fxml.FXML;

public class AController {

   private BController bController;
   private int counter;

   public void setbController(BController bController) {
     this.bController = bController;
   }

   @FXML
   private void initialize() {
     counter = 0;
   }

   @FXML
   private void changeLabel(ActionEvent e) {
     bController.setText("Counter: " + counter++);
   }

}
Java:
import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class BController {

   @FXML
   private Label textLabel;

   public void setText(String text) {
     textLabel.setText(text);
   }
}
Java:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class Main extends Application {@Override
   public void start(Stage primaryStage) {
     try {
       FXMLLoader aLoader = new FXMLLoader(getClass().getResource("A.fxml"));
       Parent aRoot = aLoader.load();
       AController aController = aLoader.getController();

       FXMLLoader bLoader = new FXMLLoader(getClass().getResource("B.fxml"));
       Parent bRoot = bLoader.load();
       BController bController = bLoader.getController();

       aController.setbController(bController);
       //
       Stage bStage = new Stage();
       bStage.setX(100);
       bStage.setY(150);
       bStage.setScene(new Scene(bRoot, 150, 100));
       bStage.show();

       primaryStage.setScene(new Scene(aRoot, 150, 100));
       primaryStage.setX(400);
       primaryStage.setY(150);
       primaryStage.show();
     } catch (Exception e) {
       e.printStackTrace();
     }
   }

   public static void main(String[] args) {
     launch(args);
   }
}
XML:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<BorderPane
  xmlns="http://javafx.com/javafx/8.0.40"
  xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.AController">
  <center>
  <Button fx:id="clickMe" mnemonicParsing="false" onAction="#changeLabel" text="Click me!" BorderPane.alignment="CENTER" />
  </center>
</BorderPane>
XML:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<BorderPane
  xmlns="http://javafx.com/javafx/8.0.40"
  xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.BController">
  <center>
  <Label fx:id="textLabel" text="&lt;EMPTY&gt;" />
  </center>
</BorderPane>
 

Nemesys88

Bekanntes Mitglied
Danke erstmal.

Ich hab versucht das nachzubauen, komme immernoch auf eine Nullpointer-Exception..

Hier mein aktueller Code:

Klasse B.java:

Java:
    private FXMLLoader loader;
    private A mfcontrol;

            loader = new FXMLLoader(getClass().getResource("A.fxml"));
            mfcontrol = loader.getController();
            mfcontrol.setMain(this);
            mfcontrol.hasResult("Administrator");

(hasResult ist dann die Methode wo im Hauptfenster etwas mit den GUI-Komponenten passieren soll)

Klasse A.java:

Java:
        @SuppressWarnings("unused")
    private Search searchcontrol;

public void setMain(Search searchcontroller) {
        this.searchcontrol = searchcontroller;
    }

Die NullPointerException kommt in der Zeile "mfcontrol.setMain(this)"...

Edit: Dazu gibt es die Main.java mit:
Java:
    Parent root = FXMLLoader.load(getClass().getResource("A.fxml"));

     Scene scene = new Scene(root);
 
Zuletzt bearbeitet:

Nemesys88

Bekanntes Mitglied
Das load() hab ich ja rausgenommen weil ich die A.fxml eigentlich schon beim Programmstart lade... (hab es 2 Posts weiter oben editiert damit der Zusammenhang klar wird). (Und wenn ich trotzdem noch ein load() dazwischen mache, dann macht er halt die Testausgaben aber arbeitet nicht mit den Komponenten weil ich sozusagen ne neue Instanz vom Controller erzeuge) Nur wie komm ich denn an die alte Instanz dran? -.-
 
Zuletzt bearbeitet:

Nemesys88

Bekanntes Mitglied
Habe mich jetzt einer anderen Lösungsmöglichkeit bedient, glaub die Idee hatte ich sogar mal von dir bekommen, in einem anderen Projekt ;)

Main.java:

Java:
FXMLLoader loader = A.getInstance();
Parent root = loader.load();
Scene scene = new Scene(root);

B.java:

Java:
loader = A.getInstance();
mfcontrol = loader.getController();
mfcontrol.hasResult("Teststring");

A.java:

Java:
public static FXMLLoader getInstance() 
{ if (INSTANCE == null) { INSTANCE = new FXMLLoader(A.class.getResource("A.fxml")); } 
return INSTANCE; }

Danke nochmals für die Hilfe und für deine Geduld... :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
wolfgang63 JavaFX Elemente einer Group entfernen AWT, Swing, JavaFX & SWT 1
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
S Swing Elemente einer JList Farbig hinterlegen AWT, Swing, JavaFX & SWT 6
T die Liste der Elemente aus einer JComboBox auslesen AWT, Swing, JavaFX & SWT 6
M Elemente statisch anordnen AWT, Swing, JavaFX & SWT 4
_user_q ChoiceBox Elemente: Sprache ändern AWT, Swing, JavaFX & SWT 7
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
J JavaFX JavaFX Elemente an Fenstergröße skalieren AWT, Swing, JavaFX & SWT 5
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
T LayoutManager Anordnen der Elemente im GridBagLayout AWT, Swing, JavaFX & SWT 11
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
sandaime Swing 3 JComboBoxen ausgelesen Elemente einzel ausgeben AWT, Swing, JavaFX & SWT 6
M JavaFX GUI-Elemente erstellen, nachdem die GUI geladen hat AWT, Swing, JavaFX & SWT 4
TheJavaKid JavaFX Elemente positionieren AWT, Swing, JavaFX & SWT 2
D JavaFX Elemente aus VBox unterscheiden AWT, Swing, JavaFX & SWT 1
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
O Ähnliche GUI Elemente - vererbung?! AWT, Swing, JavaFX & SWT 0
M AWT Gui anzeige Probes - Elemente erscheinen nicht regelmäßig AWT, Swing, JavaFX & SWT 2
M Swing JTabbedPane: Tab-Elemente anpassen AWT, Swing, JavaFX & SWT 3
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
T Alle Swing-Elemente anzeigen AWT, Swing, JavaFX & SWT 9
M Swing Elemente im Dialog neu "laden". AWT, Swing, JavaFX & SWT 6
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
S Elemente im Panel in richtige Ausgangsstellung bringen AWT, Swing, JavaFX & SWT 10
K LayoutManager Wieso verschwinden Elemente? AWT, Swing, JavaFX & SWT 20
M JFrame + JNA/aero modul - GUI Elemente so möglich? AWT, Swing, JavaFX & SWT 28
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
R Größe/Anordnung der Gui-Elemente automatisch? AWT, Swing, JavaFX & SWT 6
S JVM von Oracle/Sun soll für AWT/SWING Elemente die die Optimierungen der NVidia Treiber verwenden AWT, Swing, JavaFX & SWT 3
C Swing JFrame nimmt keine anderen Elemente auf AWT, Swing, JavaFX & SWT 13
R JApplet, Elemente unsichtbar AWT, Swing, JavaFX & SWT 2
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
L ID für GUI Elemente generieren AWT, Swing, JavaFX & SWT 11
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
P Elemente im Kreis aufstellen AWT, Swing, JavaFX & SWT 5
G Swing Elemente aus Arraylist auf JFrame anzeigen AWT, Swing, JavaFX & SWT 9
G GUI Elemente aus NetBeans verwenden AWT, Swing, JavaFX & SWT 8
L SWT tree elemente markieren AWT, Swing, JavaFX & SWT 4
C Swing Elemente in JList sortieren AWT, Swing, JavaFX & SWT 2
T Elemente zu JList dynamisch hinzufügen AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
F JScrollPane überlagert andere Elemente AWT, Swing, JavaFX & SWT 5
K Swing Elemente auf Zeichenfeld verschieben AWT, Swing, JavaFX & SWT 8
S Mit eigener Klasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
E Swing JList zur Laufzeit hinzugefügt elemente nicht sichtbar?! AWT, Swing, JavaFX & SWT 2
B Swing Dynamisch Elemente in JScrollPane hinzufügen AWT, Swing, JavaFX & SWT 6
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
T DND mit JList Elemente nicht am Ende einfügen AWT, Swing, JavaFX & SWT 3
Tobse Swing JList elemente hinzufügen AWT, Swing, JavaFX & SWT 4
K JLayeredPane Elemente auf gleicher Position AWT, Swing, JavaFX & SWT 7
D Elemente werden nicht angezeigt AWT, Swing, JavaFX & SWT 2
W jComboBox unterschiedlich selectable elemente AWT, Swing, JavaFX & SWT 7
M Elemente in JTabbedPane platzieren AWT, Swing, JavaFX & SWT 7
N Swing JList Elemente ausgeben fehlerhaft AWT, Swing, JavaFX & SWT 4
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
M.F.G. Fehler bei der Anzeige Grafischer Elemente AWT, Swing, JavaFX & SWT 13
B Swing Problem beim Elemente zu JList hinzufügen AWT, Swing, JavaFX & SWT 5
C (Swing)GUI-Elemente werden nicht aktualisiert. AWT, Swing, JavaFX & SWT 2
P JList: Reihenfolge der Elemente per Drag'n'Drop ändern. AWT, Swing, JavaFX & SWT 9
M Swing JList - Elemente umbenennen? AWT, Swing, JavaFX & SWT 4
MrMilti Gezeichnete Java2D Elemente mit Events versehen AWT, Swing, JavaFX & SWT 3
H [gelöst] Swing Elemente verdecken AWT, Swing, JavaFX & SWT 14
B In externer Eventhandlerklasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
K BoxLayout skaliert die "falschen" Elemente AWT, Swing, JavaFX & SWT 5
A SWT - Elemente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 6
S Andere Elemente in JComboBox anzeigen AWT, Swing, JavaFX & SWT 2
T Elemente werden nicht direkt angezeigt AWT, Swing, JavaFX & SWT 3
S Nachträglich Swing-Elemente in JFrame erzeugen AWT, Swing, JavaFX & SWT 18
K Titel für eingebundene Elemente wie JPanel AWT, Swing, JavaFX & SWT 3
F Dynamische Swing Elemente AWT, Swing, JavaFX & SWT 10
B Grafische Anordnung der Elemente AWT, Swing, JavaFX & SWT 2
S JComboBox zeigt beim 1. öffnen nur 2 Elemente ? AWT, Swing, JavaFX & SWT 9
J LayoutManager der Elemente untereinander anordnet. AWT, Swing, JavaFX & SWT 11
S Zugriff auf Elemente funktioniert mit SWING nicht mehr AWT, Swing, JavaFX & SWT 5
G JButton und andere J-Elemente: Markierung ausblenden AWT, Swing, JavaFX & SWT 6
Paule alle Elemente eines SWT Trees AWT, Swing, JavaFX & SWT 8
S List Elemente AWT, Swing, JavaFX & SWT 4
G Elemente erst da wenn mit Maus drüber gefahren bin AWT, Swing, JavaFX & SWT 2
E GUI-Elemente aus txt- oder xml-File erstellen? AWT, Swing, JavaFX & SWT 5
J FAQ programmieren, welche Swing-Elemente AWT, Swing, JavaFX & SWT 7
M Elemente hängen dicht aufeinander AWT, Swing, JavaFX & SWT 2
S Falsche Position, Elemente erscheinen nicht, Flackern AWT, Swing, JavaFX & SWT 6
DEvent Je nach Auswahl in Liste entsprechende Input-Elemente anzeig AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben