Управление 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;
}
Решение
Вы можете получить окно, содержащее 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_BOT), вероятно, это то, что вы хотите. 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 для пункта меню, поскольку он имеет доступ как к фрейму, так и к строке меню.