我正在使用一些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());
}
}
}
}
菜单项来自JMenuBar上的getSubElements()调用,我可以获得'File'元素,但是当我做第二个循环以找到'File'下面的项目时,包括名称在内的大多数属性都是空的,即使我已经设置了名称。
在调试器中,我可以看到我在监视子项[j]. getcomponent()时设置的名称,在标记为'component'的部分下,然后在'element data[0]'下。
我确信有一种方法可以得到这个属性,但我还没能弄清楚如何。有人知道如何访问这个或者知道更好的方法来区分菜单项和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
}
}
}