【问题标题】:javafx tablecolumn cell changejavafx 表格列单元格更改
【发布时间】:2017-03-08 04:04:52
【问题描述】:

我希望将单元格列设置为接收一个对象圆圈,以替换来自 observableList 中的数据库的值。该列中填充的值反映了另一列(假设 col A 和 B(从左到右)-它们基本上包含相同的信息,除了-我希望 col B 更改以表示圆形对象。这是我的代码到目前为止, 如有建议请指教。

status.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList, Circle>, ObservableValue<Circle>>() {
    @Override
    public ObservableValue<Circle> call(TableColumn.CellDataFeatures<ObservableList, Circle> param) {


        String c = (String) param.getValue().get(2); //getting all data in column 2 of the row
        System.out.println(c);

        switch(c){

            case "High":        
                circle.setFill(Color.GREEN);
                healthstatus.setStyle( "-fx-alignment: CENTER;");            
                break;

            case "Medium":
                circle.setFill(Color.YELLOW);
                healthstatus.setStyle( "-fx-alignment: CENTER;");           
                break;

            case "Low":
                circle.setFill(Color.RED);
                healthstatus.setStyle( "-fx-alignment: CENTER;");           
                break;

            default:
                circle.setFill(Color.BLUEVIOLET);
            }   
        return new SimpleObjectProperty(circle);                        
    }            
});

我更喜欢继续我的代码,而不必创建一个类来响应设置值。

我已经附上了一张图片来展示我到目前为止的结果。

提前致谢! Image

【问题讨论】:

  • 如果两列包含相同的信息,但显示方式不同,请为两者使用相同的cellValueFactory。使用不同的cellFactory 更改数据的显示方式。

标签: java javafx java-8 tablecolumn


【解决方案1】:

更新

正如@kleopatra 指出上一个答案中的一些问题和建议,我已经相应地更新了答案。

圆细胞

自定义 TableCell 用于圆形渲染

public class CircleCell extends TableCell<Person, String> {

    @Override
    protected void updateItem(String item, boolean empty) {

        super.updateItem(item, empty);

        if (isSafe(item, empty)) {
            CellData data = CellData.cellData(item);
            Circle circle = new Circle(6);
            circle.setFill(data.getColor());
            setGraphic(circle);
        }
    }

    private boolean isSafe(String item, boolean empty) {
        return !empty && Objects.nonNull(item);
    }
}

细胞数据

根据单元格数据保持颜色。

public enum CellData {

    HIGH("High", Color.GREEN),
    MEDIUM("Medium", Color.YELLOW),
    LOW("Low", Color.RED),
    NONE("None", Color.BLUEVIOLET);

    private String data;
    private Color color;

    CellData(String data, Color color) {
        this.data = data;
        this.color = color;
    }

    public static CellData cellData(String data) {
        return Arrays.stream(values())
                    .filter(e -> e.data.equals(data))
                    .findAny()
                    .orElse(NONE);
    }

    public Color getColor() {
        return color;
    }
}

设置工厂

使用自定义的 CircleCell 设置 cell-factory。

status.setCellFactory(column -> new CircleCell());

简单演示

public class CustomCellDemo extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane root = new BorderPane();
        root.setCenter(getTable());
        primaryStage.setScene(new Scene(root, 200, 200));
        primaryStage.show();
    }

    private TableView<Person> getTable() {
        TableView<Person> table = new TableView<>();
        table.getColumns().add(statusColumn());
        table.setItems(getItems());
        return table;
    }

    private TableColumn<Person, String> statusColumn() {
        TableColumn<Person, String> status = new TableColumn<>();
        status.setCellFactory(col -> new CircleCell());
        status.setGraphic(new Label("Status"));
        status.setStyle("-fx-alignment:center");
        status.setCellValueFactory(new PropertyValueFactory("Status"));
        status.setMinWidth(199);
        return status;
    }

    private ObservableList<Person> getItems() {
        ObservableList<Person> detail = FXCollections.observableArrayList();
        detail.add(new Person("Medium"));
        detail.add(new Person("Low"));
        detail.add(new Person("High"));
        detail.add(new Person(""));
        detail.add(new Person(null));
        return detail;
    }

    public class Person {
        private SimpleStringProperty status;

        public Person(String status) {
            this.status = new SimpleStringProperty(status);
        }

        public String getStatus() {
            return status.get();
        }

        public void setStatus(String status) {
            this.status = new SimpleStringProperty(status);
        }
    }
}

输出

【讨论】:

  • 天才! @ShekkarRaee - 谢谢,它成功了! ...由于我是菜鸟,我仍然需要更多地消化这些概念
  • 你有没有测试你的sn-ps?提示:如果该单元格已被重新/用于空单元格一次,您将获得 NPE ...
  • @kleopatra 我已经很好地测试了它并添加了一个演示:)
  • 清理工作再次丢失... *sigh
猜你喜欢
  • 2012-09-24
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 2017-12-17
  • 2012-07-28
相关资源
最近更新 更多