gpt4 book ai didi

java - 在 Java 中从 JMenuBarbar 访问 JMenuItems?

转载 作者:行者123 更新时间:2023-12-02 05:45:34 24 4
gpt4 key购买 nike

我现在正在专门在菜单栏上使用一些 java 代码,但从 JMenuBar 访问菜单项时遇到问题。菜单栏有一个项目 JMenu,并且 JMenu 中有一个 JMenuItem,我正在尝试访问 JMenuItem,通过名称属性区分项目(这只是我发现区分它们的一种方法,如果有人知道更好的方法)执行此操作的方法请告诉我。)我在应用程序中切换选项卡的 on-change 事件上执行此操作,所以这是我的代码。

public void stateChanged(ChangeEvent e) {
if(tabbedPane.getSelectedIndex() != 0){
for(int i = 0; i < menuItems.length; i++){
MenuElement[] subItems = menuItems[i].getSubElements();
for(int j = 0; j < subItems.length; j++){
System.out.println(subItems[j].getComponent().getName());
}
}
}
}

menuItems 来自 JMenuBar 上的 getSubElements() 调用,我可以获取“File”元素,但是当我执行第二个循环以查找“File”下面的项目时,大多数属性(包括名称)都为空,甚至虽然我已经设置了名称。

在调试器中,我可以看到在 subItems[j].getComponent() 上进行监视时设置的名称,在标记为“组件”的部分下,然后在“元素数据[0]”下。

我确信有一种方法可以获取此属性,但我一直无法弄清楚如何实现。有谁知道如何访问它或知道区分 MenuItems 和 JMenuBar 的更好方法吗?

谢谢。

编辑 - 我想通了。如果有人好奇,JMenuItem 嵌套在 JMenu 的另一层中。此代码打印出我试图查找的名称。

public void stateChanged(ChangeEvent e) {
if(tabbedPane.getSelectedIndex() != 0){
for(int i = 0; i < menuItems.length; i++){
MenuElement[] subItems = menuItems[i].getSubElements();
for(int j = 0; j < subItems.length; j++){
MenuElement[] subSubItems = subItems[j].getSubElements();
for(int k = 0; k < subSubItems.length; k++){
System.out.println(subSubItems[k].getComponent().getName());
}
}
}
}
}

话虽这么说,我不知道为什么会这样。有人知道吗?以下是构建 JMenuBar 的代码:

public void buildMenu(){
menuBar = frame.getJMenuBar();
menu = new JMenu("File");
menu.setName("file");
menuBar.add(menu);
importTiles = buildImportTilesMenuItem();
menu.add(importTiles);
}

public JMenuItem buildImportTilesMenuItem(){
importTiles = new JMenuItem("Import Tiles");
importTiles.setName("importTiles");
importTiles.addActionListener(this);
return importTiles;
}

最佳答案

您必须再次向下钻取的原因是每个 JMenu 子项都是在 JpopupMenu 容器中创建的。因此,文件菜单具有 JPopupMenu 容器,该容器具有您的 importTiles JMenuItem。所以代码可以这样改:

MenuElement[] topLevelElements = frameApp.getJMenuBar().getSubElements();
//Get top level elements--> FileMenu etc
for(MenuElement menuElement: topLevelElements)
{
MenuElement[] subElements = menuElement.getSubElements();
//get the child elements which are of type JPopupMenu
for(MenuElement subElement:subElements)
{
//This is the popuMenu which contains child elements
System.out.println(subElement.toString());
if(subElement instanceof JPopupMenu)
{
//show child elements
for(MenuElement childMenuItem:subElement.getSubElements())
{
//New and Save here ...
System.out.println("ChildMenu Name=>" + childMenuItem.getComponent().getName());
}
}
else
{
//display names directly
}
}
}

关于java - 在 Java 中从 JMenuBarbar 访问 JMenuItems?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24099681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com