【发布时间】:2012-01-28 20:27:27
【问题描述】:
我有一种情况,我希望能够在用户拖动鼠标调整框架大小时知道 JFrame 的高度和宽度。
我对此进行了研究,以下问题中提供的答案对我有一点帮助,但不是全部:Listen to JFrame resize events as the user drags their mouse?
我的问题是:我已经让我的“HSFrame”类扩展了 JFrame 并实现了 ActionListener、MouseMotionListener(但是,ActionListener 与这个问题无关)。这个问题涉及的是 MouseMotionListener。
我有一个名为“CanvasPanel”的单独类,它扩展了 JPanel——这是我使用图形对象通过绘制字符串来更新实时信息的地方。
public void mouseMoved(MouseEvent e)
{
}
public void mouseDragged(MouseEvent e)
{
validate();
canvas.repaint();
}
这是我的“HSFrame”类的代码摘录(扩展了 JFrame,实现了 MouseMotionListener)。在这个代码示例中,“canvas”是一个 CanvasPanel 对象,每当调用 MouseDragged 时,我都会调用它的 repaint() 方法。
我选择使用 MouseMotionListener 是因为它(据说)会给我实时更新,而不是 ComponentListener 的 componentResized() 方法(它与 MouseReleased 相关联)。
当我从左上角调整框架大小时,一切都会 100% 完美更新。高度、宽度、X 和 Y 值都完美重绘。
但是当我从右下角调整大小时,它不会实时更新。我不了解你,但我更喜欢从右下角调整大小。
在“CanvasPanel”类本身中,我扩展了 ComponentListener 并向那里的“HSFrame”对象添加了一个侦听器——它不会实时更新,这很好,但它确实在无论 HSFrame 使用哪个角调整大小,都会释放鼠标。
主要问题: 是否可以让 MouseMostionListener 知道我正在从右下角调整 JFrame 的大小?当我通过单击并拖动标题栏移动框架时它会听到,当我从左上角调整大小时它会听到(它也与标题栏交互)。当有任何东西进入 JFrame 的其他边界时,它只是没有听到。
【问题讨论】:
-
嗯,它不会触发属性更改事件吗?
-
当我在 XP 上使用 JDK6_7 从底部/右侧调整大小时,componentResized() 事件会为我动态触发。发布您的 SSCCE 来证明问题。
-
SSCCE 这是我能做的最基础的例子。将其保存为 MainClass.java,编译并运行。它应该像一个 JAVA 文件那样工作。这里的问题如下:当用户从右下角拖动时,调整主应用程序窗口的大小不会实时重新绘制。它确实会从左上角拖动实时重绘。这就是让我感动的地方:如果你从任何地方拖动调试窗口,它会实时更新。那么为什么主窗口不这样做呢?我已将两个侦听器添加到两个框架中。右下角是唯一不起作用的地方。
-
抱歉,这里是对该示例的一个小修复:SSCCE。我忘记将 canvas.repaint() 添加到 ResizeFrame 类中的 ComponentListener 方法中。以前我只是调用了 repaint()。
-
我猜SSCCE只有15-20行,所以代码应该贴在论坛上,让大家都能看到。
标签: java swing resize jframe mouselistener