Javafx PropertyValueFactory 未填充 Tableview
Posted
技术标签:
【中文标题】Javafx PropertyValueFactory 未填充 Tableview【英文标题】:Javafx PropertyValueFactory not populating Tableview 【发布时间】:2013-06-06 19:02:26 【问题描述】:这让我困惑了一段时间,我似乎无法理解它。我正在使用单元格值工厂来填充一个简单的单列表,但它没有填充到表中。
确实如此,我单击了已填充的行,但我没有看到其中的任何值——在本例中为字符串值。 [我只是编辑了它以使其更清晰]
我有一个不同的项目,它在同一种数据模型下工作。我做错了什么?
这是代码。最后的注释代码似乎有效。我检查了是否存在常见的错误——创建一个新的列实例或一个新的 tableview 实例。没有。请帮忙!
//简单数据模型 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);
//控制器类 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());
;*/
【问题讨论】:
【参考方案1】:建议的解决方案(使用 Lambda,而不是 PropertyValueFactory)
代替:
aColumn.setCellValueFactory(new PropertyValueFactory<Appointment,LocalDate>("date"));
写:
aColumn.setCellValueFactory(cellData -> cellData.getValue().dateProperty());
有关更多信息,请参阅此答案:
Java: setCellValuefactory; Lambda vs. PropertyValueFactory; advantages/disadvantages使用 PropertyValueFactory 的解决方案
首选上述 lambda 解决方案,但如果您希望使用 PropertyValueFactory,此替代解决方案提供了相关信息。
如何解决
你的 getter 和 setter 方法的情况是错误的。
getstockTicker
应该是getStockTicker
setstockTicker
应该是setStockTicker
一些背景信息
您的 PropertyValueFactory 保持不变:
new PropertyValueFactory<Stock,String>("stockTicker")
当您还向 Stock 类添加属性访问器时,命名约定会显得更加明显:
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;
PropertyValueFactory 使用反射来查找相关的访问器(这些访问器应该是公共的)。首先,它将尝试使用 stockTickerProperty 访问器,如果不存在,则回退到 getter 和 setter。建议提供属性访问器,因为这样您将自动启用表来观察基础模型中的属性,并随着基础模型的变化动态更新其数据。
【讨论】:
这是最令人讨厌的部分:我的所有代码都使用这样的方法命名约定。所有这一切(除了那个sn-p)我在这个问题上花了好几天……我的天啊!谢谢!!!! @jewelsea 为什么 getter 调用了两次?而不仅仅是 Person 的对象? 抱歉未知,我不明白你在问什么。您可能想问一个新问题。 关于这一点的另一点,由于 JavaFx 使用反射来查找方法,因此请确保方法具有公共访问权限。【参考方案2】:将 Getter 和 Setter 方法放入所有元素的数据类中。
【讨论】:
您能说得更具体一点吗?请提供不需要提问者澄清的答案。更多信息请阅读How To Answer。以上是关于Javafx PropertyValueFactory 未填充 Tableview的主要内容,如果未能解决你的问题,请参考以下文章