0

I want to develop simple example in which I can select TreeView Nodes with Buttons(in some cases clicking on image and etc). I created this simple sample:

package click.treenodeclicktest;

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class MainApp extends Application
{
    @Override
    public void start(Stage stage) throws Exception
    {
        HBox hb = new HBox(initTree(), initPanel());

        Scene scene = new Scene(hb, 800, 800);

        stage.setTitle("JavaFX and Maven");
        stage.setScene(scene);
        stage.show();
    }

    public TreeView<String> initTree()
    {
        TreeItem<String> treeItemRoot = new TreeItem<>("Root");

        TreeItem<String> nodeItemA = new TreeItem<>("Item A");
        TreeItem<String> nodeItemB = new TreeItem<>("Item B");
        TreeItem<String> nodeItemC = new TreeItem<>("Item C");
        treeItemRoot.getChildren().addAll(nodeItemA, nodeItemB, nodeItemC);

        TreeItem<String> nodeItemA1 = new TreeItem<>("Item A1");
        TreeItem<String> nodeItemA2 = new TreeItem<>("Item A2");
        TreeItem<String> nodeItemA3 = new TreeItem<>("Item A3");
        nodeItemA.getChildren().addAll(nodeItemA1, nodeItemA2, nodeItemA3);

        TreeView<String> treeView = new TreeView<>(treeItemRoot);

        return treeView;
    }

    public HBox initPanel()
    {
        Button bt1 = new Button("Item A1");
        Button bt2 = new Button("Item A2");
        Button bt3 = new Button("Item A3");

        HBox hb = new HBox(bt1, bt2, bt3);
        hb.setPadding(new Insets(80, 80, 80, 80));

        return hb;
    }

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

}

The question is how I can select tree Node when I click on a button. For example when I click on a button Item A1 I want to select tree idem Item A1.

1 Answer 1

1

Your Button needs a reference to the treeView and a reference to the object you want to select. So you somehow have to make them available to it. Then you can just call:

bt1.setOnAction( new EventHandler<ActionEvent>()
{
  @Override
  public void handle( final ActionEvent event )
  {
    treeView.getSelectionModel().select( nodeItemA1 );
  }
} );

-EDIT-

I took your code and modified it, to fulfill your request, but keep in mind, that it is probably not desirable to have all DataObjects defined as private members in your class. Its just to illustrate on how it would work to select a node:

public class MainApp extends Application
{
  private TreeView<String> treeView;

  private TreeItem<String> treeItemRoot;
  private TreeItem<String> nodeItemA;
  private TreeItem<String> nodeItemB;
  private TreeItem<String> nodeItemC;
  private TreeItem<String> nodeItemA1;
  private TreeItem<String> nodeItemA2;
  private TreeItem<String> nodeItemA3;

  @Override
  public void start( final Stage stage ) throws Exception
  {
    HBox hb = new HBox( initTree(), initPanel() );

    Scene scene = new Scene( hb, 800, 800 );

    stage.setTitle( "JavaFX and Maven" );
    stage.setScene( scene );
    stage.show();
  }

  public TreeView<String> initTree()
  {
    treeItemRoot = new TreeItem<>( "Root" );

    nodeItemA = new TreeItem<>( "Item A" );
    nodeItemB = new TreeItem<>( "Item B" );
    nodeItemC = new TreeItem<>( "Item C" );
    treeItemRoot.getChildren().addAll( nodeItemA, nodeItemB, nodeItemC );

    nodeItemA1 = new TreeItem<>( "Item A1" );
    nodeItemA2 = new TreeItem<>( "Item A2" );
    nodeItemA3 = new TreeItem<>( "Item A3" );
    nodeItemA.getChildren().addAll( nodeItemA1, nodeItemA2, nodeItemA3 );

    treeView = new TreeView<>( treeItemRoot );

    return treeView;
  }

  public HBox initPanel()
  {
    Button bt1 = new Button( "Item A1" );
    bt1.setOnAction( new EventHandler<ActionEvent>()
    {
      @Override
      public void handle( final ActionEvent event )
      {
        treeView.getSelectionModel().select( nodeItemA1 );
      }
    } );

    Button bt2 = new Button( "Item A2" );
    bt2.setOnAction( new EventHandler<ActionEvent>()
    {
      @Override
      public void handle( final ActionEvent event )
      {
        treeView.getSelectionModel().select( nodeItemA2 );
      }
    } );

    Button bt3 = new Button( "Item A3" );
    bt3.setOnAction( new EventHandler<ActionEvent>()
    {
      @Override
      public void handle( final ActionEvent event )
      {
        treeView.getSelectionModel().select( nodeItemA3 );
      }
    } );

    HBox hb = new HBox( bt1, bt2, bt3 );
    hb.setPadding( new Insets( 80, 80, 80, 80 ) );

    return hb;
  }

  public static void main( final String[] args )
  {
    launch( args );
  }
}
Sign up to request clarification or add additional context in comments.

3 Comments

updated the answer using your code to create a working example.
I can try to select objects from a list. Is there a way to get the tree items as a list?
I would suggest creating a new question for it. There you can explain more in detail, what you are trying to achieve.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.