TableView中的JavaFX控件行为奇怪 - 引发了bug

时间:2015-05-06 09:49:26

标签: java javafx javafx-2 javafx-8

Bug引发https://bugs.openjdk.java.net/browse/JDK-8088542

尝试使用我编写的以下测试用例代码向JavaFx可编辑TableView添加可编辑功能时: -

import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

public class Foo extends Application implements Runnable
{

  @Override
  public void start(Stage stage) 
  {
    final TableView table = new TableView();
    final TableColumn column = new TableColumn();
    table.setEditable(true);
    column.setEditable(true);

    table.setItems(FXCollections.observableArrayList());

    column.setCellFactory(cell -> new EditableComboBoxCell());
    column.setCellValueFactory(param -> new SimpleStringProperty("foo"));

    table.getColumns().add(column);

    // Simple thread loop to demonstrate adding items

    new Thread(() ->
    {
        try
        {
            while (true)
            {
                Thread.sleep(20000);
                Platform.runLater(() -> table.getItems().add("foo"));
            }

        } catch (InterruptedException e)
        {
        }
    }).start();

    Scene scene = new Scene(new StackPane(table));

    stage.setScene(scene);

    stage.show();

  }

  @Override
  public void run()
  {
    launch();
  }
}

其中'EditableComboBoxCell'是: -

public class EditableComboBoxCell extends TableCell<String, String>
{

  private ComboBox<Object> comboBox;

  @Override
  public void startEdit()
  {
    super.startEdit();
    comboBox = new ComboBox<>();
    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    setGraphic(comboBox);
  }

  @Override
  public void cancelEdit()
  {
    super.cancelEdit();
    comboBox = null;
    setContentDisplay(ContentDisplay.TEXT_ONLY);
    setText(getItem());
  }

  @Override
  public void updateItem(final String item, final boolean empty)
  {
    super.updateItem(item, empty);
    if (empty)
    {
      setText(null);
      setGraphic(null);
    }
    else
    {
      if (isEditing())
      {
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        setGraphic(comboBox);
      }
      else
      {
        setContentDisplay(ContentDisplay.TEXT_ONLY);
        setText(getItem());
      }
    }
  }
}

我发现如果项目是动态添加的,那么每当添加下一个项目时,组合框就会消失。我已经通过每隔几秒钟添加一个新项目来测试它。当JavaFx TableView包含静态数据时,此代码可以正常工作。

我在Java 8u45和Java 8u60(早期访问)上观察到了这种行为。

我环顾四周,发现桌面视图中没有更新项目的错误,修复方法是将列设置为不可见,然后再次可见,但这并没有解决问题。此外,该修复似乎在8u60解决,我仍然观察到这种行为。

当tableview不断添加/删除数据时,JavaFx tableview是否无法很好地处理显示的控件?有什么工作吗?

0 个答案:

没有答案