2013-01-21 74 views
3

我在我的Swing應用程序中調用getLocationOnScreen()JFrame。如果JFrame最小化爲-32000,則返回-32000。JFrame.getLocationOnScreen()用於最小化窗口

預計:

Location Coordinates On Computer Showing X=-32000, Y=-32000

但我需要知道窗口的位置,它被最小化之前或者是如果再次最大化,沒有實際的最大化它的位置。因爲我需要將JDialog定位爲相對於JFrame,儘管它已被最小化。

可能的解決辦法: 添加WindowListenerJFramewindowIconified()事件保存的座標。然後用它代替getLocationOnScreen()

有更好的解決方案,只使用JFrame方法?

多屏幕配置預計和下面的代碼被使用。

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gs = ge.getScreenDevices(); 
    for (int j = 0; j < gs.length; j++) { 
     GraphicsDevice gd = gs[j]; 
     GraphicsConfiguration[] gc = gd.getConfigurations(); 
     for (int i = 0; i < gc.length; i++) { 
      Rectangle gcBounds = gc[i].getBounds(); 
      Point loc = topContainer.getLocationOnScreen(); //might return -32000 when minimized 
      if (gcBounds.contains(loc)) { //fails if -32000 is returned 
+2

再次兩個或更多屏幕?或者從單顯示模式:-) – mKorbel

+0

@mKorbel,是的,多屏幕。我更新了代碼。我使用'gcBounds.contains(loc)',如果'JFrame'被最小化,它就會失敗。 –

回答

4

只需使用getLocation()。最小化與否,它總是會返回適當的值:

import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestJFrame { 

    public void initUI() { 
     final JFrame frame = new JFrame(TestJFrame.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600, 400); 
     frame.setVisible(true); 
     Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() { 
      @Override 
      public void run() { 
       System.err.println(frame.getLocation()); 
      } 
     }, 0, 1000, TimeUnit.MILLISECONDS); 
    } 

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, 
      UnsupportedLookAndFeelException { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestJFrame().initUI(); 
      } 

     }); 
    } 
} 
+0

是的,它適用於'JFrame'。我認爲'getLocation'之前就被使用了。但是'topContainer'是JApplet的失敗,所以我將它改爲'getLocationOnScreen'。 –

+0

@NikolayKuznetsov不是applet的專家,但據我測試它,它不會導致重大問題使用'SwingUtilities.windowForComponent(TestApplet.this).getLocation()' –