在用户拖动鼠标时收听 JFrame 调整事件大小?

2022-09-01 05:08:46

当用户单击 JFrame 的一角以调整大小并拖动鼠标时,JFrame 会在用户拖动时根据鼠标的当前位置重绘。您如何收听这些事件?

以下是我目前尝试过的内容:

public final class TestFrame extends JFrame {
    public TestFrame() {
        this.addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                // This is only called when the user releases the mouse button.
                System.out.println("componentResized");
            }
        });
    }

    // These methods do not appear to be called at all when a JFrame
    // is being resized.
    @Override
    public void setSize(int width, int height) {
        System.out.println("setSize");
    }

    @Override
    public void setBounds(Rectangle r) {
        System.out.println("setBounds A");
    }

    @Override
    public void setBounds(int x, int y, int width, int height) {
        System.out.println("setBounds B");
    }
}

如何确定和约束用户在围绕鼠标拖动时调整窗口大小的方式(基于窗口的当前纵横比)?


答案 1

您可以添加一个组件侦听器并实现组件Resized函数,如下所示:

JFrame component = new JFrame("My Frame");

component.addComponentListener(new ComponentAdapter() 
{  
        public void componentResized(ComponentEvent evt) {
            Component c = (Component)evt.getSource();
            //........
        }
});

编辑:显然,对于 JFrame,组件Resize事件被挂接到鼠标释放事件。这就是在释放鼠标按钮时调用该方法的原因。

实现你想要的一种方法是添加一个JPanel,它将覆盖JFrame的整个区域。然后将组件Listener添加到JPanel(即使鼠标仍在拖动时,也会调用组件Resized for JPanel)。调整框架大小时,面板也会调整大小。

我知道,这不是最优雅的解决方案,但它有效!


答案 2

另一种解决方法(与 Alex 非常相似,但更直接一些)是从 的根窗格中侦听事件:JFrame

public final class TestFrame extends JFrame {
    public TestFrame() {
        this.getRootPane().addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                // This is only called when the user releases the mouse button.
                System.out.println("componentResized");
            }
        });
    }
}

根据其他实现详细信息,根窗格可能会更改。如果这是一种可能性,那么您可以覆盖并处理它。由于受保护且仅从构造函数调用,因此您不太可能需要这样做。setRootPane()setRootPane()


推荐