我正在尝试从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;
}
答案 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,因为它可以访问框架和菜单栏。