Erste Schritte JavaFX - wie von "externer" Klasse auf Methoden des Controllers zugreifen

Knoten

Mitglied
Hallo Profis!

Ich plage mich gerade mit einer grundsätzlichen Frage zur
Pogrammstruktur mit JavaFX.

Ich habe eine Oberfläche mit dem SceneBuilder (Projekt JavaFX mit FXML Application) erstellt und darin befindet sich eine "TextArea".

Nun wird das dort alles schön in 3 Dateien aufgespalten:

In der TextArea möchte ich nun verschiedene Statusmeldungen zur Anzeige
bringen.
Das ist innerhalb der Controllerklasse aus auch gar keinProblem, da dort die TextArea über
@FXML
private TextArea myTextArea;
einfach definiert ist.

Nun habe ich aber z. B. eine weitere separate Klasse "WireClass.java" , welche
eine Datenübertragung behandelt.
Von dieser Klasse aus weiß ich jedoch nicht wie ich auf die Elemente meiner GUI zugreifen kann, d.h. wie ich von dort einen Text in meine TextArea hineinschreiben kann, da ich null Plan habe, wie ich deren Existenz in der Komponente "wireClass" definiere.

Das kann doch nicht so schwer sein??? Ich blicke hier aber keine 2cm durch... (bin natürlich zu allem Überfluss auch maximaler Java Anfänger).

Kann mich jemand erleuchten?

Hier meine 4 Test-Dateien:

MyTest.java:
Java:
package mytest;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MyTest extends Application {
  
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.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);
    }
  
}

FXMLDocument.fxml:
Java:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane id="AnchorPane" prefHeight="452.0" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.60" fx:controller="mytest.FXMLDocumentController">
    <children>
      <TextArea fx:id="myTextArea" layoutX="73.0" prefHeight="288.0" prefWidth="200.0" />
      <Button fx:id="myButton" layoutX="96.0" layoutY="322.0" mnemonicParsing="false" onAction="#handleButtonAction" text="Button" />
    </children>
</AnchorPane>

FXMLDocumentController.java:
Java:
package mytest;

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;
import javafx.scene.control.TextArea;


public class FXMLDocumentController implements Initializable {
   
    WireClass wireClass = new WireClass();
   
    //private Label label;
    @FXML
    private TextArea myTextArea;
   
    @FXML
    private Button myButton;
   
    public void showinfo(String inhalt) {
        myTextArea.appendText(inhalt+"\n");
    }
   
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }   

    @FXML
    private void handleButtonAction(ActionEvent event) {
        showinfo("von Button");       
        wireClass.infoout();
    }
   
}

WireClass.java:
Java:
package mytest;

public class WireClass {

    public void infoout () {

// Ich möchte von dieser Klasse auf die Methode "showinfo" im Controller zugreifen, so ähnlich wie:

        FXMLDocumentController.showinfo("von wireClass");

// aber das funktioniert so nicht, da das ja keine Instanz der ControllerKlasse ist?     
// Wie kann ich das denn schreiben?
       
    }
   
}
 

dzim

Top Contributor
Keine Sorge: Das ist eine bei Neueinsteigern immer wieder gestellte Frage. Durch die Struktur (Main-Klasse, Controller+FXML) ensteht eine Trennung zwischen den Komponenten.
Deine Wire-Klasse wird so nicht funktionieren, weil ein statisches setzen nicht klappt (so wie du es andeutest), sondern du müsstest der Wire-Klasse die Instanz deines Controllers geben.
Deine Struktur ist noch etwas wild im Kreis und mir erschliesst sich nicht, warum du das so regeln möchtest, aber damit es klappt, musst du aus dem FXMLLoader (nach dem #load) den Controller holen.
Also: Statt statisch #load aufzurufen (unvollständiger Code):
Java:
// MAIN-KLASSE
FXMLLoader loader = new FXMLLoader(...); 
Pane root = loader.load();
FXMLDocumentController controller = loader.getController();
WireClass wire = new WireClass();
wire.setController(controller);

// Wire-Klasse
private FXMLDocumentController controller = null;
public void setController(FXMLDocumentController controller) {
    this.controller = controller;
}

public void doSthOnController() {
    if (controller == null)
        return null;
    controller.triggerMethod();
}
// ...

In etwa klar, wohin die Reise geht?
 

Knoten

Mitglied
Tausend Dank dzim!
Das funktioniert!!! Genaus sowas habe ich gesucht.
Ich werde mich da noch eingehend damit befassen müssen, damit ich das auch restlos kapiere.
Aber so prinzipiell verstehe ich es schon.

Warum ich diese 'wilde" Struktur habe, kann ich ehrlich gesagt nicht erklären - aber für mich ist das eine logische Struktur.
Das ist jetzt nur ein erster Test.

Ich werde später nur eine GUI-Oberfläche haben in welcher ein "allgemeines" Info-Feld angelegt ist (eine TextArea).
Darin werde ich sämtliche ablaufspezifischen Aktionen anzeigen wie z.B. "Datei xy erfolgreich geladen" , "USB-Device device xy gefunden", "Daten aus Gerät xy erfolgreich ausgelesen" usw.
Ich habe alleine damit schon verschiedene Klassen wie Dateioperationen und USB-Kommunikation.
Von jeder dieser Klassen möchte ich meine Meldungen als Protokoll mit Zeitstempel auf genau dieser TextArea anzeigen.
Die zentrale Text-Ausgaberoutine werde ich im "Controller" anlegen, mit einem einfachen String als Übergabeparameter (von irgendwoher - daher meine dämliche Frage).

Vermutlich hapert es bei mir am OOP-Verständnis, da ich bislang nur Delphi- C und Assembler (alles mehr schlecht als recht) gemacht habe. Wahrscheinlich beisst sich meine "Wunsch-Struktur" mit dem Java-Konzept.
Ich bin halt kein Informatiker - aber dafür lernwillig!
Danke Meister!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Netbeans mit JavaFX, FXML und Scenebuilder Java Basics - Anfänger-Themen 11
Juelin javaFX mit Elementen Java Basics - Anfänger-Themen 6
Juelin Netbeans und javafx Java Basics - Anfänger-Themen 6
M Wo den Ordner javafx-sdk-21.0.2 unter Linux ablegen? Java Basics - Anfänger-Themen 5
A Kapazität JavaFX TextField Java Basics - Anfänger-Themen 4
L JavaFX - grundlegende Verständnisprobleme Java Basics - Anfänger-Themen 1
S JavaFX Java Basics - Anfänger-Themen 1
A JavaFX-Anwendung läuft nicht mit Selenium WebDriver Java Basics - Anfänger-Themen 0
A JavaFX Toggle_Button_Disable Java Basics - Anfänger-Themen 2
ac83 JavaFX - Kompilierungsproblem Java Basics - Anfänger-Themen 1
R Intellij javafx --> jar Java Basics - Anfänger-Themen 11
O Compiler-Fehler JavaFX fmxl LoadExeption Java Basics - Anfänger-Themen 4
M Javafx Timeline Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
A JavaFX-Filechooser Java Basics - Anfänger-Themen 5
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
A JavaFx - SceneBuilder Java Basics - Anfänger-Themen 5
S JavaFX - Objekt an neue Stage übergeben Java Basics - Anfänger-Themen 12
G Javafx Eventhandler zu jedem Node Java Basics - Anfänger-Themen 1
T Elemente aus Array zu TableView JavaFX übertragen Java Basics - Anfänger-Themen 2
T HTMLEditor JavaFX Java Basics - Anfänger-Themen 4
E JavaFX Editor Probleme mit der Zwischenablage Java Basics - Anfänger-Themen 12
E JavaFX Taschenrechner Eingabe im Textfield beschränken Java Basics - Anfänger-Themen 2
D Mit Objekten rechnen, Textfield, JavaFX, Noob Java Basics - Anfänger-Themen 8
P Probleme bei der Installation von JavaFX Java Basics - Anfänger-Themen 3
R Umsetzungsplan JavaFx App Java Basics - Anfänger-Themen 9
M JavaFX- Verschiedene Stages Java Basics - Anfänger-Themen 1
P JavaFx einrichten Java Basics - Anfänger-Themen 6
Torsten.E JavaFX mit Visual Studio Code verwenden Java Basics - Anfänger-Themen 1
P JavaFX: Verständnisproblem bei ComboBox/ChoiceBox etc. Java Basics - Anfänger-Themen 9
T Javafx ListView kann nicht gefüllt werden. Java Basics - Anfänger-Themen 6
D JAVAFX WebVIEW zu JSOUP Java Basics - Anfänger-Themen 3
D Folgende Fehlermeldung bei der Installation von JAVAFX Java Basics - Anfänger-Themen 1
S JavaFX-Arduino Kommunikation mit LCD-Anzeige Java Basics - Anfänger-Themen 0
B java.lang.NullPointerException bei javafx Java Basics - Anfänger-Themen 10
J javafx mediaplayer mit https Java Basics - Anfänger-Themen 3
J JavaFX Label,Button zur Laufzeit Java Basics - Anfänger-Themen 30
D Ausführbare jar/exe aus JAVAFX Projekt erstellen (IntelliJ) Java Basics - Anfänger-Themen 14
O JavaFX XML Versuch Java Basics - Anfänger-Themen 2
O JavaFX Java Basics - Anfänger-Themen 7
M JavaFX-Übung Autospiel Java Basics - Anfänger-Themen 4
M JavaFX: Fenster bleibt weiß Java Basics - Anfänger-Themen 3
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
J Aktuelle Zeit in einer JavaFX Anwendung aktualisieren lassen Java Basics - Anfänger-Themen 4
L JavaFx ListView rechts abgeschnitten Java Basics - Anfänger-Themen 0
I Javafx Tabpane Reiter blockieren Java Basics - Anfänger-Themen 1
S JavaFX Beginneraufgabe Java Basics - Anfänger-Themen 1
W JavaFX import Fehler/Zellularautomaten Java Basics - Anfänger-Themen 1
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
CptK mit javafx button erstellen Java Basics - Anfänger-Themen 1
U Javafx Array aus Buttons Java Basics - Anfänger-Themen 2
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
E JAvaFX: Verschiedene Panels nach Klick auf Node des TreeView anzeigen Java Basics - Anfänger-Themen 0
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
D JavaFX, Verweis auf Datei im Projekt Java Basics - Anfänger-Themen 0
M JavaFX in Swing-Applikationen einbetten Java Basics - Anfänger-Themen 5
M JavaFX: Problem mit der TableView Java Basics - Anfänger-Themen 0
P JavaFX ohne FXMLLoader Java Basics - Anfänger-Themen 3
K JavaFX UI controls Java Basics - Anfänger-Themen 1
B Farbverlauf erstellen ohne Javafx, AWT usw.? Java Basics - Anfänger-Themen 34
H Best Practice JavaFX TableView mit Zell-Rahmen anstelle von Zeilen-Balken Java Basics - Anfänger-Themen 1
M Ausgabe eines Arrays auf Label (Javafx) Java Basics - Anfänger-Themen 4
K Threads Multithread in JavaFx Java Basics - Anfänger-Themen 11
R Threads in JavaFX Java Basics - Anfänger-Themen 3
N JavaFX - (Controller) - Klasse verkleinern Java Basics - Anfänger-Themen 8
U JavaFX eine Vbox Instanz pro Pane? Java Basics - Anfänger-Themen 2
Spencer Reid JavaDoc zu JavaFx hinzufügen Java Basics - Anfänger-Themen 1
V wie kann man am einfachsten für ein Element der JavaFX die Umrandung aktiwieren ? auch ohne css ? Java Basics - Anfänger-Themen 4
D OOP JavaFX objektorientiert Java Basics - Anfänger-Themen 2
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
P JavaFX - Komponenten skalieren Java Basics - Anfänger-Themen 16
P JavaFX Textfelder geben immer null zurück Java Basics - Anfänger-Themen 8
P JavaFX TextArea.setText Java Basics - Anfänger-Themen 13
F javafx.fxml.LoadException: Root hasn't been set. Java Basics - Anfänger-Themen 0
J JavaFX aus Java-Application heraus starten Java Basics - Anfänger-Themen 7
T Swing, SWT oder JavaFX Java Basics - Anfänger-Themen 8
S [JavaFX 2.1] - Eigene Sprachauswahl? Java Basics - Anfänger-Themen 4
D Javafx XYChart Variable in Schleife erzeugen? Java Basics - Anfänger-Themen 18
E JavaFX und Java auf Kommandozeile compilen Java Basics - Anfänger-Themen 2
J Webanwendung JavaFX Java Basics - Anfänger-Themen 4
Povlsen84 [javafx] Zusammenarbeit mit Tomcat Java Basics - Anfänger-Themen 4
C NoClassDefFoundError mit externer Jar bei Start aus Eclipse Java Basics - Anfänger-Themen 3
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
S log4j in externer Library Java Basics - Anfänger-Themen 4
R Klassen Problem mit externer Klasse Java Basics - Anfänger-Themen 5
A externer repaint Aufruf Java Basics - Anfänger-Themen 9
B Linux, Dateipfad, Einbindung externer Dateien.. Java Basics - Anfänger-Themen 7
I Externer Methodenaufruf, Punkt-Notation Java Basics - Anfänger-Themen 11
A paint() methode von externer Klasse aufrufen Java Basics - Anfänger-Themen 3
G Aufruf externer Funktionen Java Basics - Anfänger-Themen 7
J Methoden in externer Klasse -> Nullpointer Exception Java Basics - Anfänger-Themen 9
X Externer GUI Code verwenden / (Design Ansicht) Java Basics - Anfänger-Themen 3
M JS Import aus externer Jar Datei Java Basics - Anfänger-Themen 5
A SongChangeListener aus externer Lib Java Basics - Anfänger-Themen 5
D Öffnen externer Dateien mit Eclipse Java Basics - Anfänger-Themen 5
W Java ProcessBuilder - externer Prozess nur einmal starten und mehrere Inputs geben Java Basics - Anfänger-Themen 7
Z Text aus externer Datei in TextArea einlesen Java Basics - Anfänger-Themen 5
U Externer aufruf zum Fenster erstellen will nicht Java Basics - Anfänger-Themen 2
B externer Listener für Zeichenbereich? Java Basics - Anfänger-Themen 2
T Klassen und Objekte externer Aufruf. Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben