Очевидно, что этот вопрос уже существует here. И over here кто-то ответил на это аналогичным образом. Тем не менее, я пробовал оба подхода (как я уже указывал), и, похоже, для меня это не работает. Я нахожусь на Java 8 Update 22 в Windows 10, тогда как плакат на этом последнем сообщении не находится в Windows и на Java 7, поэтому, возможно, одна из этих вещей имеет к этому какое-то отношение. Код я попытался, где getInstance()
мой объект JFrame:Привести окно JFrame на передний план
private static void bringToFront() {
getInstance().setVisible(true);
getInstance().setExtendedState(JFrame.NORMAL);
getInstance().toFront();
getInstance().repaint();
}
private static void bringToFront() {
getInstance().setVisible(true);
getInstance().toFront();
getInstance().requestFocus();
getInstance().repaint();
}
@Override
public void toFront() {
int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;
super.setExtendedState(sta);
super.setAlwaysOnTop(true);
super.toFront();
super.requestFocus();
super.setAlwaysOnTop(false);
}
Обратите внимание, что я не хотите, чтобы окно всегда оставаться на вершине. Однако с этим последним фрагментом он остается на вершине.
EDIT: Теперь я понимаю, что он не всегда остается на вершине. Проблема в том, что сначала окно появляется сверху, но не имеет фокуса (значок на панели задач мерцает), а это означает, что если пользователь нажимает где-то в другом месте, чем окно, окно будет оставаться сверху, потому что оно не является «потерять фокус», так как его не было с самого начала. Я попробовал requestFocus()
, но это тоже не сработало. Возможно, из-за this explanation. Как я могу убедиться, что окно сосредоточено на первоначальном всплывающем окне?
Я пробовал решение mKorbel, но это тоже не сработало. Он работает только тогда, когда окно уже появилось и было активировано и деактивировано, и когда затем вызывается метод, окно выходит на передний план. Однако, когда сначала, инициализируя окно, он не отображается спереди.
private static void bringToFront() {
getInstance().setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
getInstance().toFront();
}
});
getInstance().requestFocus();
getInstance().repaint();
}
снова JFrame игнорирует toFront (основано на сверстники из родной ОС) это funcionality резервируется JDialog/JWindow (с модальности и alwaysInTop, и т.д.), getExtendedState() & ~ JFrame.ICONIFIED & JFrame. НОРМАЛЬНЫЙ; работает для одного экземпляра JFrame, затем этот контейнер перемещается на экран спереди (вперед, например, Chrome ...) – mKorbel
[вы можете протестировать] (http://stackoverflow.com/a/6139696/714968), работает для меня от WinXP до Win10, вкл. версии серверов (2008/2012) с графическим интерфейсом – mKorbel
@mKorbel Я очень ценю, что вы пытаетесь объяснить это мне, но я действительно не понимаю, что вы говорите. Из примера, с которым вы связались, я получаю только то, что вы используете это в JFrame (что не работает для меня, я не могу использовать iconified -> normal, см. Мой связанный вопрос): 'frame.setExtendedState (Frame.ICONIFIED) ; frame.setExtendedState (Frame.NORMAL); frame.setAlwaysOnTop (true); frame.setAlwaysOnTop (false); ' –