Управление JFrame из JMenuBar
Я пытаюсь максимизировать JFrame изнутри JMenuBar, я не могу передать ссылку на фрейм. Можно ли получить ссылку на фрейм, в котором он используется?
я могу добраться до компонента верхнего уровня, но у него нет способа максимизировать и минимизировать кадр.
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 ответа
Вы можете получить окно, содержащее JPanel через
Window window = SwingUtilities.getWindowAncestor(popupMenu);
Затем вы можете либо увеличить его, используя window.setSize()
- или, поскольку вы, кажется, знаете, что это JFrame, приведите его к Frame и используйте setExtendedState
метод, который упоминает Кевин. Пример кода из Альманаха разработчиков Java для этого:
// 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);
}
Конечно, вы можете спрятать кадр в локальной переменной где-нибудь?
Что касается фактического максимизации фрейма, как только вы его овладеете, 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. Будьте предупреждены. Я не проверял приведенный выше код, но вы должны понять.
Класс, который создает фрейм и строку меню, также может выступать в качестве ActionListener для элемента меню, поскольку он имеет доступ как к фрейму, так и к строке меню.