【问题标题】:Get JavaFX TableCell in order to change its style获取 JavaFX TableCell 以更改其样式
【发布时间】:2018-04-06 10:51:55
【问题描述】:

我正在收集实时数据库存,一切工作顺利,实时更新变化。我不是 JavaFX 方面的专家,我浏览了文档,但仍然不太适应。

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


我有:

  • Stock 具有属性variation
  • 可观察列表ObservableList<Stock> myStocksObservableList 包含我愿意显示的数据
  • TableView myStockTable 声明为TableView<Stock> myStockTable;
  • 一组以_variation 作为我感兴趣的列的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;

初始化(假设myStocksObservableList 已经填充了 Stock 的列表:

    _symbol.setCellValueFactory(new PropertyValueFactory<>("symbol"));
    _open.setCellValueFactory(new PropertyValueFactory<>("open"));
    _high.setCellValueFactory(new PropertyValueFactory<>("high"));
    _low.setCellValueFactory(new PropertyValueFactory<>("low"));
    _close.setCellValueFactory(new PropertyValueFactory<>("close"));
    _volume.setCellValueFactory(new PropertyValueFactory<>("volume"));
    _variation.setCellValueFactory(new PropertyValueFactory<>("variation"));
    _comment.setCellValueFactory(new PropertyValueFactory<>("comment"));
     mystockTable.setItems(myStocksObservableList);

如何添加侦听器或任何此类技巧来检查特定的 TableCell 值,该值将是列 _variation 和我指定的行的交集,然后相应地更改其样式? p>

我们将不胜感激任何解决方案,以及任何建议!

【问题讨论】:

  • “获取”一个单元格不是要走的路,因为单元格被重复用于不同的行项目。了解条件对于推荐一种存储单元格是否应该设置样式的信息的方法很有用。此外,了解 CSS 是否足以为单元格设置样式会很有用。
  • CSS 就足够了。问题是我可以从特定的行和列中获取一个单元格吗?如果我可以在我的界面中获得一个特定的节点,我可以按照我希望的方式为其设置样式。

标签: java javafx-8 tablecell


【解决方案1】:

如果您可以提供包含要设置样式的项目的ObservableValue&lt;Stock&gt;(或以允许您添加侦听器的方式存储信息的任何其他方式),则可以使用自定义TableRows 添加伪类到行并使用外部样式表设置单元格样式:

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 样式表

.table-row-cell:marked .table-cell.variation {
    -fx-font-style: italic; /* or some other style */
}

【讨论】:

  • +1 非常接近我想要做的事情。现在,我将坚持行样式,我将在下周转到单元格,一旦我得到一个干净的工作解决方案,我会发布它作为现在的答案,我会接受你的。
【解决方案2】:

我认为没有办法直接获取表格单元格并对其进行修改。

但是,您可以尝试创建一个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]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    相关资源
    最近更新 更多