将Jframe与不同位置对齐

时间:2017-07-10 20:51:23

标签: java jframe desktop-application

我知道在JVM上运行的java使它与平台无关。我最近学习开发桌面应用程序,所以我的问题是:如何让我的appscreen弹出正好在右上角/左上角或右下角/左下角或中心?比如,对于右上角我们可以简单地使用:
frame.setLocation(0,0)
或者对于中心而言,我在这里找到的一个好的,独立于平台的方式是:
frame.setLocationRelativeTo(null)

但是其他3个边缘怎么样?我看到一些大块的代码使用其他类(维度/点类)或包,但要么它们太复杂或特定方向(如我所见的一个答案,很容易让我的应用程序弹出底部;但如果我老师说他希望看到应用程序弹出窗口,我必须重新编写我的整个解决方案。)我也尝试使用getmaximumsize().height/width,但没有好处。

我希望有人能帮助我处理所有可能的边缘和中心位置的代码(即使它使用其他类/包;只要它满足所有上述情况,欢迎你的回答)。另一个小问题:在java中是否有任何变量MAXWINDOW,我的窗口屏幕是15.6“,下面的0.5”工具栏使我的250 * 100像素jframe的理想底部为0,15.5“,a变量告诉特定理想值?并根据我的工具栏或具有更小/更大尺寸和工具栏位置的操作系统的位置改变其值? 它只是想到了,因为它感觉像这样的变量可能非常方便,并增加了更多的平台独立性java。

修改 ...
感谢@bjorn和@madprogrammer提供了很好的答案。我从未想过“考虑到平台独立条款”,“获取无任务栏的窗口大小的位置”问题需要这么大的代码。我觉得bjorn的答案目前完全满足了我。但疯狂的答案对我引用的问题更准确(或者说我的英语很准确)。

2 个答案:

答案 0 :(得分:4)

Toolkit.getDefaultToolkit().getScreenSize();会返回默认屏幕的全屏大小,但不会考虑其他屏幕元素,例如停靠栏或任务栏,它们并不总是位于底部屏幕并不总是相同的大小

更好的解决方案可能是使用Toolkit.getDefaultToolkit().getScreenInsetsGraphicsConfiguration

public static Rectangle getScreenViewableBounds(Window window) {
    return getScreenViewableBounds((Component) window);
}

public static Rectangle getScreenViewableBounds(Component comp) {
    return getScreenViewableBounds(getGraphicsDevice(comp));
}

public static Rectangle getScreenViewableBounds(GraphicsDevice gd) {
    Rectangle bounds = new Rectangle(0, 0, 0, 0);
    if (gd == null) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        gd = ge.getDefaultScreenDevice();
    }

    if (gd != null) {
        GraphicsConfiguration gc = gd.getDefaultConfiguration();
        bounds = gc.getBounds();

        Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
        bounds.x += insets.left;
        bounds.y += insets.top;
        bounds.width -= (insets.left + insets.right);
        bounds.height -= (insets.top + insets.bottom);
    }

    return bounds;
}

这将返回特定屏幕的“安全可见”范围。如果您传递null,则会使用“默认”屏幕

// Safe viewable area for default screen
Rectangle bounds = getScreenViewableBounds(null);
int x = bounds.x + ((bounds.width - getWidth());
int y = bounds.y + ((bounds.width - getHeight());

setLocation(x, y);

将窗口置于窗口的底部/右侧位置,但是将其与任务栏对齐(因为大多数人都将它沿着底部对齐)

对于像我这样将任务栏放在屏幕顶部的奇怪人物

// Safe viewable area for default screen
Rectangle bounds = getScreenViewableBounds(null);
int x = bounds.x;
int y = bounds.y;

setLocation(x, y);

将窗口放在可查看的顶部/左上角,在任务栏下方对齐

是的,我看到有太多的开发人员使用setLocation(0, 0)并将窗口放在任务栏/菜单栏下,他们的名字变成了“泥”

答案 1 :(得分:3)

您可以使用以下代码获取屏幕尺寸:

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();

在你的框架中,你可以通过从屏幕宽度中减去JFrame的宽度来设置相应的位置。对于高度,它也是相同的程序。