Aufruf einer Methode einer anderen Klasse

didi577

Bekanntes Mitglied
Hallo,

ich grübele jetzt schon lange über diesem Problem:

Ich habe eine JavaFx GUI mit 2 Fenstern. Ich möchte aus Fenster 1 einen String an Fenster 2 übergeben. Der Code aus Fenster 1:
Java:
twc.setWidgets(lvEmploye.getSelectionModel().getSelectedItem()
                   .getFirstname());

Der Code aus Fenster 2 wo der Wert ankommen soll:
Java:
public void setWidgets(String name) {

       lblNameTarget.setText(name);

   }

Am Ende soll der Wert:
Java:
lvEmploye.getSelectionModel().getSelectedItem()
                   .getFirstname()
aus Fenster 1 im Label aus Fenster 2 stehen:
Java:
lblNameTarget.setText(name)

wer kann mir weiter helfen?
 

didi577

Bekanntes Mitglied
wenn ich die Methode aufrufe erhalte ich eine NPE mit Verweis auf diese Stelle
Java:
    twc.setWidgets(lvEmploye.getSelectionModel().getSelectedItem()
                   .getFirstname());
 

Robat

Top Contributor
Dann am besten mal schauen ob twc oder lvEmploye null sind bzw sicherstellen dass das ganze nur aufgerufen wird wenn auch wirklich ein Item in der Liste ausgewählt ist. Sonst kann auch lvEmploye.getSelectionModel().getSelectedItem() null werden.
 

didi577

Bekanntes Mitglied
Java:
twc
scheint das Problem zu sein. Ich habe in der aufrufenden Klasse diese Zeile:
Java:
private TargetWindowController twc;

TargetWindowController ist die Klasse in der die Methode:
Java:
public void setWidgets(String name) {

       lblNameTarget.setText(name);

   }
steht
 

didi577

Bekanntes Mitglied
ok, ich habe jetzt in der initialize Methode die Zeile:
Java:
TargetWindowController twc = new TargetWindowController();
die NPE ist damit weg, Danke

jetzt habe ich noch eine NPE mit Verweis auf diese Zeile:
Java:
lblNameTarget.setText(name);
in der Methode:
Java:
public void setWidgets(String name) {

       lblNameTarget.setText(name);

   }

??
 

didi577

Bekanntes Mitglied
der String "name" wird jetzt mit dem gewünschten Wert belegt

die NPE bezieht sich also auf das Label dass scheinbar zum Zeitpunkt noch nocht da ist

wo muss ich jetzt noch umbauen?
 

didi577

Bekanntes Mitglied
lblNameTarget vermutlich null bzw. nicht initialisiert.
das es sich hier um eine FXML Anwendung handelt wird das Label "lblNameTarget" doch beim Fensterstart initialisiert?! Wenn ich die oben beschriebenen Methoden zum setzen des Textes auskonmmentiere ist das Label beim Fensterstart mit dem default Wert aus dem Scene Builder auch vorhanden. Hat noch jemand ei e Idee??
 

Robat

Top Contributor
Okay das scheint zu passen.
Wie lädst du denn deinen FXML Datei? Kann es sein dass du 2 Instanzen deiner Controller-Klasse hast und die Variable daher null ist?
 

didi577

Bekanntes Mitglied
in der Klasse MainWindowController wird bei Klick auf einen Button folgendes ausgeführt:
Java:
btnAddTarget.setOnAction(ev -> {

           myTeam.TargetWindow();
           
           twc.setWidgets(lvEmploye.getSelectionModel().getSelectedItem()
                   .getFirstname());
           
       });
myTeam.TargetWindow(); lädt die FXML:
Java:
public void TargetWindow() {

       try {
           FXMLLoader loader = new FXMLLoader(
                   MyTeam.class.getResource("/view/TargetView.fxml"));
           GridPane pane = loader.load();

           Scene scene = new Scene(pane);
           Stage targetWindowStage = new Stage();
           TargetWindowController targetWindowController = loader
                   .getController();
           targetWindowController.setMyTeam(this, targetWindowStage);

           targetWindowStage.setScene(scene);
           
           targetWindowStage.setTitle("Zielvereinbarungen");
           targetWindowStage.initOwner(primaryStage);
           targetWindowStage.initModality(Modality.APPLICATION_MODAL);
           targetWindowStage.show();

       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }

   }
twc.setWidgets(lvEmploye.getSelectionModel().getSelectedItem()
.getFirstname()); übergibt den String an das Label in der Klasse TargetWindowController:
Java:
public void setWidgets(String name) {
       
       lblNameTarget.setText(name);
       System.out.println(name);
   }
die Variable name hat den richtigen Wert
 

mrBrown

Super-Moderator
Mitarbeiter
Du solltest nirgendwo mit new einen neuen TargetWindowController erstellen, sondern den in TargetWindow initialisierten benutzen.
 

mrBrown

Super-Moderator
Mitarbeiter
TargetWindowController als Instanzvariable setzten und einen Getter dafür bereit stellen, und diesen dann in der anderen Klasse aufrufen
 

didi577

Bekanntes Mitglied
ich habe jetzt in der MainWindowController:
Java:
private TargetWindowController twc;
...
...
btnAddTarget.setOnAction(ev -> {

           myTeam.TargetWindow();
          
           getTwc().setWidgets(lvEmploye.getSelectionModel().getSelectedItem()
                   .getFirstname());
           
           
       });

in der TargetWindowController:
Java:
public void setWidgets(String name) {
       
       lblNameTarget.setText(name);

   }

ich bekomme weiter eine NPE in dieser Zeile:
Java:
getTwc().setWidgets(lvEmploye.getSelectionModel().getSelectedItem()
                   .getFirstname());
 

didi577

Bekanntes Mitglied
ich glaube du meintest es anders, TargetWindowController:
Java:
private TargetWindowController twc;
...
...
public TargetWindowController getTwc() {
       return twc;
   }

MainWindowController:
Java:
private TargetWindowController twc;
...
...
twc.getTwc().setWidgets(
                   lvEmploye.getSelectionModel().getSelectedItem()
                           .getFirstname());

trotzdem die NPE:
Java:
twc.getTwc().setWidgets...
 

mrBrown

Super-Moderator
Mitarbeiter
Ja, ich mein was anderes. In deinem Code benutzt du ja auch nirgendwo Getter, sondern führst nur neue Variablen ein, die logischerweise null sind.

Aber bei den kurze Codestückchen kann man nicht wirklich was sagen...
 

didi577

Bekanntes Mitglied
hier mal mein Ziel wo ich hin möchte:

2017-05-31_10h28_38.png
aus der Listview des Hauptfensters soll der markierte Name "Patrick S" den Labeltext "Name aus LV" im Fenster "Zielvereinbarungen" ersetzen, das selbe dann für das Jahr "2017" im Hauptfenster nach "Jahr aus cb" . Das Fenster "Zielvereinbarungen" öffnet sich wenn ich im Hauptfenster auf den Button "Ziel erfassen" klicke

wie baue ich das am besten?
 

didi577

Bekanntes Mitglied
hier mein aktueller Code mit Bezug zum Problem:
Java:
public class MainWindowController {
   private String s;
@FXML
   private void initialize() {
btnAddTarget.setOnAction(ev -> {

           myTeam.TargetWindow();
           setS(lvEmploye.getSelectionModel().getSelectedItem()
                   .getFirstname());
System.out.println(s);
}

public String getS() {
           
       return s;
   }

   public void setS(String s) {
       this.s = s;
   }
}

der String soll als Text im Label der folgenden Klasse landen:
Java:
public class TargetWindowController {

   @FXML
   private Label lblNameTarget;

private MainWindowController mwc;

@FXML
   private void initialize() {

       setTextlbl();
   }
public void setTextlbl() {
       MainWindowController mwc = new MainWindowController();
       lblNameTarget.setText(mwc.getS());
   }

es gibt keinen Fehler aber "mwc.getS()" liefert null und somit ist der Text im Label leer

"System.out.println(s);" gibt den Namen richtig aus

vielleicht kann mir jetzt jemand helfen :(
 

VfL_Freak

Top Contributor
Moin,
wenn das ist , wie du schreibst, dann klingt das für mich so, als würde "getS" in "setTextlbl" VOR dem 'initialize' in 'MainWindowController' aufgerufen!
Versuch' mal den String zu initialisieren:
Java:
private String s = "Test";

VG Klaus
 

didi577

Bekanntes Mitglied
Hi,

Java:
public class MainWindowController {
   
   private String s = "Test";
...

mwc.getS() liefert jetzt "Test"
 

Robat

Top Contributor
Ausgehend von Post#16 und Post#7 kann man sagen dass der Fehler immer noch darin liegt, dass du 2 Instanzen deiner Controller Klasse hast.
In deiner TargetWindow() Methode lädst du die FXML Datei und gleichzeitig auch den Controller. Die Instanz existiert also. Gleichzeit sagst du aber, dass du in der initialize() Methode mittels TargetWindowController twc = new TargetWindowController(); eine weiter Instanz erstellst. Das sollte man niemals tun! Entfern die Zeile aus der initialize() Methode und ruf die setWidgets(String s) Methode aus deiner TargtWindow() Methode auf. Irgendwie so:

Java:
public void TargetWindow()
{
     FXMLLoader loader = ...
     ...
     TargetWindowController targetWindowController = loader.getController();
     ....
     targetWindowController.setWidgets(lvEmploye.getSelectionModel().getSelectedItem().getFirstname());
     ...
}
 

Robat

Top Contributor
Sorry das hatte ich übersehen.
Dennoch solltest du deine anfängliche Idee mMn nicht verwerfen.
In deiner TargetWindowController Klasse hast du Methoden um die Werte in die Labels zu schreiben. (bspw. setWidgets(String s)).
Sobald du das FXML File geladen hast holst du dir dein Controller (wie du es bereits in Post#16 gemacht hast) und rufst die Methode setWidgets(..) auf. Erst danach darfst du die show() Methode aufrufen. Hier mal ein Beispiel aus einen meiner Projekte:
Java:
try
{
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(Manager.class.getResource("view/PlayerEditDialog.fxml"));
    AnchorPane page = (AnchorPane) loader.load();

    Stage dialogStage = new Stage();
    dialogStage.setTitle("Spieler bearbeiten");
    dialogStage.initModality(Modality.WINDOW_MODAL);
    dialogStage.initOwner(primaryStage);
    Scene scene = new Scene(page);
    dialogStage.setScene(scene);

    PlayerEditDialogController c = loader.getController();
    c.setDialogStage(dialogStage);
    c.setPlayer(player); // <-- das könnte deine setWidgets(String s) Methode sein

    dialogStage.showAndWait();

    return c.isOkClicked();
}
catch(IOException e)
{
    e.printStackTrace();
    return false;
}
 

didi577

Bekanntes Mitglied
ich glaube ich habe es

ich rufe
Java:
myTeam.TargetWindow(lvEmploye.getSelectionModel().getSelectedItem()
                   .getFirstname());
mit dem gewünschten String als Parameter auf
Java:
public void TargetWindow(String name) {

       try {
           FXMLLoader loader = new FXMLLoader(
                   MyTeam.class.getResource("/view/TargetView.fxml"));
           GridPane pane = loader.load();
           
           Scene scene = new Scene(pane);
           Stage targetWindowStage = new Stage();
           TargetWindowController targetWindowController = loader
                   .getController();
           targetWindowController.setMyTeam(this, targetWindowStage);
           Label lblNameTarget = new Label();
           lblNameTarget.setText(name);
           pane.add(lblNameTarget, 1, 0);
           targetWindowStage.setScene(scene);
           
           targetWindowStage.setTitle("Zielvereinbarungen");
           targetWindowStage.initOwner(primaryStage);
           targetWindowStage.initModality(Modality.APPLICATION_MODAL);
           targetWindowStage.show();

       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }

   }
in der Methode erzeuge ich ein neues Label, setze den Text aus dem Parameter und platziere das Label an die richtige Stelle, das Ergebnis passt

keine Ahnung ob das so "legal" ist ;)
 

Robat

Top Contributor
MMn eher ein Workaround als eine Lösung. So kannst du ja jetzt nicht mehr im Controller auf das Label zugreifen.
 

didi577

Bekanntes Mitglied
ok, habe umgebaut:
Java:
public class TargetWindowController {
...
...
public void setWidgets(String name) {
       
       lblNameTarget.setText(name);
   }
}

und

Java:
public class MyTeam extends Application {
...
...
public void TargetWindow() {

       try {
           FXMLLoader loader = new FXMLLoader(
                   MyTeam.class.getResource("/view/TargetView.fxml"));
           GridPane pane = loader.load();

           Scene scene = new Scene(pane);
           Stage targetWindowStage = new Stage();
           TargetWindowController targetWindowController = loader
                   .getController();
           targetWindowController.setMyTeam(this, targetWindowStage);
           targetWindowController.setWidgets(LvEmploye().getSelectionModel().getSelectedItem().getFirstname());

           targetWindowStage.setScene(scene);

           targetWindowStage.setTitle("Zielvereinbarungen");
           targetWindowStage.initOwner(primaryStage);
           targetWindowStage.initModality(Modality.APPLICATION_MODAL);
           targetWindowStage.show();

       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }

   }

beim Ausführen:
Exception in thread "JavaFX Application Thread" java.lang.Error: Unresolved compilation problem:
The method LvEmploye() is undefined for the type MyTeam

at controller.MyTeam.TargetWindow(MyTeam.java:181)

klar, lvEmploye kommt aus der Klasse MainWindowController

habe probiert:
Java:
public MainWindowController mwc;
...
targetWindowController.setWidgets(mwc.getLvEmploye().getSelectionModel().getSelectedItem().getFirstname());

aber NPE auf targetWindowController.setWidgets(mwc.getLvEmploye().getSelectionM...

ich denke wir sind nah am Ziel...was fehlt noch
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
R Methoden NPE beim Aufruf einer Methode einer anderen Klasse Java Basics - Anfänger-Themen 4
J Aufruf einer Methode über einen String Java Basics - Anfänger-Themen 11
V Problem Aufruf einer Methode in einer Methode Java Basics - Anfänger-Themen 1
I Rückgabe und Aufruf einer Methode innerhalb einer anderen Methode Java Basics - Anfänger-Themen 5
S Aufruf Einer Methode aus einer anderen Klasse - Static Fehler Java Basics - Anfänger-Themen 4
L Klassen Aufruf einer ueberschreibbaren Methode im Konstruktor Java Basics - Anfänger-Themen 4
C Exception beim Aufruf einer Methode Java Basics - Anfänger-Themen 2
A Aufruf einer Methode Java Basics - Anfänger-Themen 3
F Variabler Aufruf einer Methode Java Basics - Anfänger-Themen 10
S Fehlermeldung beim Aufruf einer Methode Java Basics - Anfänger-Themen 3
2 Aufruf einer Methode klappt nicht Java Basics - Anfänger-Themen 3
M Problem beim Aufruf einer Methode: Wo is der Fehler? Java Basics - Anfänger-Themen 12
C Aufruf von Klassen aus einer STATIC Methode mit Parameter Java Basics - Anfänger-Themen 2
D Frage zum Aufruf einer toString-Methode Java Basics - Anfänger-Themen 2
G Aufruf einer Methode Java Basics - Anfänger-Themen 4
W Problem mit dem Aufruf einer Methode Java Basics - Anfänger-Themen 2
M Aufruf von statischen Methoden einer anderen Klasse Java Basics - Anfänger-Themen 15
D Aufruf einer statischen Variable Java Basics - Anfänger-Themen 1
H Aufruf einer Instanzmethode funktionert nicht. Java Basics - Anfänger-Themen 6
L Next()-Aufruf zweimal innerhalb einer While-Schleife bei ListIterator Java Basics - Anfänger-Themen 10
Q Aufruf einer Klasse in einem Package Java Basics - Anfänger-Themen 7
T Aufruf einer Methoden aus einer Util-Klasse mit privatem Konstruktor Java Basics - Anfänger-Themen 7
C Aufruf einer Funktion Java Basics - Anfänger-Themen 3
M Frage zum Aufruf eines Applets aus einer HTML - Datei Java Basics - Anfänger-Themen 3
K Methoden aufruf von einer anderen Klasse Java Basics - Anfänger-Themen 7
L Mehrere Objekte einer Klasse aber nur einmal Konstruktor aufruf? Java Basics - Anfänger-Themen 2
A Aufruf einer externen schon laufenden Anwendung Java Basics - Anfänger-Themen 3
G Rekursiver Aufruf einer JSP über eine JavaScript-Funktion Java Basics - Anfänger-Themen 5
G Problemme mit: Aufruf einer Klasse aus einem Frame Java Basics - Anfänger-Themen 5
C Deklaration einer Variablen in einem rekursivem Aufruf Java Basics - Anfänger-Themen 5
G Buttonklick -> Aufruf einer Webseite Java Basics - Anfänger-Themen 16
G Aufruf einer .bat-Datei aus Java heraus Java Basics - Anfänger-Themen 6
B Was mach ich falsch mit dem Aufruf einer Funktion? Java Basics - Anfänger-Themen 12
M Konstruktor-Aufruf im Konstruktor, aber nicht am Anfang? Java Basics - Anfänger-Themen 4
P Array-Objekte-Aufruf Java Basics - Anfänger-Themen 22
Agent4nobody Programmstart durch aufruf des interpreters funktioniert nicht Java Basics - Anfänger-Themen 14
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
K Erste Schritte Stream-Aufruf vereinfachen Java Basics - Anfänger-Themen 3
sashady ursprüngliche Array-Werte bei erneutem Aufruf? Java Basics - Anfänger-Themen 7
Y Aufruf von Methode nicht möglich. Java Basics - Anfänger-Themen 2
D Aufruf von mehreren Activities bringt die app zum Absturz Java Basics - Anfänger-Themen 5
L Methoden Wie Löse ich ext Methoden Aufruf Fehler? Java Basics - Anfänger-Themen 3
X Methode bei mehrfachen Aufruf kein Effekt Java Basics - Anfänger-Themen 3
H Aufruf von Methoden durch Methoden Java Basics - Anfänger-Themen 3
B EJB und Arquillian - bekomme Nullpointer Exception beim Aufruf der EJB Klasse Java Basics - Anfänger-Themen 40
O Verwirrt beim Java Collection Framework aufruf! Java Basics - Anfänger-Themen 9
T Konsolenscanner startet nicht durch Aufruf von Actionlistener Java Basics - Anfänger-Themen 4
B OOP While Schleife läuft Endlos durch externen aufruf Java Basics - Anfänger-Themen 2
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
D Interface Wieso Aufruf aller Methoden eines Interfaces? Java Basics - Anfänger-Themen 11
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
H Rekursiver Aufruf Java Basics - Anfänger-Themen 8
E Daten dem Super Aufruf übergeben Java Basics - Anfänger-Themen 3
D Interface Frame doppelt durch Aufruf der GUI Klasse Java Basics - Anfänger-Themen 1
Henri Aufruf von getX() und getY() aus der Super klasse Objekt() Java Basics - Anfänger-Themen 3
E Aufruf auf Objekt mit übergebenem Wert? Java Basics - Anfänger-Themen 7
T static String Variable wird nur beim ersten aufruf durch eine Funktion geändert. Java Basics - Anfänger-Themen 16
C Erste Schritte Fehler beim *.class Aufruf über cmd.exe Java Basics - Anfänger-Themen 9
M Speichern von Objekten - Verfügbarkeit bei erneutem Aufruf Java Basics - Anfänger-Themen 3
S PHP Aufruf mit mehreren Variablen Java Basics - Anfänger-Themen 2
P Aufruf Methode anderer Klasse Java Basics - Anfänger-Themen 5
J Klassen Reihenfolge beim Aufruf von Klassen Java Basics - Anfänger-Themen 1
O Frage zum Aufruf überladener Methoden Java Basics - Anfänger-Themen 4
G funktions Aufruf aus GUI Java Basics - Anfänger-Themen 9
A Fehlermeldung beim aufruf der main Methode Java Basics - Anfänger-Themen 17
W Zeitversetzter Aufruf der Methoden Java Basics - Anfänger-Themen 6
M Unbekannte Nummer bei Aufruf der toString Methode Java Basics - Anfänger-Themen 3
D Methode mit mehren Rekursiven aufrufen in Methode mit einem Rekursiven Aufruf umwandeln! Java Basics - Anfänger-Themen 1
F signiertes Applet fkt. nicht bei lokalem Aufruf Java Basics - Anfänger-Themen 2
A externer repaint Aufruf Java Basics - Anfänger-Themen 9
A Konstruktor Aufruf Java Basics - Anfänger-Themen 4
Pentalon Ein Aufruf den ich nicht verstehe Java Basics - Anfänger-Themen 11
D dynamischer Aufruf Java Basics - Anfänger-Themen 2
N Aufruf der Methode Java Basics - Anfänger-Themen 16
A Aufruf der paint() Methode Java Basics - Anfänger-Themen 3
K Problem beim Array aufruf Java Basics - Anfänger-Themen 4
P URL für Lokalen Aufruf Java Basics - Anfänger-Themen 5
C OOP Aufruf von Methoden höherer Sichtbarkeit Java Basics - Anfänger-Themen 10
T Client-Fenster bei Aufruf unvollständig Java Basics - Anfänger-Themen 12
S Überladener Konstruktor und aufruf aus eigener Klasse Java Basics - Anfänger-Themen 2
A Aufruf von Konstruktor aus Basisklasse Java Basics - Anfänger-Themen 7
O OOP super aufruf 2 objekte? Java Basics - Anfänger-Themen 3
D Array Methoden Aufruf. Java Basics - Anfänger-Themen 14
M OOP Aufruf vieler Getter Methoden abkürzen? Java Basics - Anfänger-Themen 7
C Aufruf funktioniert nicht Java Basics - Anfänger-Themen 10
G Aufruf externer Funktionen Java Basics - Anfänger-Themen 7
J Aufruf von Funktionen in *.jar mittels Eclipse Java Basics - Anfänger-Themen 4
T Shell Script Aufruf mit Java Java Basics - Anfänger-Themen 7
R Aufruf statische Methode Java Basics - Anfänger-Themen 7
M Aufruf zum Objekt erstellen aus String Java Basics - Anfänger-Themen 5
K OOP Nachteil bei direktem Aufruf von run() auf Thread-Objekten Java Basics - Anfänger-Themen 2
J Aufruf der Methode Java Basics - Anfänger-Themen 6
P OOP Aufruf eines Interfaces Java Basics - Anfänger-Themen 4
E Konstruktor-Aufruf Java Basics - Anfänger-Themen 9
W Multiplikation mit rekursivem Aufruf Java Basics - Anfänger-Themen 17
C exec Aufruf mit Leerzeilen im Pfad Java Basics - Anfänger-Themen 3
L Methoden aufruf Java Basics - Anfänger-Themen 3
M methoden aufruf klappt nicht Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben