设置JFrame而不与任务栏重叠

时间:2013-10-28 10:15:44

标签: java swing jframe

我需要有一个未修饰的JFrame( setUndecorated(true) ),需要全屏显示,而不会与任务栏重叠。

我尝试了以下解决方案。

  • 调用setExtendedState(MAXIMIZED_BOTH)。

    • 优势: 这可以正常工作,即窗口会动态调整,除非它有以下问题。
    • 问题 最初窗口占据全屏 虽然框架会动态调整,但它与任务栏重叠。
  • Does JFrame.setExtendedState(MAXIMIZED_BOTH) work with undecorated frames?

    中所述尝试了以下解决方案
     GraphicsConfiguration config = aFrame.getGraphicsConfiguration();
     Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice());
     aFrame.setBounds(0, 0, usableBounds.width, usableBounds.height);
    
    • 优势: 我没有重叠,窗口看起来很好。
    • 问题: 当任务栏位置/大小发生变化时,窗口不会动态调整自身。

非常感谢任何帮助。

我想到了一个设计。但不确定其可行性。我可以使用setBounds()。但是,当调整任务栏或重新定位任务栏时,我需要通知我的框架。有办法吗?

2 个答案:

答案 0 :(得分:6)

能够使用以下代码解决上述问题,

Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice());
setMaximizedBounds(usableBounds);
setExtendedState(MAXIMIZED_BOTH);

所以通过getUsableBounds我能够获得离开任务栏的界限。因此我正在使用setExtendedState(MAXIMIZED_BOTH)当我重新调整/重新定位任务栏时,窗口会自动更新。 : - )

答案 1 :(得分:0)

final Point x = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();

有一个单独的线程来检查任务栏是否被更改。如果是这样更新大小

new Thread(new Runnable() {
     @Override
     public void run() {
        if (x.equals(GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint())) {
           Rectangle r = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
           setSize(r.getSize());
        }
        try {
           Thread.sleep(5000);
        } catch (InterruptedException ex) {
           Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
     }
  }).start();