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