JavaFX-如何使用Java代码更改所选TableColumn的颜色?
我有一个简单的表格视图,有两列(Id,有效)。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
表的代码如下所示:
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;
}