【问题标题】:Listener that has events for when a frame is snapped to the left or right of screen具有帧捕捉到屏幕左侧或右侧的事件的侦听器
【发布时间】:2013-07-27 04:10:18
【问题描述】:

我知道WindowStateListener 会告诉我组件是垂直最大化、水平最大化还是同时最大化。至少,它说它会。除了将窗口捕捉到屏幕的左边缘或右边缘之外,我不知道如何在水平方向或垂直方向上完全最大化窗口。这种行为是否有另一个听众?还是我需要自己制作一些东西来跟踪鼠标相对于屏幕的位置?我制作了一个示例程序来显示我所描述的内容。

SSCCE

import java.awt.Dimension;
import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) {
    SnapFrame frame = new SnapFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(new Dimension(500,500));
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    }
}
class SnapFrame extends JFrame implements WindowStateListener{
    public SnapFrame(){
        super();
        addWindowStateListener(this);
    }


@Override
public void windowStateChanged(WindowEvent arg0) {
     //will print a statement for all state change events except snapping to left/right edges of screen
    System.out.println("state changed");
}
}

如果我想让事情由这种行为触发,并且没有其他侦听器对此有事件,那么一个不错的主意是获取我的屏幕尺寸并观察我的鼠标位置是否接近我的边缘屏幕?

【问题讨论】:

  • 1) 源代码中的一个空白行总是就足够了。 { 之后或} 之前的空行通常也是多余的。 2) 为了尽快获得更好的帮助,请发布SSCCE。 3)不要设置顶级容器的大小。而是布局内容并致电pack()。 4) 框架定位,不能通过setLocationByPlatform(true)。请参阅this answer 进行演示。
  • 虽然我同意你所说的一切,但我在不到一分钟的时间内将这些内容整理在一起,以说明我在将窗口拖动到我的左边缘或右边缘时为实现事件所做的测试屏幕。我把这些放在一起,以便其他人可以复制、粘贴并查看我所描述的内容。除非我严重误解了 SSCCE 的目的,否则我相信我已经发布了一个。如果窗口出现在中心,远离所有边缘,则测试“拖动此窗口”场景会容易得多。你不同意吗?
  • SSCCE 是一个源文件。将public class SnapFrame 更改为class SnapFrame 并将其粘贴到Main 类源的末尾,这将是一个SSCCE。 :)
  • 不,没有侦听器或功能可以 1- 告诉您您的窗口何时对齐到屏幕的一侧或 2- 将您的窗口对齐到一侧。我以前做过类似的事情,但那是一个未装饰的窗户
  • 我害怕那个。我不认为解决它会非常困难,但我总是在从头开始构建自己的东西之前进行搜索,以节省我的时间。 :p 谢谢你的回复。

标签: java swing jframe listener windowstate


【解决方案1】:

此源使用ComponentListener 检测帧何时捕捉到屏幕的顶部或底部。我不知道如何将我的 Windows 配置为向左或向右对齐。

import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;

public class Main {

    public static void main(String[] args) {
        SnapFrame frame = new SnapFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(new Dimension(500, 500));
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
}

class SnapFrame extends JFrame implements ComponentListener {

    Dimension screenSize;

    public SnapFrame() {
        super();
        screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        addComponentListener(this);
    }

    @Override
    public void componentResized(ComponentEvent e) {
        Rectangle r = getBounds();

        if (r.getMinY()==0  || r.getMaxY()==(int)screenSize.getHeight()) {
            System.out.print("Well snap!");
        }
    }

    @Override
    public void componentMoved(ComponentEvent ignore) {}

    @Override
    public void componentShown(ComponentEvent ignore) {}

    @Override
    public void componentHidden(ComponentEvent ignore) {}
}

其他提示

  • 不要扩展框架或其他顶级容器。而是创建和使用一个实例。
  • 应在 EDT 上创建和更新 Swing GUI。有关详细信息,请参阅Concurrency in Swing

【讨论】:

  • 非常感谢。我正在使用 JLayeredPane,因此有兴趣使用所有窗口/组件状态更改和移动来手动调整 JLayeredPane 中的组件大小,因为没有布局管理器。非常感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多