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 );
}
}
我正在使用 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 );
}
}