[英]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.