Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx 2 JavaFX2刷新表格单元格以更改样式_Javafx 2 - Fatal编程技术网

Javafx 2 JavaFX2刷新表格单元格以更改样式

Javafx 2 JavaFX2刷新表格单元格以更改样式,javafx-2,Javafx 2,我需要更改具有可变列数的TableView中任意单元格的样式。下面的代码显示了基本问题 ExampleRow类是来自电子表格的真实数据的代理,它的另一个功能是保存突出显示的信息。因为我不知道会有多少列,所以我只保留了一个应该突出显示的列列表(不支持重新排列列)。ExampleTableCell类只设置单元格的文本,并在需要时应用高亮显示 如果我在绘制表格之前设置了一个高亮显示[cell(2,2)],那么当应用程序启动时,单元格将正确显示为红色文本。问题是单击按钮会将单元格(1,1)设置为高亮显示

我需要更改具有可变列数的TableView中任意单元格的样式。下面的代码显示了基本问题

ExampleRow类是来自电子表格的真实数据的代理,它的另一个功能是保存突出显示的信息。因为我不知道会有多少列,所以我只保留了一个应该突出显示的列列表(不支持重新排列列)。ExampleTableCell类只设置单元格的文本,并在需要时应用高亮显示

如果我在绘制表格之前设置了一个高亮显示[cell(2,2)],那么当应用程序启动时,单元格将正确显示为红色文本。问题是单击按钮会将单元格(1,1)设置为高亮显示,但表格不会更改。如果我将应用程序窗口的大小调整为“无”,然后再次将其打开,则单元格(1,1)的高亮显示将正确绘制-可能是因为此过程强制进行完全重画

我想知道的是,如何触发表格重新绘制新高亮显示的单元格(或所有可见单元格),以便样式正确

短暂性脑缺血发作

包示例;
导入java.util.HashSet;
导入java.util.Set;
导入javafx.application.application;
导入javafx.beans.property.SimpleIntegerProperty;
导入javafx.beans.property.SimpleObject属性;
导入javafx.beans.value.observeValue;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.TableCell;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.paint.Color;
导入javafx.stage.stage;
导入javafx.util.Callback;
公共类CellHighlightExample扩展了应用程序{
私有最终int columnCount=4;
私有最终整数行数=5;
private TableView table=new TableView();
@凌驾
公众假期开始(阶段){
BorderPane根=新的BorderPane();
场景=新场景(根);
Callback cellValueFactory=new Callback(){
@凌驾
公共observeValue调用(TableColumn.celldatap){
int row=p.getValue().getRow();
int col=p.getTableView().getColumns().indexOf(p.getTableColumn());
返回新的SimpleObject属性(“(“+行+”,“+列+”);
}
};
Callback cellFactory=new Callback(){
@凌驾
公共TableCell调用(TableP列){
返回新的ExampleTableCell();
}
};
for(int i=0,n=columnCount;i
关于这个问题有很多讨论,即更改项目后刷新tableview。


问题


解决方案是触发内部tableview更新方法。有些人建议删除tableview项并再次添加它们。。但最简单的解决方案似乎是:

b.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent t) {
        ExampleRow row = table.getItems().get(1);
        row.addHighlightedColumn(1);
        //How to trigger a redraw of the table or cell to reflect the new highlighting?
        // Workaround
        table.getColumns().get(0).setVisible(false);
        table.getColumns().get(0).setVisible(true);
    }
});
b.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent t){
ExampleRow行=table.getItems().get(1);
行。添加高亮显示列(1);
//如何触发表格或单元格的重画以反映新的突出显示?
//变通办法
table.getColumns().get(0.setVisib)
b.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent t) {
        ExampleRow row = table.getItems().get(1);
        row.addHighlightedColumn(1);
        //How to trigger a redraw of the table or cell to reflect the new highlighting?
        // Workaround
        table.getColumns().get(0).setVisible(false);
        table.getColumns().get(0).setVisible(true);
    }
});