获取JavaFXTableCell以更改其样式

获取JavaFXTableCell以更改其样式,java,javafx-8,tablecell,Java,Javafx 8,Tablecell,我正在进行实时数据库存收集,所有工作都顺利进行,实时更新变化。我不是JavaFX方面的专家,我查阅了文档,但仍然不太熟悉它 总之,长话短说,我想做的是:根据条件(不值得一提或代码发布)更改某些单元格的样式(行和列的交点) 我有: 类股票带有属性变化 可观察列表可观察列表myStocksObservableList包含我愿意显示的数据 TableViewmyStockTable声明为这样的TableView myStockTable 一组TableColumns,其变体为我感兴趣的列 代码

我正在进行实时数据库存收集,所有工作都顺利进行,实时更新变化。我不是JavaFX方面的专家,我查阅了文档,但仍然不太熟悉它

总之,长话短说,我想做的是:根据条件(不值得一提或代码发布)更改某些单元格的样式(行和列的交点)


我有:

  • 股票
    带有属性
    变化
  • 可观察列表
    可观察列表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();
    }

});