2012-08-16 38 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(); 
    } 
}