Java 设置JFrame而不与任务栏重叠

Java 设置JFrame而不与任务栏重叠,java,swing,jframe,Java,Swing,Jframe,我需要一个未修饰的JFrame(setUndercorated(true)),它需要全屏显示,而不与任务栏重叠 我尝试了以下解决方案 调用setExtendedState(最大化两个) 优势: 这与预期一样工作正常,也就是说,窗口正在动态地自我调整,但它有以下问题 问题 最初,窗口占据全屏 虽然框架会自动调整,但它与任务栏重叠 按照中的说明尝试了以下解决方案 优势: 我没有重叠,窗户看起来很好 问题: 更改任务栏位置/大小时,窗口不会自动调整 任何帮助都将不胜感激 我想到了一个设计。

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

我尝试了以下解决方案

  • 调用setExtendedState(最大化两个)

    • 优势: 这与预期一样工作正常,也就是说,窗口正在动态地自我调整,但它有以下问题
    • 问题 最初,窗口占据全屏 虽然框架会自动调整,但它与任务栏重叠
  • 按照中的说明尝试了以下解决方案

    • 优势: 我没有重叠,窗户看起来很好
    • 问题: 更改任务栏位置/大小时,窗口不会自动调整
任何帮助都将不胜感激

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

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();

能够用下面的代码修复上述问题

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

因此,通过
getUsableBounds
我可以从任务栏中获取边界。因此,我使用的是
setExtendedState(最大化)
当我重新调整任务栏的大小/位置时,窗口会自动更新。:-)

我不确定有没有办法做到这一点,至少不用去当地人那里level@MadProgrammer不,您可以使用GraphicsEnvironment类实现这一点。检查我的solution@Thuiya不,当任务栏打开时,它不会自动更新changed@MadProgrammer我们可以让线程来检查屏幕大小是否改变。@Thuiya您可以附加一个本机回调,这样可以在没有线程开销的情况下获得相同的结果,但这只是我的opinionsetSize()不起作用。行为与我提到的setBounds()相同。当我更改任务栏的大小/位置时,窗口大小没有得到动态更新。您是否建议使用一个线程无限期运行,并根据任务栏更新框架的大小?它在少数系统上对我不起作用,问题是在窗口10上,比例和布局的显示设置设置为125%,将其更改为100%即可开始工作。在JDK11上测试。
Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice());
setMaximizedBounds(usableBounds);
setExtendedState(MAXIMIZED_BOTH);