Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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
Java 触发TableView的更新';s单元格的值,而不更改该值_Java_User Interface_Javafx_Tableview - Fatal编程技术网

Java 触发TableView的更新';s单元格的值,而不更改该值

Java 触发TableView的更新';s单元格的值,而不更改该值,java,user-interface,javafx,tableview,Java,User Interface,Javafx,Tableview,每行包含三个具有RGB值的单元格。我使用这些RGB值设置同一行中另一个单元格的背景。在需要背景颜色的单元格上,我有一个回调函数,它可以拾取RGB值并完美地设置背景。所以整个TableView看起来完全符合我的需要。我有一个颜色选择器,该选择器需要更新包含三个RGB值的选定行。我可以设置新的三个RGB值,但我还需要有彩色背景的单元格将自身更新为新的RGB值。在下面的代码中,我找到了一种方法来做到这一点,但我相信这是相当丑陋的 @FXML void handleColorPicker(ActionE

每行包含三个具有RGB值的单元格。我使用这些RGB值设置同一行中另一个单元格的背景。在需要背景颜色的单元格上,我有一个回调函数,它可以拾取RGB值并完美地设置背景。所以整个
TableView
看起来完全符合我的需要。我有一个颜色选择器,该选择器需要更新包含三个RGB值的选定行。我可以设置新的三个RGB值,但我还需要有彩色背景的单元格将自身更新为新的RGB值。在下面的代码中,我找到了一种方法来做到这一点,但我相信这是相当丑陋的

@FXML void handleColorPicker(ActionEvent event) 
{
    int r = (int) (comColorPicker.getValue().getRed()*255);
    int g = (int) (comColorPicker.getValue().getGreen()*255);
    int b = (int) (comColorPicker.getValue().getBlue()*255);

    ComTableView.getSelectionModel().getSelectedItem().setRCom(r);
    ComTableView.getSelectionModel().getSelectedItem().setGCom(g);
    ComTableView.getSelectionModel().getSelectedItem().setBCom(b);
    // we need to kick the cell value so it updates also the background color so we clear and rewrite the text string
    String currentName = ComTableView.getSelectionModel().getSelectedItem().getCommodityName();
    ComTableView.getSelectionModel().getSelectedItem().setCommodityName(" ");
    ComTableView.getSelectionModel().getSelectedItem().setCommodityName(currentName);
}   

上面代码的最后三行触发了单元格的
updateItem
,但我认为我这样做的方式很糟糕。我想知道,有没有更好的方法呢?

有两种方法:

  • 使用JavaFX
  • 部分重写数据类

  • 如果您要走2号公路: 假设表中的数据类为ColorData`并具有三个属性:

    • int-RCom
    • int-GCom
    • int BCom
    • String CommodityName
    现在,如果您将
    CommodityName
    String
    更改为
    StringProperty
    ,并通过

    commodityNameColumn.setCellValueFactory(cellData -> cellData.getValue().commodityNameProperty());
    
    其中,
    commodityNameColumn
    是TableView的TableColumn,它显示了
    commodityNameProperty()
    一种新的方法
    ColorData
    来访问新的StringProperty

    现在,如果您通过其setter更改StringProperty,并且值实际发生了更改,TableCell将相应地更新


    如果仍然不清楚如何将数据类链接到JavaFXTableView,我推荐