2013-06-11 14 views
8

Questo mi ha lasciato per un po 'di tempo e non riesco a capirlo. Sto usando Cell Value Factory per popolare una semplice tabella di colonne e non popola nella tabella.Javafx PropertyValueFactory non popolato Tableview

Fa e faccio clic sulle righe che vengono popolate ma non vedo alcun valore in esse, in questo caso Valori stringa. [Ho appena modificato questo per renderlo più chiaro]

Ho un progetto diverso sotto il quale funziona con lo stesso tipo di modello di dati. Che cosa sto facendo di sbagliato?

Ecco il codice. Il codice commentato alla fine sembra funzionare comunque. Ho controllato se ci sono i soliti errori - la creazione di una nuova istanza di colonna o di una nuova istanza di tableview. Niente. Per favore aiuto!


// semplice modello di dati 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); 
    } 
} 

// classe Controller 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()); 
     } 
    };*/ 

risposta

24

come risolverlo

Il caso del tuo ottenere i metodi ter e setter sono sbagliati.

getstockTicker dovrebbe essere getStockTicker

setstockTicker dovrebbe essere setStockTicker

Alcuni Informazioni di

tuo PropertyValueFactory rimane lo stesso con:

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

Il wil convenzione di denominazione l sembrano più evidente quando si aggiunge anche una funzione di accesso immobile alla sua della classe:

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; 
    } 
} 

Il PropertyValueFactory utilizza la riflessione per trovare i metodi di accesso rilevanti. In primo luogo proverà ad usare l'accessor di StockTickerProperty e, se questo non è presente, ricade sui getter e sui setter. Si consiglia di fornire un accessor di proprietà poiché in questo modo si abiliterà automaticamente la tabella a osservare la proprietà nel modello sottostante, aggiornando dinamicamente i dati mentre il modello sottostante cambia.

+1

Ecco la parte più AGGRAVATING: TUTTO il mio codice utilizza una convenzione di denominazione del metodo come quella. TUTTO (beh, eccetto per quel frammento) ho passato GIORNI su questo argomento ... IL MIO DIO FREAKIN !! GRAZIE !!!! –

+0

@jewelsea perché Getter ha chiamato due volte? e più dell'oggetto della persona? – UnKnown

+0

Siamo spiacenti, non noto, non capisco cosa stai chiedendo. Potresti voler fare una nuova domanda. – jewelsea

0

inserire il metodo Getter e Setter nella classe dati per tutti gli elementi.

+0

Potresti essere un po 'più specifico? Si prega di fornire risposte che non richiedono chiarimenti da parte del richiedente. Per ulteriori informazioni [Come rispondere] (http://stackoverflow.com/help/how-to-answer). –

Problemi correlati