好的,所以我正在基于JGraph示例开发Eclipse插件。问题是我无法真正使用“保存”方法,以下是程序的工作原理:
-我有一个带有init()方法的DiagramEditor类,在其中创建一个GraphEditor对象并调用该对象的createFrame()方法。
-GraphEditor扩展了BasicGraphEditor(扩展了JPanel),createFrame()方法返回JFrame并有一行“ frame.setJMenuBar(menuBar)”
-“ menuBar”是一个对象变量,在BasicGraphEditor中初始化。
直到这里一切都很棒,问题出在应该保存文件的动作监听器上。要获取图形,我需要获取GraphEditor组件,所以我执行了Component component =(Component)e.getSource()whitch是传递给该动作侦听器的ActionEvent,在那个阶段是JMenuItem“保存”,然后得到父级是JPopupMenu,那么我想获取JPopupMenu的父级,它应该是GraphEdiotor,但是我得到的是null。知道为什么吗?
这是一些源代码:
DiagramEditor.java:
@Override
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
setSite(site);
setInput(input);
this.diagram = ((DiagramEditorInput)input).getDiagram();
setPartName(this.diagram.getName());
gEditor = new GraphEditor();
gEditor.createFrame().setVisible(true);
}
BasicGraphEditor.java:
public JFrame createFrame()
{
JFrame frame = new JFrame();
frame.getContentPane().add(this);
frame.setJMenuBar(menuBar);
//frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(870, 640);
return frame;
}
In the constructor:
menuBar = new JMenuBar();
menu = new JMenu("File");
menu.setMnemonic(KeyEvent.VK_F);
menuBar.add(menu);
JMenuItem openMenuItem = new JMenuItem("Open", KeyEvent.VK_O);
// ADD FILE OPENING
//openMenuItem.addActionListener(menuListener);
menu.add(openMenuItem);
JMenuItem saveMenuItem = new JMenuItem("Save", new ImageIcon("/images/save.gif"));
saveMenuItem.setMnemonic(KeyEvent.VK_S);
saveMenuItem.addActionListener( new SaveAction(false) );
menu.add(saveMenuItem);
// menu.add(new SaveAction(false));
JMenuItem saveMenuItemAs = new JMenuItem("SaveAs", new ImageIcon("/images/saveas.gif"));
//saveMenuItemAs.setMnemonic(KeyEvent.VK_S);
saveMenuItemAs.addActionListener( new SaveAction(true) );
menu.add(saveMenuItemAs);
//menu.add(new SaveAction(true));
JMenuItem closeMenuItem = new JMenuItem("Close", KeyEvent.VK_C);
closeMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
);
menu.add(closeMenuItem);
最佳答案
菜单附加在框架上,而不是您的课程。最好的选择可能是确保您的SaveAction可以直接看到它的需求。构造SaveAction时,它可以具有对GraphEditor的隐式或直接引用。
如果在GraphEdtior类的内部定义SaveAction类,如下所示:
class SaveAction extends AbstractAction
{
public void actionPerformed(ActionEvent e) {
GraphEditor myGE = GraphEditor.this;
.. do whatever
}
}
您将看到SaveAction已经可以访问GraphEditor(隐式引用)。
如果您的SaveAction类定义为
static
,或者在其他类或文件中定义,则在构造它并使其包含引用时,只需为它提供GraphEditor即可:class SaveAction extends AbstractAction
{
private GraphEditor graphEditor;
private boolean myBoolean;
public SaveAction(GraphEditor graphEditor, boolean myBoolean)
{
this.myBoolean = myBoolean;
this.graphEditor = graphEditor;
}
public void actionPerformed(ActionEvent e) {
this.graphEditor....
.. do whatever
}
}
在这两种情况下,saveAction中的actionPerformed()都可以访问GraphEditor以执行所需的操作。