监听器,其中有一个框架被捕捉到屏幕左侧或右侧的事件

时间:2013-07-27 04:10:18

标签: java swing jframe listener windowstate

我知道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 个答案:

答案 0 :(得分:3)

此来源使用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