TreeItem javaFX 的不同行为

different behaviour for TreeItem javaFX

我正在使用 JavaFX 中的 treeview,我想知道如何区分节点的类型,我的意思是,我有下一个结构:

1.-Agent 
   1.1-Use Case Diagram
      1.1.1-UseCase1
      1.1.2-Description
      1.1.3-Activities Diagram
   1.2-UseCase2
      1.2.1-Description
      1.2.2-Activities Diagram
   1.3-Models
      1.3.1-AgentModel
      1.3.2-Services
      1.3.3-Comunication
2-Agent2
...

这只是树的一个例​​子,但问题是每个代理、用例图和模型都有不同的上下文菜单。我的困惑是:例如,UseCaseDiagram 和模型是同一节点的子节点,因此:

1- 我如何区分它们?
2- 有没有一种方法可以将字符串附加到每个节点以保存类型?
3- 如何使节点不可编辑?

我真的需要区分它们,因为后来每个叶子的动作都不同。 谢谢

您可以将 Object 存储在 TreeView 中,并通过 instance of 确定确切的类型。

1- How could I differentiate between them?

来自 instance of

2- Is there a way that I could attach a string to every node to save the type?

存储 Object 而不是 String

3- How can I make a node non-editable?

设置 treeView.setEditable( false ) 并从您的自定义 TreeCell.

中删除 startEdit()cancelEdit() 方法

参见下面的示例代码:

public class App extends Application
{

    private final List<Country> countries = Arrays.<Country>asList(
            new Country( "Country 1" ),
            new Country( "Country 2" ),
            new Country( "Country 3" ),
            new Country( "Country 4" ),
            new Country( "Country 5" ) );


    @Override
    public void start( Stage stage )
    {
        TreeItem<Object> rootNode = new TreeItem<>( new Country( "Dummy Country that will not be shown" ) );
        rootNode.setExpanded( true );

        for ( Country country : countries )
        {
            TreeItem<Object> item = new TreeItem<>( country );
            item.getChildren().add( new TreeItem<>( new City( country.getName() + " - City 1" ) ) );
            item.getChildren().add( new TreeItem<>( new City( country.getName() + " - City 2" ) ) );
            rootNode.getChildren().add( item );
        }

        TreeView<Object> treeView = new TreeView<>( rootNode );
        treeView.setEditable( false );
        treeView.setShowRoot( false );
        treeView.setCellFactory( new Callback<TreeView<Object>, TreeCell<Object>>()
        {
            @Override
            public TreeCell<Object> call( TreeView<Object> p )
            {
                return new MyTreeCell();
            }
        } );

        final Scene scene = new Scene( new VBox( treeView ), 400, 300 );
        stage.setScene( scene );
        stage.show();
    }


    private final class MyTreeCell extends TreeCell<Object>
    {

        private final ContextMenu addMenu = new ContextMenu();
        private final MenuItem addMenuItem = new MenuItem();


        public MyTreeCell()
        {
            addMenu.getItems().add( addMenuItem );
        }


        @Override
        public void updateItem( Object item, boolean empty )
        {
            super.updateItem( item, empty );

            if ( empty )
            {
                setText( null );
            }
            else
            {
                setText( getDisplayText( item ) );
                addMenuItem.setText( getContextMenuText( item ) );
                setContextMenu( addMenu );
            }
            setGraphic( null );
        }
    }


    private String getDisplayText( Object item )
    {
        if ( item instanceof Country )
        {
            return (( Country ) item).getName();
        }
        else if ( item instanceof City )
        {
            return (( City ) item).getCode();
        }
        else
        {
            return null;
        }
    }


    private String getContextMenuText( Object item )
    {
        if ( item instanceof Country )
        {
            return "This is a Country";
        }
        else if ( item instanceof City )
        {
            return "This is a City";
        }
        else
        {
            return null;
        }
    }


    public static class Country
    {

        private final SimpleStringProperty name;


        private Country( String name )
        {
            this.name = new SimpleStringProperty( name );
        }


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


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


    public static class City
    {

        private final SimpleStringProperty code;


        private City( String code )
        {
            this.code = new SimpleStringProperty( code );
        }


        public String getCode()
        {
            return code.get();
        }


        public void setCode( String newcode )
        {
            code.set( newcode );
        }
    }


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

}