簡體   English   中英

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
...

那只是樹的樣子的一個例子,但是事實是每個代理,用例圖和模型都有不同的ContextMenu。 我的困惑是:例如UseCaseDiagram和模型是同一節點的子代,因此:

1-我如何區分它們?
2-是否可以將字符串附加到每個節點以保存類型?
3-如何使節點不可編輯?

我確實需要區分它們,因為以后每個葉子的動作都不同。 謝謝。

您可以將Object s存儲在TreeView中,並根據的instance of確定確切的類型。

1-我如何區分它們?

根據的instance of

2-是否可以將字符串附加到每個節點以保存類型?

存儲Object而不是String

3-如何使節點不可編輯?

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM