簡體   English   中英

TableView中的JavaFX單元格顏色

[英]JavaFX cells colors in TableView

我想用多色單元格創建TableView。 但是我仍然需要在選定的行中突出顯示單元格。 我怎樣才能做到這一點? 例如,我有類User-具有FXproperties的bean,並且我需要在“訂單數”列中包含“ 1”的繪畫單元。 如果選擇了包含該單元格的行-也應選擇此單元格。 用戶類別:

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;
    }
 }

}

蠻力解決方案:

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM