6

TreeTableView. _

ほとんどのユーザーは、現在の動作に一貫性がないと不満を漏らしていました。セルをクリックすると、ツリー項目が既に折りたたまれている/展開されている場合があり、ダブルクリックが必要な場合があります。これを編集モードの初期化と組み合わせると、面倒な場合があります。ですから、クリック動作を自分で処理したいと思います。

TreeTableCellBehavior動作をクラスに絞り込むことができました。

@Override
protected void handleClicks(MouseButton button, int clickCount, boolean isAlreadySelected) {
        // handle editing, which only occurs with the primary mouse button
        TreeItem<S> treeItem = getControl().getTreeTableRow().getTreeItem();
        if (button == MouseButton.PRIMARY) {
            if (clickCount == 1 && isAlreadySelected) {
                edit(getControl());
            } else if (clickCount == 1) {
                // cancel editing
                edit(null);
            } else if (clickCount == 2 && treeItem.isLeaf()) {
                // attempt to edit
                edit(getControl());
            } else if (clickCount % 2 == 0) {
                // try to expand/collapse branch tree item
                treeItem.setExpanded(! treeItem.isExpanded());
            }
        }
}

残念ながら、この種の動作を変更するためのフックや何かを作成する可能性は見当たりません。ビヘイビア クラスとスキンは内部クラスであるため、独自のビヘイビアを作成する可能性はまったくありません。のクリック動作を変更するために、TreeTableViewのどの時点でフックする必要がありますTreeTableViewか?


編集:コードを投稿してからコードが変更されたようです。だから私はこの質問を更新しました。パブリック API アクセスの一部も見つけましたが、クリック動作を上書きする方法がわかりませんでした。誰でも手がかりを教えてもらえますか?


Edit2: ブライアンのコメントのため、小さな例を作成し、それをユーザー エクスペリエンス ドキュメントと比較しました。説明どおりに機能しました(=>「「ターナー」アイコンをクリックするか、ノード名をダブルクリックすることでノードを開くことができます(編集が有効になっている場合、ダブルクリックすると編集モードになることに注意してください)」)、変更するまでTreeTableView の TreeColumn を別の列に移動し、次に最初の列に移動します (これが私のプロジェクトとコード例の唯一の違いでした)。列を変更すると、奇妙な動作が発生します。ターナーは単一のマウスクリックに反応しなくなり、時には (ほとんど発生しません) 選択が正しく設定されず、代わりにノードが展開/折りたたまれます。

問題を示すために小さな例を追加しました。

public class TreeTableViewTurnerIssueExample extends Application
{
  @Override
  public void start( final Stage primaryStage )
  {
    TreeItem<Item> root = new TreeItem<>( new Item( "Root", "Root" ) );

    TreeItem<Item> item1 = new TreeItem<>( new Item( "1", "Item1" ) );
    TreeItem<Item> item2 = new TreeItem<>( new Item( "2", "Item2" ) );
    TreeItem<Item> item3 = new TreeItem<>( new Item( "3", "Item3" ) );
    TreeItem<Item> item4 = new TreeItem<>( new Item( "4", "Item4" ) );
    TreeItem<Item> item41 = new TreeItem<>( new Item( "4.1", "Item41" ) );
    TreeItem<Item> item42 = new TreeItem<>( new Item( "4.2", "Item42" ) );
    TreeItem<Item> item43 = new TreeItem<>( new Item( "4.3", "Item43" ) );
    TreeItem<Item> item5 = new TreeItem<>( new Item( "5", "Item5" ) );
    TreeItem<Item> item52 = new TreeItem<>( new Item( "5.1", "Item51" ) );

    root.getChildren().add( item1 );
    item1.getChildren().add( item2 );
    root.getChildren().add( item3 );
    item3.getChildren().add( item4 );
    item4.getChildren().add( item41 );
    item4.getChildren().add( item42 );
    item4.getChildren().add( item43 );
    root.getChildren().add( item5 );
    item5.getChildren().add( item52 );

    TreeTableColumn<Item, String> nameColumn = new TreeTableColumn<>( "Name" );
    TreeTableColumn<Item, String> valueColumn = new TreeTableColumn<>( "Value" );

    nameColumn.setCellValueFactory( new TreeItemPropertyValueFactory<Item, String>( "name" ) );
    valueColumn.setCellValueFactory( new TreeItemPropertyValueFactory<Item, String>( "value" ) );

    final TreeTableView<Item> treeTableView = new TreeTableView<>( root );
    treeTableView.getColumns().add( nameColumn );
    treeTableView.getColumns().add( valueColumn );

    treeTableView.setTreeColumn( valueColumn );//<- changing this to the first column, the clickbehavior is fine.

    treeTableView.setShowRoot( false );
    treeTableView.setColumnResizePolicy( TreeTableView.CONSTRAINED_RESIZE_POLICY );

    BorderPane layout = new BorderPane();
    layout.setCenter( treeTableView );
    Scene scene = new Scene( layout, 400, 400 );
    scene.getStylesheets().add( getClass().getResource( "application.css" ).toExternalForm() );
    primaryStage.setScene( scene );
    primaryStage.show();
  }

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


public class Item
{
  private final StringProperty name  = new SimpleStringProperty();
  private final StringProperty value = new SimpleStringProperty();

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

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

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

  public StringProperty nameProperty()
  {
    return name;
  }

  public String getValue()
  {
    return value.get();
  }

  public void setValue( final String value )
  {
    this.value.set( value );
  }

  public StringProperty valueProperty()
  {
    return value;
  }
}

また、この例で私が犯した間違いを誰かが指摘しない限り、これは本当にバグだと思うので、 Jira Ticketも作成しました。

4

2 に答える 2

0

ここで確認できるように、これは 8u60 で修正された公式のバグのようです: Jira

それでも TreeTableView のクリック動作を変更したい場合は、おそらく EventFilter を使用してイベントを実装に委任し、イベントを消費する必要があります。幸いなことに、デフォルトの動作は修正で再び問題ないため、それ以上掘り下げるのをやめました。

于 2015-02-23T20:41:05.293 に答える