当前位置: 首页 > 知识库问答 >
问题:

在JavaFX中,我可以在TreeItem而不是TreeView添加上下文菜单吗

刘英彦
2023-03-14

http://fxexperience.com/2012/05/listview-custom-cell-factors-and-context-menus/

对我来说很有效。但我的情况是,我不想将此上下文菜单应用于子节点。在开始时,只有单个TreeItems,在后期,这些TreeItems有子项,因此尝试检查isLeaf()方法没有意义,因为在开始时,TreeItems处于叶级别,但稍后它们变成了父项。

我怎么才能做到这一点。

---Gmail  
---Yahoo  
---Rediff  

在我连接这些提供者之后,他们就有了这样的结构:-

Gmail
   |____Inbox
   |____Sent
Yahoo
   |___Inbox
   |___Sent
   |___Drafts
Rediff
   |___Inbox

现在我想要上下文菜单只在Gmail,Yahoo和rediff上,而不是在收件箱或发送的项目。

我知道setContextmenu()方法,但它可用于TreeView而不是TreeItem。

共有1个答案

钱和平
2023-03-14

我将使您的树项成为TreeItem的后代类,如Public class ProviderTreeItem extends TreeItem,以及具有BoxTreeItem这样的框的不同后代。

这样,您就不会测试isLeaf了,但可以测试TreeItem类型。

if (thisTreeItem.getClass() == ProviderTreeItem.class)
   thisTreeItem.setContextmenu(providerContextMenu)
else thisTreeItem.setContextmenu(boxContextMenu)

只从子类TreeItem中获取上下文菜单会更容易。

您实际上并不需要对TreeItem进行子类化,您可以只使用名称或类似userData对象的东西来区分节点类型。如果您进行子类,那么您可以向不同的节点类型添加不同的方法和属性。

例如,盒子需要一个数据结构来保存电子邮件,但提供者不需要这个。提供商需要一个网址和密码等,但盒子不需要这些。

下面是更新的示例。

import javafx.application.Application;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;

public class TVexample extends Application {
public abstract class AbstractTreeItem extends TreeItem{
    public abstract ContextMenu getMenu();
}

public class ProviderTreeItem extends AbstractTreeItem{
    // make class vars here like psswd
    public ProviderTreeItem(String name) {
        this.setValue(name);
    }

    @Override
    public ContextMenu getMenu(){
        MenuItem addInbox = new MenuItem("add inbox");
        addInbox.setOnAction(new EventHandler() {
            public void handle(Event t) {
                BoxTreeItem newBox = new BoxTreeItem("inbox");
                    getChildren().add(newBox);
            }
        });
        return new ContextMenu(addInbox);
    }
}

public class BoxTreeItem extends AbstractTreeItem{
    //private List<String> emails = new LinkedList<>();
    public BoxTreeItem(String name) {
        this.setValue(name);
    }

    @Override
    public ContextMenu getMenu() {
        return new ContextMenu(new MenuItem("test"));
    }
}

private final class TreeCellImpl extends TreeCell<String> {

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

        if (empty) {
            setText(null);
            setGraphic(null);
        } else {
            setText(getItem() == null ? "" : getItem().toString());
            setGraphic(getTreeItem().getGraphic());
            setContextMenu(((AbstractTreeItem) getTreeItem()).getMenu());
        }
    }
}

@Override
public void start(Stage primaryStage) {
    StackPane sceneRoot = new StackPane();
    TreeItem treeRoot = new TreeItem();
    treeRoot.setExpanded(true);
    ProviderTreeItem gm = new ProviderTreeItem("gmail");
    ProviderTreeItem yh = new ProviderTreeItem("yahoo");
    treeRoot.getChildren().addAll(gm,yh);
    TreeView<String> treeView = new TreeView<String>(treeRoot);
    treeView.setShowRoot(false);
    treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
        @Override
        public TreeCell<String> call(TreeView<String> p) {
            return new TreeCellImpl();
        }
    });
    sceneRoot.getChildren().add(treeView);
    Scene scene = new Scene(sceneRoot, 300, 500);


    primaryStage.setScene(scene);
    primaryStage.show();
}
 类似资料:
  • 必须添加。下面是我的代码:

  • 我正在尝试JavaFX,但仍然有很多可能是愚蠢的初学者问题。 我今天的问题如下: 我在Scene builder and Controller中创建了一个流程窗格,我想在其中添加一个右键单击选项,打开一个关联菜单。 通过场景生成器,我添加了OnContextMenuRequest函数并在控制器中定义了它。 为了检查,我在函数中添加了一个打印命令和一个对话框,效果很好。 然而,上下文菜单不起作用。。

  • 因此,我仍然有点了解JavaFX,我能够禁止在文本框中输入文本,但我不知道如何防止右键单击时出现上下文菜单。有人知道如何防止右键单击时弹出默认上下文菜单吗?`

  • 我想在tableview中添加一个上下文菜单,更具体地说,我想在右键单击时在表行上显示上下文菜单。 我试着用这个代码 上面的代码在JavaFX2.0中工作正常,右键单击时我得到了一个上下文菜单,当我用JavaFX2.1上下文菜单运行我的代码时,它是如何工作的。 我尝试使用showingProperty()方法获取上下文菜单的显示属性,它在JavaFX2.1中返回false,在JavaFX2.0中返

  • 问题内容: 如何在SWT树中的树项上添加右键单击弹出菜单。每个树项目都应在其上启用右键 问题答案: 只需使用。 你去了:

  • 我对上下文菜单有问题。在本主题之后,我发现在尝试加载上下文菜单insight JavaFX任务时有一个限制。我测试了实现platform.runlater(),但没有成功。 其他可能的解决方案是: