java - 当帧捕捉到屏幕左侧或右侧时具有事件的监听器

标签 java swing jframe listener windowstate

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

中南合作商会

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

如果我想让这个行为触发一些事情,并且没有其他监听器有这个事件,那么一个不错的主意是获取我的屏幕大小并在鼠标靠近我的边缘时观察我的鼠标位置屏幕?

最佳答案

此源使用 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了解更多详情。

关于java - 当帧捕捉到屏幕左侧或右侧时具有事件的监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17894148/

相关文章:

java - MockMvc 无法使用参数 @DateValid 进行验证

java - 使用 Scanner 时使用 InputStream 读取

java - 如何在 netbeans java swing 应用程序中编写模块化代码?

Java Swing 将对象添加到表中

java - 如何用一些测试数据填充我的新类

java - 将 BigInteger 转换为二进制字符串

java - CellRenderer - 使文本变粗

java - java 中我的框架上的 Jbutton 位置不起作用

java - 在 Android 上使用 JFrame(或外部等效项)

java - 如何将百分比转换为数字范围?