2013-06-11 3 views
8

Das hat mich schon eine Weile verwirrt und ich kann es nicht begreifen. Ich verwende Cell Value Factory, um eine einfache Tabelle mit einer Spalte zu füllen, und sie füllt die Tabelle nicht auf.Javafx PropertyValueFactory wird nicht gefüllt Tableview

Es tut, und ich klicke auf die Zeilen, die ausgefüllt sind, aber ich sehe keine Werte in ihnen - in diesem Fall String-Werte. [Ich habe dies gerade bearbeitet, um es klarer zu machen]

Ich habe ein anderes Projekt, unter dem es unter der gleichen Art von Datenmodell arbeitet. Was mache ich falsch?

Hier ist der Code. Der kommentierte Code am Ende scheint jedoch zu funktionieren. Ich habe überprüft, ob die üblichen Fehler - Erstellen einer neuen Spalteninstanz oder einer neuen Tableview-Instanz - vorhanden sind. Nichts. Bitte helfen Sie!


// Einfache Datenmodell Stock.java

public class Stock { 

    private SimpleStringProperty stockTicker; 

    public Stock(String stockTicker) { 
     this.stockTicker = new SimpleStringProperty(stockTicker); 
    } 

    public String getstockTicker() { 
     return stockTicker.get(); 
    } 

    public void setstockTicker(String stockticker) { 
     stockTicker.set(stockticker); 
    } 
} 

// Controller-Klasse MainGuiController.java

private ObservableList<Stock> data; 
    @FXML 
    private TableView<Stock> stockTableView;// = new TableView<>(data); 
    @FXML 
    private TableColumn<Stock, String> tickerCol; 


    private void setTickersToCol() { 
    try { 
     Statement stmt = conn.createStatement();//conn is defined and works 
     ResultSet rsltset = stmt.executeQuery("SELECT ticker FROM tickerlist order by ticker"); 
     data = FXCollections.observableArrayList(); 
     Stock stockInstance; 
     while (rsltset.next()) { 
      stockInstance = new Stock(rsltset.getString(1).toUpperCase()); 
      data.add(stockInstance); 
     } 
    } catch (SQLException ex) { 
     Logger.getLogger(WriteToFile.class.getName()).log(Level.SEVERE, null, ex); 
     System.out.println("Connection Failed! Check output console"); 
    } 

    tickerCol.setCellValueFactory(new PropertyValueFactory<Stock,String>("stockTicker")); 
    stockTableView.setItems(data); 
    } 

    /*THIS, ON THE OTHER HAND, WORKS*/ 
    /*Callback<CellDataFeatures<Stock, String>, ObservableValue<String>> cellDataFeat = 
      new Callback<CellDataFeatures<Stock, String>, ObservableValue<String>>() { 
     @Override 
     public ObservableValue<String> call(CellDataFeatures<Stock, String> p) { 
      return new SimpleStringProperty(p.getValue().getstockTicker()); 
     } 
    };*/ 

Antwort

24

Wie Fix It

Der Fall von deinem bekommen ter und Setter-Methoden sind falsch.

getstockTicker sollte getStockTicker

setstockTicker sollte setStockTicker

Einige Hintergrundinformationen

Ihre PropertyValueFactory bleibt gleich mit:

new PropertyValueFactory<Stock,String>("stockTicker") 

Die Namenskonvention wil l scheinen offensichtlicher, wenn Sie eine Eigenschaft Accessor Ihre Stock-Klasse hinzufügen:

public class Stock { 

    private SimpleStringProperty stockTicker; 

    public Stock(String stockTicker) { 
     this.stockTicker = new SimpleStringProperty(stockTicker); 
    } 

    public String getStockTicker() { 
     return stockTicker.get(); 
    } 

    public void setStockTicker(String stockticker) { 
     stockTicker.set(stockticker); 
    } 

    public StringProperty stockTickerProperty() { 
     return stockTicker; 
    } 
} 

Die PropertyValueFactory Reflexion nutzt die entsprechenden Zugriffs zu finden. Zuerst wird versucht, den stockTickerProperty-Accessor zu verwenden, und falls dies nicht der Fall ist, wird auf Getter und Setter zurückgegriffen. Es wird empfohlen, einen Eigenschaftenaccessor bereitzustellen, da Sie dann automatisch Ihre Tabelle aktivieren, um die Eigenschaft im zugrunde liegenden Modell zu beobachten und dynamisch ihre Daten zu aktualisieren, wenn sich das zugrunde liegende Modell ändert.

+1

Hier ist der AGGRAVIERENDE TEIL: ALL mein Code verwendet eine Methode Namenskonvention wie diese. ALLES davon (abgesehen von diesem einen Ausschnitt) Ich habe DAYS zu diesem Thema verbracht ... MEIN FREAKIN GOTT !! DANKE !!!! –

+0

@jewelsea warum Getter zweimal angerufen? und mehr als das Objekt der Person? – UnKnown

+0

Entschuldigung Unbekannt, ich verstehe nicht, was Sie fragen. Vielleicht möchten Sie eine neue Frage stellen. – jewelsea

0

Setzen Sie die Getter- und Setter-Methode in Ihre Datenklasse für alle Elemente.

+0

Könnten Sie ein wenig genauer sein? Bitte geben Sie Antworten, die vom Fragesteller nicht geklärt werden müssen. Für mehr lesen [How To Answer] (http://stackoverflow.com/help/how-to-answer). –