Java如何让JFrame窗口“停留在原地”?

4
有没有一种方法可以使Java应用程序的框架停留在我使用.setLocation设置的位置?我想禁用用户将其移动到屏幕上的能力。

3
仅出于好奇,如果窗口被移动了,为什么会成为问题呢?我是用户,这是我的电脑,窗口应该放到我想要它们去的地方。就这样。 - mbatchkarov
4个回答

3

以下是如何防止JFrame被移动。在生产应用程序中使用此方法不是个好主意,因为它会使用户感到烦恼,并在用户尝试最小化/最大化窗口时产生其他错误。

public static void main(String args[]) throws Exception {
class JFrameTypeLocking extends JFrame {
    Point locked=null;
    public JFrameTypeLocking(String string) {
        super(string);
        super.addComponentListener(new ComponentAdapter(){
            public void componentMoved(ComponentEvent e) {
                if (locked!=null) JFrameTypeLocking.this.setLocation(locked);
            }});
    }
    public void lockLocation() {
        locked=super.getLocation();
    }
}
JFrameTypeLocking f = new JFrameTypeLocking("");
f.setSize(300,300);
f.setLocation(300,300);
f.setVisible(true);
f.lockLocation();
}

1
可以使用一个随父级移动并且不可拖动的对话框来制造组件的阴影效果。 - Mark Jeronimus
虽然不错,但执行min/max操作时会出现问题。如果你能以某种方式完全防止min/max(不确定是否可能做到),并且保证z-order,那么就能产生阴影效果。但如果你尝试,请使用半透明Window而不是Dialog。 - Java42

3
您可以创建一个守护线程,检查帧是否移动,如果移动了就将其放回原来的位置。

+1 这是唯一一个真正完成任务的解决方案。虽然有点不太好,但它确实有效。 - Ryan Amos
我尝试使用组件监听器,但当我尝试移动它时,它会闪烁,非常令人讨厌。 - Teo
一些谷歌搜索表明这确实是唯一可行的跨平台解决方案。当然,您可以尝试与窗口管理器搞作。 - mbatchkarov

2

你无法禁止移动JFrame窗体,因为它是系统GUI的一部分。最好的方法是向JFrame添加ComponentListener,在移动时将其放回原处。

我认为这样做会产生很有趣的视觉效果。


不是真的,可以隐藏标题栏。拖动窗口需要标题栏,因此窗口无法移动。 - Jon Egeland
@Jon 不是这样的。在 Windows 底部的应用程序栏上单击右键。选择移动。对于 Win7,请将鼠标悬停在应用程序上,然后右键单击所需窗口的缩略图。 - Ryan Amos

0

这有点像是一个技巧,但你可以将它变成全屏。无法移动全屏应用程序。


JFrame#setExtendedState(JFrame.MAXIMIZED_BOTH); - user1181445
我不想让框架太大。我希望它有自定义的大小和位置。 - Teo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接