获取JavaFXTableCell以更改其样式
我正在进行实时数据库存收集,所有工作都顺利进行,实时更新变化。我不是JavaFX方面的专家,我查阅了文档,但仍然不太熟悉它 总之,长话短说,我想做的是:根据条件(不值得一提或代码发布)更改某些单元格的样式(行和列的交点)获取JavaFXTableCell以更改其样式,java,javafx-8,tablecell,Java,Javafx 8,Tablecell,我正在进行实时数据库存收集,所有工作都顺利进行,实时更新变化。我不是JavaFX方面的专家,我查阅了文档,但仍然不太熟悉它 总之,长话短说,我想做的是:根据条件(不值得一提或代码发布)更改某些单元格的样式(行和列的交点) 我有: 类股票带有属性变化 可观察列表可观察列表myStocksObservableList包含我愿意显示的数据 TableViewmyStockTable声明为这样的TableView myStockTable 一组TableColumns,其变体为我感兴趣的列 代码
我有:
- 类
带有属性股票
变化
- 可观察列表
包含我愿意显示的数据可观察列表myStocksObservableList
- TableView
声明为这样的myStockTable
TableView myStockTable代码>
- 一组TableColumns,其变体为我感兴趣的列
代码(前端): 声明:
@FXML
private TableView<Stock> mystockTable;
@FXML
private TableColumn<Stock, String> _symbol;
@FXML
private TableColumn<Stock, Float> _open;
@FXML
private TableColumn<Stock, Float> _high;
@FXML
private TableColumn<Stock, Float> _low;
@FXML
private TableColumn<Stock, Float> _close;
@FXML
private TableColumn<Stock, Long> _volume;
@FXML
private TableColumn<Stock, Float> _variation;
@FXML
private TableColumn<Stock, String> _comment;
@FXML
private ObservableList<Stock> myStocksObservableList;
如何添加侦听器或任何此类技巧,以检查特定的TableCell值,该值将是列变量和我指定的行的交点,然后相应地更改其样式
任何解决方案,以及任何建议都将不胜感激 我认为没有办法直接获取表格单元格并对其进行修改 但是,您可以尝试创建一个
CellFactory
,根据单元格的更新更改单元格的属性(例如样式)
Callback factory = new Callback<TableColumn<String[], String>, TableCell<String[], String>>() {
@Override
public TableCell<String[], String> call(TableColumn<String[], String> param)
{
return new TableCell<String[], String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
// depending on item's value do something. . .
// for instance, if item == 'bla' change cell color
// this.setStyle(.....)
// don't forget to set item's text
setText(item);
}
};
}
};
// your table data in the from of String[][] where the first row holds the column titles
//String[][] data = ...
tableView.getColumns().clear();
tableView.getItems().clear();
// populating the tableView
for (int rowIndex = 0 ; rowIndex < data.length ; rowIndex++)
{
for (int columnIndex = tableView.getColumns().size(); columnIndex < data[rowIndex].length; columnIndex++)
{
TableColumn<String[], String> column = new TableColumn<>();
final int index = columnIndex;
column.setCellFactory(factory); // Important line
column.setCellValueFactory(cellData -> {
String[] row = cellData.getValue();
String value = row[index];
return new SimpleStringProperty(value);
});
tableView.getColumns().add(column);
}
tableView.getItems().add(data[rowIndex]);
}
回调工厂=新回调(){
@凌驾
公共TableCell调用(TableColumn参数)
{
返回新的TableCell(){
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
//根据物品的价值做点什么。
//例如,如果item='bla'更改单元格颜色
//此.setStyle(…)
//不要忘记设置项目的文本
setText(项目);
}
};
}
};
//您的表数据位于字符串[][]的from中,其中第一行包含列标题
//字符串[][]数据=。。。
tableView.getColumns().clear();
tableView.getItems().clear();
//填充tableView
对于(int-rowIndex=0;rowIndex{
String[]行=cellData.getValue();
字符串值=行[索引];
返回新的SimpleStringProperty(值);
});
tableView.getColumns().add(column);
}
tableView.getItems().add(数据[rowIndex]);
}
如果您可以提供一个包含要设置样式的项的ObservableValue
(或以允许您添加侦听器的方式存储信息的任何其他方式),则可以使用自定义TableRow
向行添加伪类,并使用外部样式表设置单元格样式:
ObservableValue<Stock> markedItem = ...;
PseudoClass marked = PseudoClass.getPseudoClass("marked");
_variation.getStyleClass().add("variation");
mystockTable.setRowFactory(tv -> new TableRow<Stock>() {
private void updatePseudoclass() {
pseudoClassStateChanged(marked, !isEmpty() && getItem() == markedItem.getValue());
}
{
markedItem.addListener(o -> updatePseudoclass());
}
@Override
protected void updateItem(Stock item, boolean empty) {
super.updateItem(item, empty);
updatePseudoclass();
}
});
“获取”单元格并不是一个好办法,因为单元格会被重复用于不同的行项目。了解这种情况将有助于推荐一种存储信息的方法,无论单元格是否应设置样式。此外,了解CSS是否足以设置单元格的样式也很有用。CSS是否足以确定。问题是我可以从特定的行和列中获取单元格吗?如果我能在我的界面中得到一个特定的节点,我就可以按我所希望的方式设置它的样式。+1非常接近我要做的事情。现在,我将坚持行样式,下周我将转到单元格,一旦我得到一个干净的工作解决方案,我将发布它作为现在的答案,我将接受你的答案。
ObservableValue<Stock> markedItem = ...;
PseudoClass marked = PseudoClass.getPseudoClass("marked");
_variation.getStyleClass().add("variation");
mystockTable.setRowFactory(tv -> new TableRow<Stock>() {
private void updatePseudoclass() {
pseudoClassStateChanged(marked, !isEmpty() && getItem() == markedItem.getValue());
}
{
markedItem.addListener(o -> updatePseudoclass());
}
@Override
protected void updateItem(Stock item, boolean empty) {
super.updateItem(item, empty);
updatePseudoclass();
}
});