JavaFX自定义表格单元格 - 奇怪的行为

时间:2016-11-13 17:15:13

标签: javafx-8

我有这段代码:

import javafx.application.Application;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Callback;

public class Example extends Application
{
    @Override
    public void start(Stage stage) throws Exception
    {
        TableView<Color> table = new TableView<>();
        ObservableList<Color> colors = FXCollections.observableArrayList();
        table.setItems(colors);
        table.setEditable(true);

        TableColumn<Color, Color> column = new TableColumn<>();
        column.setCellValueFactory(param -> new SimpleObjectProperty<>(param.getValue()));

        column.setCellFactory(param ->
        {
            ObservableList<Color> menuColors = FXCollections.observableArrayList();
            menuColors.addAll(Color.RED, Color.GREEN, Color.BLUE);
            return new ComboBoxTableCell(menuColors);
        });

        Button button = new Button("Add row");
        button.setOnAction(event -> colors.add(Color.BLACK));

        VBox box = new VBox(table, button);
        table.getColumns().add(column);
        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
        stage.setScene(new Scene(box));
        stage.show();
    }

    public class ComboBoxTableCell extends TableCell<Color, Color>
    {
        private ComboBox<Color> comboBox;

        public ComboBoxTableCell(ObservableList<Color> colors)
        {
            comboBox = createFancyComboBox(colors);
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        }

        @Override
        public void updateItem(Color item, boolean empty)
        {
            if (item == null || empty)
                setGraphic(null);
            else
                setGraphic(comboBox);
        }
    }

    private ComboBox<Color> createFancyComboBox(ObservableList<Color> colors)
    {
        ComboBox<Color> comboBox = new ComboBox<>(colors);
        Callback<ListView<Color>, ListCell<Color>> factory = list -> new ColorSquare();
        comboBox.setCellFactory(factory);
        comboBox.setButtonCell(factory.call(null));
        comboBox.setValue(colors.get(0));
        return comboBox;
    }

    public static class ColorSquare extends ListCell<Color>
    {
        @Override
        public void updateItem(Color item, boolean empty)
        {
            super.updateItem(item, empty);
            Rectangle rect = new Rectangle(18, 18);
            if (item != null)
            {
                rect.setFill(item);
                setGraphic(rect);
            }
        }
    }

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

如果我尝试运行它,请单击按钮,将颜色更改为绿色,然后单击按钮上的8次,绿色方块将消失。

我该如何解决这个问题?为什么会这样?真正的代码与此没什么不同,这是我唯一的问题。谢谢。

1 个答案:

答案 0 :(得分:0)

我注意到有时候表格单元格的重新渲染在一定次数的尝试之后不能正常工作。当用户在另一个单元格中输入值时,我有一个更新剩余金额的地方。

要解决这个问题,我会切换列的可见性。

column.setVisible(false);
column.setVisible(true);

我会在更改单元格中的值的操作后立即执行此操作。

这是一个黑客但似乎工作。