是的,有些问题很接近:)
Java 中有一个 Bug(自 2011 年以来一直存在并报告,似乎也没有努力修复它 - 应该在虚拟机的本机端处理)
也就是说,当您最大化“未修饰”窗口或使用 PLAF 外观绘制的窗口时,它将覆盖 Windows 任务栏。很好 - 理想的当你想要它时,但是当你确实想要任务栏最大化时,窗口会覆盖它。设置“始终在最前面”属性没有任何区别。
是的,人们可以调整窗口大小,但必须知道任务栏在哪里,或者屏幕的大小减去任务栏 - 知道如何做到这一点吗?
并且需要知道您正在没有任务栏的屏幕上最大化(如果正在这样做)。如果在多显示器虚拟桌面上...
任何想法:)
是的,人们可以调整窗口大小,但必须知道任务栏在哪里, 或者屏幕大小减去任务栏 - 知道怎么做吗?
是的:
1.查找您所在的图形设备(假设 p 是您要查找的屏幕的
Point
):
GraphicsConfiguration graphicsConfiguration = null;
for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) {
if (gd.getDefaultConfiguration().getBounds().contains(p)) {
graphicsConfiguration = gd.getDefaultConfiguration();
break;
}
}
2.查看屏幕边界(注意多个屏幕的某些边界位置为负 - 例如,如果您有一个位于主屏幕左侧的辅助屏幕)、屏幕尺寸和“插入”屏幕通常是任务栏和/或其他图形工件:
Rectangle screenBounds = graphicsConfiguration.getBounds();
Dimension screenSize = screenBounds.getSize();
Insets screenInsets = Toolkit.getDefaultToolkit()
.getScreenInsets(graphicsConfiguration);
谢谢
这是上面编写的代码,在系统最大化窗口后立即调用。它检查任务栏并相应地调整窗口大小。
请注意,就 Java 而言,setBounds 将“取消最大化”窗口,因此“getExtendedState()”将返回未最大化的状态,我需要维护自己的标志。我还必须缓存最后一个预最大化的窗口大小,以便我知道稍后将窗口恢复到哪里 - 一切都太乱了,但它有效。
Rectangle bounds;
Rectangle fbounds = frame.getBounds();
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
// as system maximized this at this point we test the center of the window
// as it should be on the proper screen.
Point p = new Point(fbounds.x + (fbounds.width/2),fbounds.y + (fbounds.height/2));
GraphicsConfiguration graphicsConfiguration = null;
for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices())
{
if (gd.getDefaultConfiguration().getBounds().contains(p)) {
graphicsConfiguration = gd.getDefaultConfiguration();
break;
}
}
if(graphicsConfiguration != null)
{
bounds = graphicsConfiguration.getBounds();
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(graphicsConfiguration);
bounds.x += screenInsets.left;
bounds.y += screenInsets.top;
bounds.height -= screenInsets.bottom;
bounds.width -= screenInsets.right;
} else {
bounds = env.getMaximumWindowBounds();
}
if(fbounds.equals(bounds)) {
bounds.height -= 1;
}
frame.setBounds(bounds);
Rectangle rec = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
frmMain.setSize(rec.width, rec.height);
在其他地方找到该片段。对我来说效果很好! 干杯!