2

次のワークフローが意図されています: ユーザーがボタンをクリック -> 選択した TreeItem で、新しい TreeItem を作成する必要があります。次のスクリーンショットに示すように、選択した TreeItem が展開され、新しい TreeItem が表示され、編集モードに入る必要があります。

ここに画像の説明を入力

残念ながら、編集モードは 99% ですぐにキャンセルされるようですが、非常にまれなケースでセルが編集モードのままになっています。独自の CellFactories と Editable-Cells を実装しようとしましたが、このユースケースでは常に同じ状況に陥ります。ここで私が間違っていることを知っている人はいますか?

ケースを示すために小さな例を作成しました。

/**
 * Small Example for EditableState not initialized Case.
 * 
 * @author mst
 */
public class TreeTableViewCreateExpandAndEditMain extends Application
{
  @Override
  public void start( final Stage primaryStage )
  {
    TreeItem<Item> root = new TreeItem<>( new Item( 1, "Root" ) );

    TreeItem<Item> item1 = new TreeItem<>( new Item( 2, "Item1" ) );
    TreeItem<Item> item11 = new TreeItem<>( new Item( 3, "Item11" ) );
    TreeItem<Item> item2 = new TreeItem<>( new Item( 4, "Item2" ) );
    TreeItem<Item> item3 = new TreeItem<>( new Item( 5, "Item3" ) );
    TreeItem<Item> item31 = new TreeItem<>( new Item( 6, "Item31" ) );

    root.getChildren().add( item1 );
    item1.getChildren().add( item11 );
    root.getChildren().add( item2 );
    root.getChildren().add( item3 );
    item3.getChildren().add( item31 );

    TreeTableColumn<Item, Integer> columnId = new TreeTableColumn<>( "ColumnId" );
    TreeTableColumn<Item, String> columnName = new TreeTableColumn<>( "ColumnName" );

    columnId.setCellValueFactory( new TreeItemPropertyValueFactory<Item, Integer>( "id" ) );
    columnName.setCellValueFactory( new TreeItemPropertyValueFactory<Item, String>( "name" ) );

    columnName.setCellFactory( TextFieldTreeTableCell.forTreeTableColumn() );

    columnName.setOnEditCommit( new EventHandler<CellEditEvent<Item, String>>()
    {
      @Override
      public void handle( final CellEditEvent<Item, String> event )
      {
        final Item item = event.getRowValue().getValue();
        System.out.println( "Change Item " + item + " from " + event.getOldValue() + " to new value "
            + event.getNewValue() );
        item.setName( event.getNewValue() );
      }
    } );

    final TreeTableView<Item> treeTableView = new TreeTableView<>( root );
    treeTableView.getColumns().add( columnName );
    treeTableView.getColumns().add( columnId );
    treeTableView.setShowRoot( false );
    treeTableView.setColumnResizePolicy( TreeTableView.CONSTRAINED_RESIZE_POLICY );

    treeTableView.setEditable( true );

    BorderPane layout = new BorderPane();

    Button button = new Button( "DoAction!" );
    button.setOnAction( new EventHandler<ActionEvent>()
    {
      @Override
      public void handle( final ActionEvent event )
      {
        /*
         * This Method should create a new node at the currently selected node, expand the selected node and start editing the new created node.
         */
        final TreeItem<Item> selectedItem = treeTableView.getSelectionModel().getSelectedItem();

        final TreeItem<Item> newItem =
            new TreeItem<>( new Item( 100, "newItemFor" + selectedItem.getValue().getName() ) );
        selectedItem.getChildren().add( newItem );

        selectedItem.expandedProperty().set( true );
        final int rowIndex = treeTableView.getRow( newItem );

        treeTableView.edit( rowIndex, columnName );//Does 99% not start or get canceled, why?
      }

    } );

    layout.setCenter( treeTableView );
    layout.setBottom( button );

    Scene scene = new Scene( layout, 400, 400 );
    primaryStage.setScene( scene );
    primaryStage.show();
  }

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

データクラス:

public class Item
{

  private final IntegerProperty id   = new SimpleIntegerProperty();
  private final StringProperty  name = new SimpleStringProperty();

  public Item( final int id, final String name )
  {
    this.id.set( id );
    this.name.set( name );
  }

  public int getId()
  {
    return id.get();
  }

  public String getName()
  {
    return name.get();
  }

  public void setId( final int id )
  {
    this.id.set( id );
  }

  public void setName( final String name )
  {
    this.name.set( name );
  }

  public IntegerProperty idProperty()
  {
    return id;
  }

  public StringProperty nameProperty()
  {
    return name;
  }
}
4

1 に答える 1

1

あなたのコードは、XPの1.8.0_20-eaで機能しました。

編集後にテーブルがフォーカスを失ったり、その他の奇妙な動作に問題が発生することがよくありました。場合によっては、必要なテーブルまたはセルに再度フォーカスする必要があります。いつの日かすべてが機能することを期待して、Java を更新し続けています。

于 2014-06-19T13:39:29.540 に答える