Javafx 单击按钮选择树节点

Javafx 单击按钮选择树节点,javafx,javafx-2,javafx-8,Javafx,Javafx 2,Javafx 8,我想开发一个简单的示例,在这个示例中,我可以使用按钮选择TreeView节点(在某些情况下,单击图像等)。我创建了这个简单的示例: package click.treenodeclicktest; import javafx.application.Application; import static javafx.application.Application.launch; import javafx.geometry.Insets; import javafx.scene.Scene;

我想开发一个简单的示例,在这个示例中,我可以使用按钮选择TreeView节点(在某些情况下,单击图像等)。我创建了这个简单的示例:

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);
    }

}
package click.treenodeclicktest;
导入javafx.application.application;
导入静态javafx.application.application.launch;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.TreeItem;
导入javafx.scene.control.TreeView;
导入javafx.scene.layout.HBox;
导入javafx.stage.stage;
公共类MainApp扩展应用程序
{
@凌驾
public void start(Stage)引发异常
{
HBox hb=新的HBox(initTree(),initPanel());
场景=新场景(hb,800800);
stage.setTitle(“JavaFX和Maven”);
舞台场景;
stage.show();
}
公共树视图initTree()
{
TreeItem treeItemRoot=新的TreeItem(“根”);
TreeItem nodeItemA=新TreeItem(“项目A”);
TreeItem nodeItemB=新的TreeItem(“B项”);
TreeItem nodeItemC=新的TreeItem(“C项”);
treeItemRoot.getChildren().addAll(nodeItemA、nodeItemB、nodeItemC);
TreeItem nodeItemA1=新的TreeItem(“项目A1”);
TreeItem nodeItemA2=新的TreeItem(“项目A2”);
TreeItem nodeItemA3=新的TreeItem(“A3项”);
nodeItemA.getChildren().addAll(nodeItemA1、nodeItemA2、nodeItemA3);
TreeView TreeView=新的TreeView(treeItemRoot);
返回树视图;
}
公共HBox initPanel()
{
按钮bt1=新按钮(“A1项”);
按钮bt2=新按钮(“项目A2”);
按钮bt3=新按钮(“A3项”);
HBox hb=新的HBox(bt1、bt2、bt3);
hb.setPadding(新插图(80,80,80,80));
返回hb;
}
公共静态void main(字符串[]args)
{
发射(args);
}
}

问题是当我点击一个按钮时如何选择树节点。例如,当我单击按钮
项目A1
时,我想选择tree idem
项目A1

您的按钮需要对treeView的引用和对要选择的对象的引用。因此,你必须设法让他们可以使用它。然后你可以打电话:

bt1.setOnAction( new EventHandler<ActionEvent>()
{
  @Override
  public void handle( final ActionEvent event )
  {
    treeView.getSelectionModel().select( nodeItemA1 );
  }
} );
bt1.setOnAction(新的EventHandler()
{
@凌驾
公共无效句柄(最终操作事件)
{
treeView.getSelectionModel().select(nodeItemA1);
}
} );
-编辑-

我接受了您的代码并对其进行了修改,以满足您的请求,但请记住,在您的类中将所有数据对象定义为私有成员可能并不可取。这只是为了说明如何选择节点:

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 );
  }
}
public类MainApp扩展应用程序
{
私人树景树景;
私有treeitemtreeitemroot;
私有树节点图;
私有TreeItem nodeItemB;
私有树节点;
私有树节点1;
私有树节点数m2;
私有树节点3;
@凌驾
public void start(final Stage)引发异常
{
HBox hb=新的HBox(initTree(),initPanel());
场景=新场景(hb,800800);
stage.setTitle(“JavaFX和Maven”);
舞台场景;
stage.show();
}
公共树视图initTree()
{
treeItemRoot=新的TreeItem(“根”);
nodeItemA=新树项(“A项”);
nodeItemB=新树项(“B项”);
nodeItemC=新树项(“C项”);
treeItemRoot.getChildren().addAll(nodeItemA、nodeItemB、nodeItemC);
nodeItemA1=新树项目(“项目A1”);
nodeItemA2=新树项目(“项目A2”);
nodeItemA3=新树项目(“项目A3”);
nodeItemA.getChildren().addAll(nodeItemA1、nodeItemA2、nodeItemA3);
treeView=新的treeView(treeItemRoot);
返回树视图;
}
公共HBox initPanel()
{
按钮bt1=新按钮(“A1项”);
bt1.setOnAction(新的EventHandler()
{
@凌驾
公共无效句柄(最终操作事件)
{
treeView.getSelectionModel().select(nodeItemA1);
}
} );
按钮bt2=新按钮(“项目A2”);
bt2.setOnAction(新的EventHandler()
{
@凌驾
公共无效句柄(最终操作事件)
{
treeView.getSelectionModel().select(nodeItemA2);
}
} );
按钮bt3=新按钮(“A3项”);
bt3.setOnAction(新的EventHandler()
{
@凌驾
公共无效句柄(最终操作事件)
{
treeView.getSelectionModel().select(nodeItemA3);
}
} );
HBox hb=新的HBox(bt1、bt2、bt3);
hb.setPadding(新插图(80,80,80,80));
返回hb;
}
公共静态void main(最终字符串[]args)
{
发射(args);
}
}

使用您的代码更新了答案,创建了一个工作示例。我可以尝试从列表中选择对象。有没有办法把树上的项目列为一个列表?我建议为它创建一个新的问题。在那里,你可以更详细地解释你试图实现的目标。