2012-05-30 61 views
0

JMenuItem具有下面的構造:(來源:GrepCodeJMenuItem的構造不接受行動

public JMenuItem(Action a) { 
    this(); 
    setAction(a); 
} 

然而,當我的代碼有

import javax.swing.*; 
import java.awt.event.ActionEvent; 

public class ActionTest extends JApplet { 

    private final JFrame frame = new JFrame("Title"); 
    private final JMenuBar menuBar = new JMenuBar(); 
    private final JMenu fileMenu = new JMenu("File"); 
    protected Action someAction; 
    private JMenuItem someButton = new JMenuItem(someAction); 

    public ActionTest() {} 

    @Override 
    public final void init() { 
     frame.setJMenuBar(menuBar); 
     menuBar.add(fileMenu); 
     fileMenu.add(someButton); 
     someButton.setText("Button"); 
     someAction = new AbstractAction("Title") { 

      public void actionPerformed(ActionEvent event) { 
       //do stuff 
      } 
     }; 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     JApplet applet = new ActionTest(); 
     applet.init(); 
    } 
} 

,我按下JMenuItem,的actionPerformed()不是甚至被稱爲。

這是一個錯誤,還是我的方法完全錯誤?

經過更多的研究,我發現this是它最終歸結到的方法。它似乎實施了淺拷貝,其中should simply point to the same memory block that I gave it in the constructor

將文件菜單添加到菜單欄時應該發生同樣的事情。當添加文件菜單時,它引用內存塊。無論在內存塊內部是什麼顯示。然後,我添加菜單項並出現在JMenu中。

不知何故,當我與Action s或構造函數打交道時,它是不同的。有人可以解釋一下這個區別嗎?

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

3

從您發佈的內容看來,您在初始化JMenuItem時尚未定義Action。因此,因爲您傳遞null,因此沒有動作被觸發。

1

someButtonsomeAction之前被初始化,因此您將空值傳遞給JMenuItem。在創建someAction後初始化someButton,一切都會好起來的。

相關問題