2012-08-16 94 views
0

如何获取JMenu的名称以保持单击的JMenuItem?我试着这样做:如何在JMenuItem被点击时获取JMenu的名称

public void actionPerformed(ActionEvent arg0) { 
    JMenu menuthing = (JMenu)(arg0.getSource()); 
    String menuString = menuthing.getText(); 
    JMenuItem source = (JMenuItem)(arg0.getSource()); 
    String colorType = source.getText(); 

但它给我这个错误:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JMenuItem cannot be cast to javax.swing.JMenu 

那么,有没有办法强制转换为JMenu的,或者一些其他的方式来确定的名字吗? 谢谢。

+1

*“怎么会一赠名JMenu拥有一个单击的JMenuItem?“*一个更好的问题将是这个句子,而是为'为什么'交换'How'。 – 2012-08-16 02:22:45

+0

+1 @AndrewThompson在这里。从你发布的代码判断,我无法找到一个理由,为什么你真的需要获得JMenu。你想详细说明吗? – Sujay 2012-08-16 02:39:06

+0

我正在写一个程序,其中一组盒子可以有一个'活着'或'死'的状态(对于那些不熟悉康威生命游戏的人,我想要一个菜单​​来设置活着位置的颜色,以及一个设置死点​​位置颜色的菜单,这就是为什么我需要菜单的名称来区分Alive菜单和Dead菜单 – Jeeter 2012-08-16 02:53:55

回答

3

我建议你在JMenu上加一个MenuListener,并在public void menuSelected(javax.swing.event.MenuEvent evt)中加入你的代码。

由于这是MenuEvent,该getSource()方法将返回JMenu对象

如果你想从你的ActionEvent得到它,尝试这样的事情:

JPopupMenu menu = (JPopupMenu) ((JMenuItem) evt.getSource()).getParent(); 
JMenu actMenu = menu.getInvoker(); 
+0

这样得到源代码,你会说evt.getSource()? – Jeeter 2012-08-16 02:15:34

+0

@Jeeter:yip!那是你需要做的:) – Sujay 2012-08-16 02:16:18

+0

非常感谢你的回答:) – Jeeter 2012-08-16 02:16:43

2

强制转换为JMenu的而不是只是投射到JMenuItem。然后从中获取JMenu。

JMenuItem jmi = (JMenuItem) arg0.getSource(); 
JPopupMenu jpm = (JPopupMenu) jmi.getParent(); 
JMenu menu = (JMenu) jpm.getInvoker(); 
+0

Yip!我同意(为此+1)。但是,如果你真的必须从'ActionEvent'中获取它。但正如@andrewthomson指出的那样,我仍然不确定OP为什么要首先获得'JMenu'的名字。 – Sujay 2012-08-16 02:36:41

0

假设JMenuItems是JMenu的的孩子,你仍然可以用动作事件做到这一点:

JPopupMenupopup = new JPopupMenu(); 
popup.setName("popup"); 

....

@Override 
public void actionPerformed(ActionEvent e) { 
    JMenuItem source = (JMenuItem)(e.getSource()); 
    try{ 
     JMenuItem menuItem = (JMenuItem) e.getSource(); 
     JPopupMenu popupMenu = (JPopupMenu) menuItem.getParent(); 
     Component invoker = popupMenu.getInvoker();  
     JPopupMenu popup = (JPopupMenu) invoker.getParent(); 
     System.out.println("NAME OF JMENU: "+popup.getName()); 

     //If you need the selection of cell(s) 
     JTable table = (JTable)popup.getInvoker(); 
     int row = table.getSelectedRow(); 
     int col = table.getSelectedColumn(); 
     System.out.println("Selected cell: "+row+"-"+col); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
}