JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus

FlyingV

Neues Mitglied
Moin,
Ich bin momentan dabei mir ein Tool zu basteln, dass unter anderem konstant einen Stream von Daten (Strings) in einer TextArea ausgeben soll. Die Daten werden außerhalb des Controllers der fxml Datei erstellt und sollen an den controller übergeben werden. Gibt es eine Möglichkeit auf die TextArea selbst, oder auf eine Methode wie setText() im Controller von außen zuzugreifen?
 
Bemüht eigentlich irgendjemand mal die Forensuche???

Allein auf der ersten Seite des Unterforums hier gibt es zwei weitere Themen (dich ich sogar mit noch simplerer Browser-Seitensuche finden kann!), die das Thema im weiteren Sinn behandeln...

Auftrag an den TO @FlyingV: Bitte einfach mal suchen, nachlesen und wenn dann noch Fragen offen sind, diese bitte stellen.

Und um dein Frage
FlyingV hat gesagt.:
Gibt es eine Möglichkeit auf die TextArea selbst, oder auf eine Methode wie setText() im Controller von außen zuzugreifen?
zu beantworten:
JA! (Denn das ist strenggenommen die einzige Antwort, die du haben wolltest. Oder wolltest du etwa noch das "Wie" wissen? Wenn ja: Forensuche, habe das schon mehrfach anderen Personen erläutert - ist simpel.)

#edit:
PS: Suche mal nach "Controller"...
 
Zuletzt bearbeitet:
Allein auf der ersten Seite des Unterforums hier gibt es zwei weitere Themen (dich ich sogar mit noch simplerer Browser-Seitensuche finden kann!), die das Thema im weiteren Sinn behandeln...
*rant*
Sachte Meister.
Natürlich habe ich gegoogelt wie sonstwas, und bin zu keinem befriedigendem Ergebniss gekommen. Nen neuen Account erstellen um in nem Forum zu posten sehe ich persönlich als das letzte Mittel, um an die gewünschte Information zu kommen.
Die Lösungen mit FXMLLoader waren (für mich) nicht zielführend, ich habe einen anderen Weg gefunden, der mein problem löst. Die Kollegen auf Stackexchange haben mich sogar 6 Stunden nach dem ich den logger am laufen hatte in meiner Lösung bestätigt. Da ich tatsächlich die Foren Regeln gelesen habe, poste ich hier Link und Quelltext der Antwort:

logging - JavaFX: How can I access a cotroller method from a normal java class? - Stack Overflow
Java:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.util.Date;
import java.util.concurrent.Executors;

public class LogThing extends Application {

private TextField textField;
private TextField textField2;
private Button clickMeBtn;

public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("Logger!");
    textField = new TextField();
    textField2 = new TextField();
    clickMeBtn = new Button("Click me for time");
    clickMeBtn.setOnAction(e -> {
                textField2.setText(new Date().toString());
            });
    StackPane root = new StackPane();
    VBox vBox = new VBox();
    vBox.getChildren().addAll(textField2, clickMeBtn, textField);
    root.getChildren().add(vBox);
    primaryStage.setScene(new Scene(root, 300, 250));
    primaryStage.show();
    Executors.newSingleThreadExecutor().submit(new BackGroundTask(this));
}

public void logALine(String line) {
    textField.setText(line);
}

class BackGroundTask implements Runnable {

    private final LogThing logThing;
    private int i = 1;

    public backGroundTask(LogThing logThing) {
        this.logThing = logThing;
    }

    @Override
    public void run() {
        while (true) {
            for (i = 1; i < 1000; i++) {
                try {
                    Thread.sleep(1000);
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            logThing.logALine("i : " + i);
                        }
                    });

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}  }
 
FlyingV hat gesagt.:
Deine Frage auf StackOverflow war erstaunlicherweise weitaus zielgerichteter als dass hier. Das Problem ist, wie du sie gestellt hast.

Für mich stellte sich das Problem so dar, dass du nicht wusstest, wie man an den Controller kommt, nicht, wie man ihn (oder besser das von ihm gemanagte TextField) von einem anderen Thread (also in deinen Worten "nicht die UI blockierend") aus updaten kannst.
Ja. Hier geht nur Platform#runLater(Runnable). Aber wie gesagt: So war deine Frage nicht gestellt. IMHO wolltest du wissen, wie man generell auf die durch einen Controller gemanagten Widgets zugreifen kann.
 

Zurück
Oben