从JMenuBar控制JFrame

时间:2009-05-12 04:11:00

标签: java swing jframe

我正在尝试从JMenuBar中最大化JFrame,我无法传递对该帧的引用。是否可以获得对其使用的帧的引用?

我可以进入顶级组件,但它没有办法最大化和最小化帧。

    public Container getApplicationFrame(ActionEvent event){
         JMenuItem menuItem = (JMenuItem) event.getSource();  
         JPopupMenu popupMenu = (JPopupMenu) menuItem.getParent();  
         Component invoker = popupMenu.getInvoker(); 
         JComponent invokerAsJComponent = (JComponent) invoker;  
         Container topLevel = invokerAsJComponent.getTopLevelAncestor();  
         return topLevel;
    }

3 个答案:

答案 0 :(得分:5)

您可以通过

获取包含JPanel的窗口
Window window = SwingUtilities.getWindowAncestor(popupMenu);

然后,您可以使用window.setSize()最大化它 - 或者,因为您似乎知道它是一个JFrame,将其强制转换为Frame并使用Kevin提到的setExtendedState方法。来自Java Developers'Almanac的Example code

// This method minimizes a frame; the iconified bit is not affected
public void maximize(Frame frame) {
    int state = frame.getExtendedState();

    // Set the maximized bits
    state |= Frame.MAXIMIZED_BOTH;

    // Maximize the frame
    frame.setExtendedState(state);
}

答案 1 :(得分:1)

当然,你可以在某个地方的变量中存储有问题的帧吗?

至于实际上最大化Frame一旦你得到它,Frame.setExtendedState(MAXIMIZED_BOTH)可能就是你想要的。 Javadoc

虽然不尽如人意,但在现有代码上快速接地:

public Frame getApplicationFrame(ActionEvent event){
         if(event.getSource() == null) return null;

         Window topLevel = SwingUtilities.getWindowAncestor(event.getSource());

         if(!(topLevel instanceof Frame)) return null;

         return (Frame)topLevel;
}

...
//Somewhere in your code
Frame appFrame = getApplicationFrame(myEvent);
appFrame.setExtendedState(appFrame.getExtendedState() | Frame.MAXIMIZED_BOTH);
...

最低Java版本1.4.2。转发我没有测试过上面的代码,但你应该明白这个想法。

答案 2 :(得分:0)

创建框架和菜单栏的类也可以作为菜单项的ActionListener,因为它可以访问框架和菜单栏。