Java - 如何避免使用未修饰或自定义的LookAndFeel窗口覆盖任务栏?

时间:2012-06-26 16:27:03

标签: java swing look-and-feel

是的,有些问题接近:)

Java中存在一个Bug(自2011年以来一直存在并报告,似乎没有努力修复它 - 应该在VM的本机端处理)

当你最大化一个“未修饰”的窗口,或者一个带有PLAF外观和感觉的窗口时,它将覆盖windows任务栏。很好 - 当你想要时需要,但是当你想要任务栏最大化的窗口覆盖它时。设置“永远在线”的权利没有任何区别。

是的,可以调整窗口大小但是必须知道任务栏的位置,或者屏幕大小减去任务栏 - 知道如何做到这一点吗?

并且如果要完成,则需要知道您在没有任务栏的屏幕上最大化。如果在多监视器虚拟桌面上......

任何想法:)

2 个答案:

答案 0 :(得分:5)

  

是的,可以调整窗口大小但是必须知道任务栏的位置,   或屏幕的大小减去任务栏 - 知道如何做到这一点?

是:

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

答案 1 :(得分:2)

由于

以下是从上面制作的代码,在系统最大化窗口后立即调用。它会检查任务栏并按顺序调整窗口大小。

请注意,就Java而言,setBounds将“取消最大化”窗口,因此“getExtendedState()”将返回un maximized,我需要维护自己的标志。我还必须缓存最后一个预先最大化的窗口大小,以便我知道在哪里将窗口恢复到以后 - 一切都太乱了但是它有效。

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