JavaFX ListView zeigt Einträge nicht an

karlmasutra

Mitglied
Guten Abend zusammen.

Habe folgendes Problem:

Ich habe in Scene "A" eine ListView. Diese ist mit einer ObservableList gekoppelt.
In Scene "B" erstelle ich einen oder mehrere Spieler und übergebe diese(n) anschließend einer Methode in Scene "A", welche den/die Spieler der ObservableList hinzu fügt. Einigen Test zufolge funktioniert dies auch.
  1. Test Print-Ausgabe Spielername in Scene "A": wird angezeigt
  2. Test Abfrage ob ovList leer ist: wird mit false beantwortet
  3. Test ovList.size(): zeigt die aktuelle Anzahl der Objekte in der ovList an.)

In der ListView taucht aber kein Objekt auf.

Hier teile des betreffenden Codes:
Code:
private ObservableList<Spieler> ovList = FXCollections.observableArrayList();
listViewSpieler.setItems(ovList);
listViewSpieler.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Spieler>() {
   public void changed(ObservableValue<? extends Spieler> ov, Spieler old_val, Spieler new_val) {
   }      
});

public void addSpielerZuOvList(Spieler spieler) {
   //System.out.println(spieler +"ovlist");
   //System.out.println(ovList.isEmpty());
   //System.out.println(ovList.size());
   ovList.add(spieler);

Was mache ich falsch, oder habe ich vergessen?

Danke für eure Hilfe.

VG Marco
 

Robat

Top Contributor
Zeig mal den ganzen Code. Würde mal vermuten dass du irgendwo händisch einen Controller erstellst und die Änderungen somit die View nicht mitbekommt
 

karlmasutra

Mitglied
Scene "A":
Code:
package monopoly.ansicht.warteraum;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.stage.Stage;
import monopoly.code.spieler.Spieler;

public class AnsichtWarteraumController {

  @FXML
  private ResourceBundle resources;

  @FXML
  private URL location;

  @FXML
  ListView<Spieler> listViewSpieler;

  @FXML
  private Button butSpielStarten;

  @FXML
  private Button butZurueck;

  private ObservableList<Spieler> ovList = FXCollections.observableArrayList();

 @FXML
 void clickButSpielStarten(ActionEvent event) {

  }

  @FXML
  void clickButZurueck(ActionEvent event) throws IOException {
    Parent hauptmenueParent =   
    FXMLLoader.load(getClass().getResource("/monopoly/ansicht/hauptmenue/AnsichtHauptmenue.fxml"));
    
    Scene hauptmenueScene = new Scene(hauptmenueParent);
    Stage window = (Stage) ( (Node)event.getSource()).getScene().getWindow();
    window.setScene(hauptmenueScene);
    window.setFullScreen(true);
    window.show();
  }

  public void addSpielerZuOvList(Spieler spieler) {
    //System.out.println(spieler +"ovlist");
    //System.out.println(ovList.isEmpty());
    //System.out.println(ovList.size());
    ovList.add(spieler);
  }

  @FXML
  void initialize() {
    assert listViewSpieler != null : "fx:id=\"listViewSpieler\" was not injected: check your FXML file 'AnsichtWarteraum.fxml'.";
    assert butSpielStarten != null : "fx:id=\"butSpielStarten\" was not injected: check your FXML file 'AnsichtWarteraum.fxml'.";
    assert butZurueck != null : "fx:id=\"butZurueck\" was not injected: check your FXML file 'AnsichtWarteraum.fxml'.";
    
    listViewSpieler.setItems(ovList);
    listViewSpieler.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Spieler>() {
    public void changed(ObservableValue<? extends Spieler> ov, Spieler old_val, Spieler new_val) {
           }
    });
  }


}


Scene "B":
Code:
package monopoly.ansicht.neuesspieleinzelspieler;

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

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

import monopoly.code.spieler.*;
import monopoly.code.spiellogik.*;
import monopoly.ansicht.warteraum.*;

public class AnsichtNeuesSpielEinzelspielerController {

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    @FXML
    private Slider sliderStartGeld;

    @FXML
    private Slider sliderAnzahlSpieler;

    @FXML
    private Slider sliderSchwierigkeitsgrad;

    @FXML
    private Button butSpielBeginnen;

    @FXML
    private TextField tfNickname;

    @FXML
    private ComboBox<Spielfigur> cBoxSpielfigurWaehlen;

    @FXML
    private Button butZurueck;

    private Spieler spieler;
    private AnsichtWarteraumController ansichtWarteraumController = new AnsichtWarteraumController();



    @FXML
    void clickButZurueck(ActionEvent event) throws IOException {
        Parent hauptmenueParent = FXMLLoader.load(getClass().getResource("/monopoly/ansicht/hauptmenue/AnsichtHauptmenue.fxml"));
        Scene hauptmenueScene = new Scene(hauptmenueParent);

        Stage window = (Stage) ( (Node)event.getSource()).getScene().getWindow();
        window.setScene(hauptmenueScene);
        window.setFullScreen(true);
        window.show();     
    }

    @FXML
    void clickButSpielBeginnen(ActionEvent event) throws IOException {
        /*
         * Initialisierung Spieler
         */
        spieler = new Spieler(tfNickname.getText());    
        ansichtWarteraumController.addSpielerZuOvList(spieler);

        int startgeld = (int) sliderStartGeld.getValue();
        spieler.setGuthaben(startgeld);

        int anzahlSpieler = (int) sliderAnzahlSpieler.getValue();
        fuegeComSpielerHinzu(anzahlSpieler);

        int schwierigkeitsgrad = (int) sliderSchwierigkeitsgrad.getValue();
        Spiellogik spielLogik = new Spiellogik(anzahlSpieler,schwierigkeitsgrad);

        /*
         * Erzeugen Warteraum
         */
        Parent warteRaum = FXMLLoader.load(getClass().getResource("/monopoly/ansicht/warteraum/AnsichtWarteraum.fxml"));
        Scene warteraumScene = new Scene(warteRaum);

        Stage window = (Stage) ( (Node)event.getSource()).getScene().getWindow();
        window.setScene(warteraumScene);
        window.setFullScreen(true);
        window.show();
    }

    private void fuegeComSpielerHinzu(int anzahlSpieler) {
        for(int i = 1; i <= anzahlSpieler-1; i++) {
            spieler = new Spieler("COM "+i);
            ansichtWarteraumController.addSpielerZuOvList(spieler);
        }
    }

    public Spieler getSpieler() {
        return spieler;
    }

    @FXML
    void initialize() {
        assert sliderStartGeld != null : "fx:id=\"sliderStartGeld\" was not injected: check your FXML file 'AnsichtNeuesSpiel.fxml'.";
        assert sliderAnzahlSpieler != null : "fx:id=\"sliderAnzahlSpieler\" was not injected: check your FXML file 'AnsichtNeuesSpiel.fxml'.";
        assert sliderSchwierigkeitsgrad != null : "fx:id=\"sliderSchwierigkeitsgrad\" was not injected: check your FXML file 'AnsichtNeuesSpielEinzelspieler.fxml'.";
        assert butSpielBeginnen != null : "fx:id=\"butSpielBeginnen\" was not injected: check your FXML file 'AnsichtNeuesSpiel.fxml'.";
        assert tfNickname != null : "fx:id=\"tfNickname\" was not injected: check your FXML file 'AnsichtNeuesSpiel.fxml'.";
        assert cBoxSpielfigurWaehlen != null : "fx:id=\"cBoxSpielfigurWaehlen\" was not injected: check your FXML file 'AnsichtNeuesSpiel.fxml'.";
        assert butZurueck != null : "fx:id=\"butZurueck\" was not injected: check your FXML file 'AnsichtNeuesSpiel.fxml'.";


    }
}
 

Robat

Top Contributor
Ja es ist so wie ich es mir gedacht hatte. In der Klasse AnsichtNeuesSpielEinzelspielerController erzeugt du händisch eine neue Instanz von AnsichtWarteraumController.. Dieser Controller hat aber absolut nichts mit dem zu tun, mit dem das UI arbeitet (wird vom FXMLLoader instanziiert).

Im Idealfall erstellst du ein Model, welches die Spielerliste enthält, und injectest es in den Controller. Du kannst aber natürlich auch direkt die Liste weitergeben.

Ich kann dir morgen ein Beispiel machen, wenn ich wieder am PC bin
 

karlmasutra

Mitglied
Im Idealfall erstellst du ein Model, welches die Spielerliste enthält, und injectest es in den Controller. Du kannst aber natürlich auch direkt die Liste weitergeben.

Ich kann dir morgen ein Beispiel machen, wenn ich wieder am PC bin

Okay. Ich belese mich mal zu dem was du geschrieben hast. Aber ein Beispiel wäre dennoch nett ;)
Die Liste weitergeben? Dann müsste ich ja in der Klasse "AnsichtNeuesSpielEinzelspielerController" eine Liste generieren, sehe ich das richtig?
 

Robat

Top Contributor
Nicht ganz. Hab das Beispiel mal anhand einer Model Klasse gemacht. Du kannst natürlich genau so auch einfach die Liste weitergeben.
Java:
public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/customcontrollerinjection/first.fxml"));
        loader.setControllerFactory(factory -> new FirstController(new Model()));

        Parent root = loader.load();

        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }
}
Man kann über die Methode FXMLLoader#setControllerFactory bestimmen, wie der Controller vom Framework erstellt werden soll - so eben auch welcher Konstruktor genutzt werden soll. Es wird also in der Main ein Model Objekt erzeugt und dem FirstController im Konstruktor übergeben.
Java:
public class FirstController {

    private final Model model;

    public FirstController(Model model) {
        this.model = model;
    }

    @FXML
    public void onNext(ActionEvent event) throws IOException {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/customcontrollerinjection/second.fxml"));
        loader.setControllerFactory(factory -> new SecondController(model));

        Parent root = loader.load();
        Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
        stage.setScene(new Scene(root, 400, 400));
    }

    @FXML
    public void onAdd(ActionEvent event) {
        String s = "Eintrag #" + (model.getPlayers().size() + 1);
        model.add(s);
        System.out.println("Added " + s);
    }
}
Dieses Model Objekt wird in FirstController genutzt, um dem Model über den Add Button neue Einträge hinzuzufügen (natülich nur Beispielhaft. Das sieht bei dir sicherlich etwas anders aus). Wenn über den Next Button dann die andere Scene geladen werden soll, wird auch dort angegeben, wie der Controller instanziiert werden soll. Dort wird wieder das Model Objekt übergeben.
Java:
public class SecondController implements Initializable {
    @FXML
    private ListView<String> listview;

    private Model model;

    public SecondController(Model model) {
        this.model = model;
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        listview.setItems(model.getPlayers());
    }
}
Im SecondController kann dann über das Model Objekt auf die Liste zugegriffen werden. Diese Liste wird dann von der ListView angezeigt.
Du kannst natürlich das Model an der Stelle erzeugen wo du es brauchst. Wenn du der Meinung bist dir reicht es, wenn das Model zB im FirstController erzeugt wird, kannst du das auch dort tun. Wichtig ist, dass du in deiner gesamten Applikation mit dem selben Model Objekt arbeitest (oder wie in deinem Fall mit der selben Liste).

Vollständigkeitshalber hier noch die Model Klasse. Die FXML Dateien sind recht unspektakulär deshalb lass ich sie hier mal raus
Java:
public class Model {
    private ObservableList<String> players;

    public Model() {
        this.players = FXCollections.observableArrayList();
    }

    public void add(String s) {
        players.add(s);
    }

    public ObservableList<String> getPlayers() {
        return players;
    }
}
 

dzim

Top Contributor
Nur so zur Info: Das ist doch etwas, was wir immer wieder hier im Forum als Thema haben. Foren-Suche und Deep-Links sind also auch eine Option... ;)
 

karlmasutra

Mitglied
@dzim
Nur so zur Info: Das ist doch etwas, was wir immer wieder hier im Forum als Thema haben. Foren-Suche und Deep-Links sind also auch eine Option... ;)
Ich habe mich vorher schon im Forum informiert. Allerdings habe ich nix gefunden unter meiner Suche "ListView". Wenn man nicht weiß was das Problem ist, kann man auch nicht nach der richtigen Lösung suchen.

Aber du hast recht, Forensuche ist eine Option.
 

dzim

Top Contributor
@karlmasutra ja nee, ich meinte nicht wegen dem ListView, sondern wenn dann allgemein Controller und speziell ControllerFactory, bzw. FXML Dependency Injection.

Aber ist ja löblich, dass @Robat sich so viel Mühe gibt. ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Obseved List mit ListView (Dateiliste) AWT, Swing, JavaFX & SWT 4
H JavaFX ListView MultipleSelection AWT, Swing, JavaFX & SWT 9
AmsananKING ListView Drag And Drop AWT, Swing, JavaFX & SWT 0
AmsananKING Drag And Drop Filenames Inside A Listview AWT, Swing, JavaFX & SWT 1
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
Davee JavaFX ListView = null wenn ich sie in Laufzeit ändern will! AWT, Swing, JavaFX & SWT 16
G Eintrag soll nur einmal in Listview zu sehen sein AWT, Swing, JavaFX & SWT 3
T ListView nach Erweiterung Fehler in CellFactory AWT, Swing, JavaFX & SWT 8
T ListView in TableCell AWT, Swing, JavaFX & SWT 4
MiMa File Dateien im ListView als Name anzeigen? AWT, Swing, JavaFX & SWT 6
B JavaFX ListView in Kombination mit TextField AWT, Swing, JavaFX & SWT 5
B JavaFX das richtige ListView filtern AWT, Swing, JavaFX & SWT 2
B Dynamische ListView-Größe, die bei Fenstergrößenänderung sich anpasst AWT, Swing, JavaFX & SWT 19
S JavaFX ListView Inhalte während Laufzeit ändern AWT, Swing, JavaFX & SWT 23
B Textfelder in einer ListView ausgeben AWT, Swing, JavaFX & SWT 13
J CheckBoxListCell auf click event in listView reagieren AWT, Swing, JavaFX & SWT 1
karlmasutra JavaFX Listenelemente bearbeiten Listview AWT, Swing, JavaFX & SWT 1
D JavaFX Listview mit observableList AWT, Swing, JavaFX & SWT 6
MiMa Selektion aus einer ListView AWT, Swing, JavaFX & SWT 5
N Frage zu ListView AWT, Swing, JavaFX & SWT 11
L JavaFX ListView Größe anpassen AWT, Swing, JavaFX & SWT 1
F JavaFX ListView füllen in Controller Class AWT, Swing, JavaFX & SWT 12
F JavaFX In SampleController ObservableList zu ListView hinzufügen AWT, Swing, JavaFX & SWT 0
D JavaFX ListView & TabelView AWT, Swing, JavaFX & SWT 9
F JavaFX Custom ListView erstellt ghost Element AWT, Swing, JavaFX & SWT 3
F JavaFX Von Datenbank in ListView AWT, Swing, JavaFX & SWT 4
F JavaFX ListView Zeilenhöhe AWT, Swing, JavaFX & SWT 2
M Auswahl aus einer ListView AWT, Swing, JavaFX & SWT 3
F Icons neben Text in Listview setzen AWT, Swing, JavaFX & SWT 2
K ListView right click AWT, Swing, JavaFX & SWT 1
Y Listview Textfield vergrößern, Schrift anpassen AWT, Swing, JavaFX & SWT 0
C Liste - ListView wird nicht angezeigt AWT, Swing, JavaFX & SWT 15
L JavaFX ListView oder TableView Style überschreiben? AWT, Swing, JavaFX & SWT 6
thobren listview seclect abschalten AWT, Swing, JavaFX & SWT 1
NoXiD Java FX JFX 2 DnD ListView AWT, Swing, JavaFX & SWT 3
T [JavaFX 2.0] ListView editieren AWT, Swing, JavaFX & SWT 2
G JOptionPane zeigt nicht an was ich will AWT, Swing, JavaFX & SWT 2
S JavaFX WebView zeigt bestimmte Websites nicht an AWT, Swing, JavaFX & SWT 2
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
S JavaFX WebView zeigt keine Animation AWT, Swing, JavaFX & SWT 5
P JTextarea (in JScrollPane) zeigt nur die beiden letzten Einträge an? AWT, Swing, JavaFX & SWT 0
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
C FileChooser Save-Dialog zeigt Files nicht an AWT, Swing, JavaFX & SWT 3
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
F JList zeigt keine Einträge mehr AWT, Swing, JavaFX & SWT 1
C Swing JList zeigt keine neuen Einträge an AWT, Swing, JavaFX & SWT 1
A Swing JPanel zeigt Buttons nicht an AWT, Swing, JavaFX & SWT 4
N GUI zeigt alles klein an. AWT, Swing, JavaFX & SWT 7
Tausendsassa Frame öffnet aber zeigt keinen Inhalt... AWT, Swing, JavaFX & SWT 10
L Ausgabe in JEditorPane mittels HTMLEditorKit zeigt auf bestimmten Systemen falsche Zeichen AWT, Swing, JavaFX & SWT 1
T SWT Mysql Tabelle zeigt immer nur den ersten Wert immer wieder an AWT, Swing, JavaFX & SWT 3
K JavaFX TableViewer zeigt nichts an !! AWT, Swing, JavaFX & SWT 1
E Tabelle zeigt nicht neuste Datenbankeinträge an AWT, Swing, JavaFX & SWT 5
U Label zeigt nicht überall HTML Zeichen AWT, Swing, JavaFX & SWT 3
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
H RCP(SWT) Browser-Widget zeigt keine locale HTML-Dateien an AWT, Swing, JavaFX & SWT 1
W Swing Ausführung einer .jar zeigt keine Reaktion AWT, Swing, JavaFX & SWT 4
A Swing Vokabeltrainer zeigt in einfacher Ausführung nichts an AWT, Swing, JavaFX & SWT 5
S JLabel zeigt ImageIcon nicht AWT, Swing, JavaFX & SWT 13
K JDialog zeigt Components nicht an AWT, Swing, JavaFX & SWT 3
P Swing Dialog zeigt keinen Inhalt in Verbindung mit JFrame AWT, Swing, JavaFX & SWT 18
O JTable zeigt die alte Daten wieder AWT, Swing, JavaFX & SWT 23
H JTable zeigt keine Daten an AWT, Swing, JavaFX & SWT 5
Nicklas2751 Table View zeigt keinen Inhalt nur leere Zeilen AWT, Swing, JavaFX & SWT 2
A Swing JFilechooser zeigt verzeichnisse nicht an AWT, Swing, JavaFX & SWT 2
F GroupableTableHeader zeigt nur eine Zeile AWT, Swing, JavaFX & SWT 4
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
R Textarea zeigt Text nicht an AWT, Swing, JavaFX & SWT 5
0 JFrame zeigt Inhalt erst nach vergrößern an AWT, Swing, JavaFX & SWT 3
H TextArea zeigt kein Text an AWT, Swing, JavaFX & SWT 6
NR_EIGHT Swing JButton zeigt Icons nicht an AWT, Swing, JavaFX & SWT 3
A Swing JScrollPane zeigt keinerlei Inhalt an AWT, Swing, JavaFX & SWT 2
3 Applet Applet zeigt nur weiße Fläche AWT, Swing, JavaFX & SWT 15
C Swing JTable zeigt in jeder Zelle einer Reihe denselben Inhalt AWT, Swing, JavaFX & SWT 2
C Swing JTextPane zeigt HTML-Text aus Variable nicht an :( AWT, Swing, JavaFX & SWT 3
H JList zeigt die Daten aus dem Array nicht an! AWT, Swing, JavaFX & SWT 13
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
F Applet zeigt Bilder nicht an AWT, Swing, JavaFX & SWT 5
J Swing JPanel mit Hintergrund zeigt componente nicht AWT, Swing, JavaFX & SWT 6
B JScrollbarPane zeigt keine scrollbars AWT, Swing, JavaFX & SWT 2
U JComboBox zeigt den Aufklapppfeil nicht mehr an AWT, Swing, JavaFX & SWT 7
hdi Swing setPreferredSize zeigt keine Änderung AWT, Swing, JavaFX & SWT 2
L Swing JDialog zeigt keinen Inhalt an AWT, Swing, JavaFX & SWT 5
C JTextArea zeigt keine Scrollbalken AWT, Swing, JavaFX & SWT 18
K JDialog zeigt keine Komponenten wenn es modal ist AWT, Swing, JavaFX & SWT 2
D JScrollPane zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 2
S Seltsam: SWT Table zeigt keine Scrollbar an AWT, Swing, JavaFX & SWT 12
G JTable zeigt keine Spaltenheader AWT, Swing, JavaFX & SWT 7
G Textarea zeigt Text erst am Schluss an AWT, Swing, JavaFX & SWT 2
F JScrollPane mit JPanel drinne zeigt keine Scroll-Leisten AWT, Swing, JavaFX & SWT 7
S JComboBox zeigt beim 1. öffnen nur 2 Elemente ? AWT, Swing, JavaFX & SWT 9
G flow layout zeigt die komponenten nicht richtig an AWT, Swing, JavaFX & SWT 5
C Jar Datei ist ausführbar aber zeigt keine icon's an AWT, Swing, JavaFX & SWT 18
N JTable zeigt ColumnHeaders nicht an AWT, Swing, JavaFX & SWT 2
B JFrame nach Start leer, größer ziehen zeigt Inhalt an AWT, Swing, JavaFX & SWT 2
M JList zeigt nicht alle Elemente AWT, Swing, JavaFX & SWT 4
J JEditorPane zeigt nicht alles AWT, Swing, JavaFX & SWT 2
I JFileChooser: Zeigt keine Eingabefeld AWT, Swing, JavaFX & SWT 2
M JTable zeigt keine Scrollbars bei JScrollpaneeinbettung AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben