JavaFX-如何使用Java代码更改所选TableColumn的颜色?

JavaFX-如何使用Java代码更改所选TableColumn的颜色?,java,javafx,tableview,Java,Javafx,Tableview,我有一个简单的表格视图,有两列(Id,有效)。 表的代码如下所示: private TableView<List<Object>> createTable() { TableView<List<Object>> table = new TableView<>(); TableColumn<List<Object>, String> idCol = new TableColum

我有一个简单的表格视图,有两列(Id,有效)。
表的代码如下所示:

private TableView<List<Object>> createTable()
    {
       TableView<List<Object>> table = new TableView<>();

       TableColumn<List<Object>, String> idCol = new TableColumn<>("ID");
       idCol.setCellValueFactory(new Callback<CellDataFeatures<List<Object>, String>, ObservableValue<String>>()
       {
          public ObservableValue<String> call(CellDataFeatures<List<Object>, String> param)
          {
             return new SimpleStringProperty(param.getValue().get(0).toString());
          }
       });
       TableColumn<List<Object>, String> validCol = new TableColumn<>("Valid");
       validCol.setCellValueFactory(new Callback<CellDataFeatures<List<Object>, String>, ObservableValue<String>>()
       {
          public ObservableValue<String> call(CellDataFeatures<List<Object>, String> param)
          {
             return new SimpleStringProperty(param.getValue().get(1).toString());
          }
       });
       table.getColumns().addAll(idCol, validCol);

       List<Object> firstRow = new ArrayList<Object>();
       firstRow.add(1);
       firstRow.add(0);
       List<Object> secondRow = new ArrayList<Object>();
       secondRow.add(2);
       secondRow.add(1);
       table.getItems().addAll(firstRow, secondRow);

       return table;
    }
private TableView createTable()
{
TableView table=新TableView();
TableColumn idCol=新的TableColumn(“ID”);
idCol.setCellValueFactory(新回调()
{
公共observeValue调用(CellDataFeatures参数)
{
返回新的SimpleStringProperty(param.getValue().get(0.toString());
}
});
TableColumn validCol=新的TableColumn(“有效”);
validCol.setCellValueFactory(新回调()
{
公共observeValue调用(CellDataFeatures参数)
{
返回新的SimpleStringProperty(param.getValue().get(1.toString());
}
});
table.getColumns().addAll(idCol,validCol);
List firstRow=new ArrayList();
第一行。添加(1);
第一行。添加(0);
List secondRow=new ArrayList();
第二行。添加(2);
第二行。添加(1);
table.getItems().addAll(第一行,第二行);
返回表;
}
有效行的背景应变为绿色,无效行的背景应变为红色。我意识到,通过设置一个rowfactory:

table.setRowFactory(new Callback<TableView<List<Object>>, TableRow<List<Object>>>()
   {
      @Override
      public TableRow<List<Object>> call(TableView<List<Object>> param)
      {
         return new TableRow<List<Object>>()
         {
            @Override
            protected void updateItem(List<Object> item, boolean empty)
            {
                super.updateItem(item, empty);
                if (!empty)
                {
                   int valid = Integer.parseInt(item.get(1).toString());
                   if (valid == 1)
                      setBackground(MyCustomBackGround.VALID);
                   else if (valid == 0)
                      setBackground(MyCustomBackGround.NOT_VALID);
                   else
                      setBackground(MyCustomBackGround.WHITE);
                }
            }
         };
      }
   });
table.setRowFactory(新回调()
{
@凌驾
公共TableRow调用(TableView参数)
{
返回新的TableRow()
{
@凌驾
受保护的void updateItem(列表项,布尔值为空)
{
super.updateItem(项,空);
如果(!空)
{
int valid=Integer.parseInt(item.get(1.toString());
如果(有效==1)
挫折背景(MyCustomBackGround.VALID);
else if(有效==0)
挫折背景(MyCustomBackGround.无效);
其他的
挫折背景(MyCustomBackGround.WHITE);
}
}
};
}
});
这似乎很管用。但是现在我想改变我选择的颜色。假设我想把设定的颜色调暗。

我怎样才能意识到这一点呢?

您可以使用
绑定,例如如下所示。或者,您可以使用
CSS
伪类

table.setRowFactory(tv->new TableRow(){
私人最终背景
validBackground=新背景(新背景填充(Color.LIGHTGREEN,CornerRadii.EMPTY,Insets.EMPTY)),
validSelectedBackground=新背景(新背景填充(Color.DARKGREEN,CornerRadii.EMPTY,Insets.EMPTY)),
invalidBackground=新背景(新背景填充(Color.RED,CornerRadii.EMPTY,Insets.EMPTY)),
invalidSelectedBackground=新背景(新背景填充(Color.DARKRED,CornerRadii.EMPTY,Insets.EMPTY));
@凌驾
public void updateItem(项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空)
backgroundProperty().unbind();
其他的
backgroundProperty().bind(Bindings.when(item.validProperty())
.then(Bindings.when(selectedProperty())
。然后(validSelectedBackground)
.否则(有效背景))
。否则(Bindings.when(selectedProperty())
。然后(无效选择背景)
.否则(无效背景);
}
});

更新:css示例

App.java:

package org.example;
导入javafx.application.application;
导入javafx.css.pseudo类;
导入javafx.scene.scene;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableRow;
导入javafx.scene.control.TableView;
导入javafx.scene.layout.Pane;
导入javafx.stage.stage;
导入java.util.Objects;
导入java.util.stream.IntStream;
导入java.util.stream.stream;
公共类应用程序扩展应用程序{
@凌驾
公众假期开始(阶段){
//创建包含列的表:
TableView table=新TableView();
TableColumn idCol=新的TableColumn(“ID”);
TableColumn validCol=新的TableColumn(“有效”);
forEach(col->table.getColumns().add(col));
idCol.setCellValueFactory(cellData->cellData.getValue().idProperty().asObject());
validCol.setCellValueFactory(cellData->cellData.getValue().validProperty());
//创建伪类:
PseudoClass validPseudoClass=PseudoClass.getPseudoClass(“有效”),
invalidPseudoClass=PseudoClass.getPseudoClass(“无效”);
//自定义行工厂:
表.setRowFactory(电视->{
TableRow行=新TableRow();
row.itemProperty().addListener((可观察、旧值、新值)->{
if(newValue!=null){
pseudoClassStateChanged(validPseudoClass,newValue.isValid());
row.pseudoClassStateChanged(invalidPseudoClass,!newValue.isValid());
}否则{
row.pseudoClassStateChanged(validPseudoClass,false);
row.pseudoClassStateChanged(invalidPseudoClass,false);
}
table.refresh();
});
返回行;
});
//创建测试数据:
IntStream.range(0,5).forEach(i->table.getItems().add(newitem(i,true));
IntStream.of(1,3).forEach(i->table.getItems().get(i).setValid(false));
//准备并展示场景:
场景=新场景(新窗格(表));
scene.getStylesheets().add(Objects.requirennull(//加载css文件
App.class.getResource(“style.css”).toExternalForm();
舞台场景;
stage.show();
}
公共静态void main(字符串[]args){
public TableView<List<Object>> getTableView()
{
   TableView<List<Object>> table = new TableView<List<Object>>();
   table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
   fillTableWithData();
   table.setColumnResizePolicy(STFTableView.CONSTRAINED_RESIZE_POLICY);

   // Create pseudo classes to be available in CSS:
   PseudoClass validPseudoClass = PseudoClass.getPseudoClass("valid"),
         invalidPseudoClass = PseudoClass.getPseudoClass("invalid");

   // Customized row factory:
   table.setRowFactory(tv ->
      {
         int validIdx = /*calculated*/;
         TableRow<List<Object>> row = new TableRow<>();
         row.itemProperty().addListener((observable, oldValue, newValue) ->
            {
                if (newValue != null && newValue.get(validIdx) != null)
                {
                   row.pseudoClassStateChanged(validPseudoClass, newValue.get(validIdx).equals(1));
                   row.pseudoClassStateChanged(invalidPseudoClass, newValue.get(validIdx).equals(0));
                }
                else
                {
                   row.pseudoClassStateChanged(validPseudoClass, false);
                   row.pseudoClassStateChanged(invalidPseudoClass, false);
                }
                table.refresh();
            });
         return row;
      });
   return table;
}
.table-row-cell:valid {
    -fx-background: white
}

.table-row-cell:valid:selected {
    -fx-background: gray
}

.table-row-cell:invalid {
    -fx-background: red;
}

.table-row-cell:invalid:selected {
    -fx-background: darkred;
}