3

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

我尝试了以下解决方案。

  • 调用 setExtendedState(MAXIMIZED_BOTH)。

    • 优点:这可以正常工作,即窗口正在动态调整,除了它有以下问题。
    • 问题 最初窗口占据全屏 虽然框架会自行动态调整,但它与任务栏重叠。
  • 尝试了以下解决方案,如JFrame.setExtendedState(MAXIMIZED_BOTH) 是否适用于未装饰的框架?

     GraphicsConfiguration config = aFrame.getGraphicsConfiguration();
     Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice());
     aFrame.setBounds(0, 0, usableBounds.width, usableBounds.height);
    
    • 优点:我没有重叠,窗口看起来很好。
    • 问题:更改任务栏位置/大小时,窗口不会动态调整自身。

任何帮助将不胜感激。

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

4

2 回答 2

6

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

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

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

于 2013-10-30T13:48:05.100 回答
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();
于 2013-10-28T10:28:32.703 回答