2016-01-06 3 views
1

Очевидно, что этот вопрос уже существует 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();                  
} 

And taken from this answer.

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(); 
} 
+1

снова JFrame игнорирует toFront (основано на сверстники из родной ОС) это funcionality резервируется JDialog/JWindow (с модальности и alwaysInTop, и т.д.), getExtendedState() & ~ JFrame.ICONIFIED & JFrame. НОРМАЛЬНЫЙ; работает для одного экземпляра JFrame, затем этот контейнер перемещается на экран спереди (вперед, например, Chrome ...) – mKorbel

+0

[вы можете протестировать] (http://stackoverflow.com/a/6139696/714968), работает для меня от WinXP до Win10, вкл. версии серверов (2008/2012) с графическим интерфейсом – mKorbel

+0

@mKorbel Я очень ценю, что вы пытаетесь объяснить это мне, но я действительно не понимаю, что вы говорите. Из примера, с которым вы связались, я получаю только то, что вы используете это в JFrame (что не работает для меня, я не могу использовать iconified -> normal, см. Мой связанный вопрос): 'frame.setExtendedState (Frame.ICONIFIED) ; frame.setExtendedState (Frame.NORMAL); frame.setAlwaysOnTop (true); frame.setAlwaysOnTop (false); ' –

ответ

0

Возможное решение:

private static void bringToFront() {                
    getInstance().setVisible(true); 
    getInstance().setFocusable(true); 
    getInstance().requestFocus(); 
} 
+0

Это не работает. –

+0

Поскольку я читаю остальную часть комментариев, я думаю, вам нужно будет предоставить больше кода, который у вас есть. Окна, которые вы пытаетесь вывести на передний план, вы когда-нибудь закрываете его? Если да, установлено setDefaultCloseOperation()? – brainiac080195

2

Это то, что я использую ниже.

Предупреждение: YMMV! Я вовсе не гарантирую, что это сработает, и если это произойдет, возможно, это не сработает на другой ОС, другой версии той же ОС, на вашей версии JAVA или когда Saturn выровняется с Юпитером и т. Д.

Здесь идет:

private void hackyToFront() 
{ 
    // What follows is a hack to make sure that the frame is put to front and activated. 
    // Simply calling setVisible(true) and toFront() is not enough. 

    SwingUtilities.invokeLater(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      if(!isVisible()) 
       setVisible(true); 
      setExtendedState(JFrame.NORMAL); 
      toFront(); 
      setAlwaysOnTop(true); 
      try 
      { 
       final Point oldMouseLocation = MouseInfo.getPointerInfo().getLocation(); 

       // simulate a mouse click on title bar of window 
       Robot robot = new Robot(); 
       robot.mouseMove(getX() + 100, getY() + 10); 
       robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); 
       robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); 

       // move mouse to old location 
       robot.mouseMove((int) oldMouseLocation.getX(), (int) oldMouseLocation.getY()); 
      } 
      catch(Exception ex) 
      {} 
      finally 
      { 
       setAlwaysOnTop(false); 
      } 
     } 
    }); 
} 
+0

Спасибо! Работает на меня! –

Смежные вопросы