Javafx 使用在任何列中都不可见的属性更改表行颜色

Javafx 使用在任何列中都不可见的属性更改表行颜色,javafx,javafx-8,Javafx,Javafx 8,我需要使用在表格视图的任何列中都不可见的属性来更改表格行颜色。我做了以下工作: 创建一个模型类Person(serialNumber,first,last) 使用提取器创建人员的可观察列表 创建两个表视图(tableview1,tableview2)和一个共享相同数据的listview tableview1有一个serialCol1列,其可见属性设置为 错 我想使用绑定到tableview2中的列的serialNumber属性更改tableview1行的颜色 以下是完整的程序: import j

我需要使用在
表格视图的任何列中都不可见的属性来更改表格行颜色。我做了以下工作:

  • 创建一个模型类
    Person
    serialNumber
    first
    last
  • 使用提取器创建
    人员的可观察列表
  • 创建两个表视图(
    tableview1
    tableview2
    )和一个共享相同数据的
    listview
  • tableview1
    有一个
    serialCol1
    列,其可见属性设置为 错
  • 我想使用绑定到
    tableview2
    中的列的
    serialNumber
    属性更改
    tableview1
    行的颜色

    以下是完整的程序:

    import java.util.stream.Collectors;
    import java.util.stream.IntStream;
    import javafx.application.Application;
    import javafx.beans.Observable;
    import javafx.beans.property.IntegerProperty;
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.geometry.Insets;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.control.ListCell;
    import javafx.scene.control.ListView;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableRow;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.TextFieldTableCell;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.Priority;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    import javafx.util.StringConverter;
    
    /**
     *
     * @author kachna
     */
    public class Extractor extends Application {
    
        private final TableView<Person> tableView1 = new TableView<>();
        private final TableView<Person> tableView2 = new TableView<>();
        private final ListView<Person> listView = new ListView<>();
        //observable list with extractor
        private final ObservableList<Person> data = FXCollections.observableArrayList(p -> new Observable[]{p.serialNumberProperty(), p.firstProperty(), p.lastProperty()});
    
        static class Person {
    
            final IntegerProperty serialNumber;
            final StringProperty first;
            final StringProperty last;
    
            public Person(int serialNumber, String first, String last) {
                this.first = new SimpleStringProperty(first);
                this.last = new SimpleStringProperty(last);
                this.serialNumber = new SimpleIntegerProperty(serialNumber);
            }
    
            public IntegerProperty serialNumberProperty() {
                return serialNumber;
            }
    
            public StringProperty firstProperty() {
                return first;
            }
    
            public StringProperty lastProperty() {
                return last;
            }
    
            @Override
            public String toString() {
                return "Person{" + "first=" + first.get() + ", last=" + last.get() + '}';
            }
    
        }
    
        @Override
        public void start(Stage stage) {
    
            BorderPane root = new BorderPane();
            VBox vBox = new VBox(10);
            VBox.setVgrow(tableView2, Priority.ALWAYS);
            root.setPadding(new Insets(10));
            initTableViews();
            initListView();
            getData();
            Label label1 = new Label("TableView 1");
            label1.setStyle("-fx-font-size: 24px;\n"
                    + "-fx-font-weight: bold;");
            Label label2 = new Label("TableView 2");
            label2.setStyle("-fx-font-size: 24px;\n"
                    + "-fx-font-weight: bold;");
            vBox.getChildren().addAll(label1, tableView1,label2, tableView2);
            root.setCenter(vBox);
            root.setRight(listView);
            Scene scene = new Scene(root, 600, 400);
            stage.setScene(scene);
            stage.show();
    
        }
    
        private void initTableViews() {
            // first table view 
            tableView1.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
            tableView1.setEditable(true);
            tableView1.setRowFactory(tv -> new TableRow<Person>() {
    
                @Override
                protected void updateItem(Person item, boolean empty) {
                    super.updateItem(item, empty);
                    if (item != null) {
                        if (item.serialNumber.get() % 2 == 0) {
                            setStyle("-fx-background-color: orange;");
                        } else {
                            setStyle(" ");
                        }
                    } else {
                        setStyle(" ");
                    }
                }
    
            });
    
            TableColumn<Person, Number> serialCol1 = new TableColumn<>("Serial Number");
            serialCol1.setCellValueFactory(cellData -> cellData.getValue().serialNumberProperty());
            serialCol1.setCellFactory(TextFieldTableCell.forTableColumn(new StringConverter<Number>() {
    
                @Override
                public String toString(Number object) {
                    return object.toString();
                }
    
                @Override
                public Number fromString(String string) {
                    return Integer.parseInt(string);
                }
            }));
    
            // make the serialCol1 column invisible
            serialCol1.setVisible(false);
            TableColumn<Person, String> firstCol1 = new TableColumn<>("First Name");
            firstCol1.setCellValueFactory(cellData -> cellData.getValue().firstProperty());
            firstCol1.setCellFactory(TextFieldTableCell.forTableColumn());
            TableColumn<Person, String> lastCol1 = new TableColumn<>("Last Name");
            lastCol1.setCellFactory(TextFieldTableCell.forTableColumn());
            lastCol1.setCellValueFactory(cellData -> cellData.getValue().lastProperty());
            tableView1.getColumns().addAll(serialCol1, firstCol1, lastCol1);
            tableView1.setItems(data);
    
            // second table view  
            tableView2.setEditable(true);
            tableView2.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
            TableColumn<Person, Number> serialCol = new TableColumn<>("Serial Number");
            serialCol.setCellValueFactory(cellData -> cellData.getValue().serialNumberProperty());
            serialCol.setCellFactory(TextFieldTableCell.forTableColumn(new StringConverter<Number>() {
    
                @Override
                public String toString(Number object) {
                    return object.toString();
                }
    
                @Override
                public Number fromString(String string) {
                    return Integer.parseInt(string);
                }
            }));
            TableColumn<Person, String> firstCol2 = new TableColumn<>("First Name");
            firstCol2.setCellValueFactory(cellData -> cellData.getValue().firstProperty());
            TableColumn<Person, String> lastCol2 = new TableColumn<>("Last Name");
            lastCol2.setCellFactory(TextFieldTableCell.forTableColumn());
            lastCol2.setCellValueFactory(cellData -> cellData.getValue().lastProperty());
            tableView2.getColumns().addAll(serialCol, firstCol2, lastCol2);
            tableView2.setItems(data);
        }
    
        private void initListView() {
            //list view 
    
            listView.setCellFactory(list -> new ListCell<Person>() {
                @Override
                protected void updateItem(Person value, boolean empty) {
                    super.updateItem(value, empty);
                    if (!empty && value != null) {
                        if (value.serialNumber.get() % 2 == 0) {
                            setStyle("-fx-background-color: orange;");
                        } else {
                            setStyle(" ");
                        }
                        setText(String.format("%s %s %s", value.serialNumber.get(), value.firstProperty().get(), value.lastProperty().get()));
                    } else {
                        setText(null);
                        setStyle(" ");
                    }
    
                }
            });
    
            listView.setItems(data);
        }
    
        private void getData() {
            data.setAll(IntStream.range(0, 10)
                    .mapToObj(i -> new Person(i, "first" + i, "last" + i))
                    .collect(Collectors.toList()));
        }
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            launch(args);
        }
    
    }
    
    import java.util.stream.collector;
    导入java.util.stream.IntStream;
    导入javafx.application.application;
    导入javafx.beans.Observable;
    导入javafx.beans.property.IntegerProperty;
    导入javafx.beans.property.SimpleIntegerProperty;
    导入javafx.beans.property.SimpleStringProperty;
    导入javafx.beans.property.StringProperty;
    导入javafx.collections.FXCollections;
    导入javafx.collections.ObservableList;
    导入javafx.geometry.Insets;
    导入javafx.scene.scene;
    导入javafx.scene.control.Label;
    导入javafx.scene.control.ListCell;
    导入javafx.scene.control.ListView;
    导入javafx.scene.control.TableColumn;
    导入javafx.scene.control.TableRow;
    导入javafx.scene.control.TableView;
    导入javafx.scene.control.cell.TextFieldTableCell;
    导入javafx.scene.layout.BorderPane;
    导入javafx.scene.layout.Priority;
    导入javafx.scene.layout.VBox;
    导入javafx.stage.stage;
    导入javafx.util.StringConverter;
    /**
    *
    *@作者卡奇纳
    */
    公共类提取器扩展应用程序{
    private final TableView tableView1=新建TableView();
    private final TableView tableView2=新建TableView();
    私有最终ListView ListView=新建ListView();
    //带提取器的可观察列表
    private final ObservableList data=FXCollections.observableArrayList(p->new Observable[]{p.serialNumberProperty(),p.firstProperty(),p.lastProperty()});
    静态类人{
    最终整数属性序列号;
    最终财产优先;
    最后一次;
    公共人物(int serialNumber,字符串第一,字符串最后){
    this.first=新的SimpleStringProperty(第一);
    this.last=新的SimpleStringProperty(last);
    this.serialNumber=新的SimpleIntegerProperty(serialNumber);
    }
    公共IntegerProperty serialNumberProperty(){
    返回序列号;
    }
    公共属性firstProperty(){
    先返回;
    }
    公共字符串属性lastProperty(){
    最后返回;
    }
    @凌驾
    公共字符串toString(){
    返回“Person{”+“first=“+first.get()+”,last=“+last.get()+”}”;
    }
    }
    @凌驾
    公众假期开始(阶段){
    BorderPane根=新的BorderPane();
    VBox VBox=新的VBox(10);
    setVgrow(tableView2,Priority.ALWAYS);
    根。设置填充(新插图(10));
    initTableViews();
    initListView();
    getData();
    标签标签1=新标签(“TableView 1”);
    label1.setStyle(“-fx字体大小:24px;\n”
    +“-fx字体大小:粗体;”;
    标签2=新标签(“TableView 2”);
    label2.setStyle(“-fx字体大小:24px;\n”
    +“-fx字体大小:粗体;”;
    vBox.getChildren().addAll(label1、tableView1、label2、tableView2);
    root.setCenter(vBox);
    setRight(listView);
    场景=新场景(root,600400);
    舞台场景;
    stage.show();
    }
    私有void initTableViews(){
    //第一个表视图
    tableView1.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_策略);
    tableView1.setEditable(真);
    tableView1.setRowFactory(电视->新建TableRow(){
    @凌驾
    受保护的void updateItem(个人项目,布尔值为空){
    super.updateItem(项,空);
    如果(项!=null){
    if(item.serialNumber.get()%2==0){
    setStyle(“-fx背景色:橙色;”);
    }否则{
    设置样式(“”);
    }
    }否则{
    设置样式(“”);
    }
    }
    });
    TableColumn serialCol1=新的TableColumn(“序列号”);
    serialCol1.setCellValueFactory(cellData->cellData.getValue().serialNumberProperty());
    serialCol1.setCellFactory(TextFieldTableCell.forTableColumn(新的StringConverter()){
    @凌驾
    公共字符串toString(数字对象){
    返回object.toString();
    }
    @凌驾
    公共编号fromString(String){
    返回整数.parseInt(字符串);
    }
    }));
    //使serialCol1列不可见
    serialCol1.setVisible(false);
    TableColumn firstCol1=新的TableColumn(“名字”);
    firstCol1.setCellValueFactory(cellData->cellData.getValue().firstProperty());
    firstCol1.setCellFactory(TextFieldTableCell.forTableColumn());
    TableColumn lastCol1=新的TableColumn(“姓氏”);
    lastCol1.setCellFactory(TextFieldTableCell.forTableColumn());
    setCellValueFactory(cellData->cellData.getValue().lastProperty());
    tableView1.getColumns().addAll(serialCol1、firstCol1、lastCol1);
    tableView1.setItems(数据);
    //第二个表视图
    tableView2.setEditable(真);
    tableView2.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_策略);
    表列服务器
    
    tableView1.setRowFactory( tv -> new TableRow<Person>()
        {
          @Override
          protected void updateItem( final Person item, final boolean empty )
          {
            super.updateItem( item, empty );
    
            if ( !empty && item != null )
            {
    
              this.styleProperty().bind( Bindings.createStringBinding( () ->
              {
                if ( item.serialNumber.get() % 2 == 0 )
                {
                  return "-fx-background-color: orange;";
                }
                return " ";
              } , item.serialNumberProperty() ) );
    
            }
            else
            {
              /*
               * As per comment in the Cell API
               */
              setText( null );
              setGraphic( null );
    
              this.styleProperty().unbind();
    
              setStyle( " " );
            }
          }
        } );