2013-01-07 110 views
1

我想用多色单元格创建TableView。但我仍然需要选中行中的高亮单元格。我怎样才能做到这一点?例如,我有FXproperties类的用户bean,我需要在“Orders count”列中包含“1”的绘制单元格。如果选择包含这样的单元格的行,则应该选择该单元格。 用户类:TableView中的JavaFX单元格颜色

public class User { 
private StringProperty firstName = new SimpleStringProperty(); 
private StringProperty lastName = new SimpleStringProperty(); 
private IntegerProperty ordersCount = new SimpleIntegerProperty(0); 

public User(String firstName, String lastName, int ordersCount) { 
    this.firstName.set(firstName); 
    this.lastName.set(lastName); 
    this.ordersCount.set(ordersCount); 
} 

public final String getFirstName() { 
    return firstName.get(); 
} 

public final String getLastName() { 
    return lastName.get(); 
} 

public Integer getOrdersCount() { 
    return ordersCount.get(); 
} 

public void setFirstName(String firstName) { 
    this.firstName.set(firstName); 
} 

public void setLastName(String lastName) { 
    this.lastName.set(lastName); 
} 

public void setOrdersCount(Integer ordersCount) { 
    this.ordersCount.set(ordersCount); 
} 

public StringProperty firstNameProperty(){ 
    return firstName; 
} 

public StringProperty lastNameProperty(){ 
    return lastName; 
} 

public IntegerProperty ordersCountProperty(){ 
    return ordersCount; 
} 

}

CSS文件:

.oneCell { 
-fx-control-inner-background: lightsteelblue; 
-fx-background-color: -fx-table-cell-border-color, -fx-control-inner-background; 
-fx-background-insets: 0, 0 0 1 0; 
} 

主类:

public class JavaFXApplication13 extends Application { 



@Override 
public void start(Stage primaryStage) { 
    ObservableList<User> users = FXCollections.observableArrayList(); 
    for(int i = 0; i < 100; i++){ 
     users.add(Helper.createRandomUser()); 
    }   
    TableView<User> tableView = new TableView<>(); 
    tableView.setItems(users); 
    TableColumn<User, String> firstNameColumn = new TableColumn<>("First name"); 
    firstNameColumn.setCellValueFactory(new PropertyValueFactory<User, String>("firstName")); 
    TableColumn<User, String> lastNameColumn = new TableColumn<>("Last name"); 
    lastNameColumn.setCellValueFactory(new PropertyValueFactory<User, String>("lastName")); 
    TableColumn<User, Object> ordersCountColumn = new TableColumn<>("Orders count"); 
    ordersCountColumn.setCellValueFactory(new PropertyValueFactory<User, Object>("ordersCount")); 
    ordersCountColumn.setCellFactory(new CellFactory()); 
    tableView.getColumns().addAll(firstNameColumn, lastNameColumn, ordersCountColumn); 

    StackPane root = new StackPane(); 
    root.getChildren().add(tableView); 
    Scene scene = new Scene(root, 500, 500); 
    scene.getStylesheets().add("javafxapplication13/main.css"); 
    primaryStage.setTitle("Hello World!"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 


public static void main(String[] args) { 
    launch(args); 
} 


private class CellFactory implements Callback<TableColumn<User, Object>, TableCell<User, Object>> { 

    @Override 
    public TableCell<User, Object> call(TableColumn<User, Object> p) { 
     TableCell<User, Object> cell = new TableCell<User, Object>(){ 
      @Override 
      public void updateItem(Object item, boolean empty) { 
       super.updateItem(item, empty); 
       String text = getString(); 
       setText(empty ? null : text); 
       setGraphic(null); 
       getStyleClass().remove("oneCell"); 
       if (text != null && text.contains("1")) { 
        getStyleClass().add("oneCell"); 
       } 
      } 

      private String getString() { 
       return getItem() == null ? "" : getItem().toString(); 
      } 
     }; 
     return cell; 
    } 
} 

} 
+2

我认为你还需要为“oneCell”定义选择,填充,聚焦等CSS伪类。请参阅JavaFX CSS指南。此外,如果仅查找字符串“1”,请使用equals()而不是contains()。 –

+0

为了更好,更快的帮助,发布[SSCCE](http://sscce.org/) –

回答

1

蛮力溶液:

private class CellFactory implements Callback<TableColumn<User, Object>, TableCell<User, Object>> { 

    @Override 
    public TableCell<User, Object> call(TableColumn<User, Object> p) { 
     TableCell<User, Object> cell = new TableCell<User, Object>() { 

      @Override 
      public void updateItem(Object item, boolean empty) { 
       super.updateItem(item, empty); 
       String text = getString(); 
       setText(empty ? null : text); 
       setGraphic(null); 
       updateStyles(false); 

       getTableView().getSelectionModel().getSelectedItems().addListener(new ListChangeListener<User>() { 

        @Override 
        public void onChanged(Change<? extends User> change) { 
         while (change.next()) { 
          if (getTableRow() != null) { 
           if (change.wasRemoved() && change.getRemoved().contains(getTableRow().getItem())) { 
            updateStyles(false); 
           } 
           if (change.wasAdded() && change.getList().contains(getTableRow().getItem())) { 
            updateStyles(true); 
           } 
          } 
         } 
        } 
       }); 
      } 

      private String getString() { 
       return getItem() == null ? "" : getItem().toString(); 
      } 

      private void updateStyles(boolean becameSelected) { 
       if (becameSelected) { 
        getStyleClass().remove("oneCell"); 
       } else { 
        if (getString() != null && getString().contains("1")) { 
         getStyleClass().add("oneCell"); 
        } 
       } 
      } 
     }; 
     return cell; 
    } 
} 
+0

我一直在寻找解决方案来更新表格单元格的颜色,当它被选中时,我发现这个代码适合我。谢谢。 –