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。
我将使您的树项成为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(),但没有成功。 其他可能的解决方案是: