实时监听JFrame高宽
Posted
技术标签:
【中文标题】实时监听JFrame高宽【英文标题】:Real-time listening to JFrame height and width 【发布时间】: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行,所以代码应该贴在论坛上,让大家都能看到。 【参考方案1】:您不必使用鼠标来执行此操作!用简单的方法做:
写一个component listener。让 HSFrame 实现 ComponentListener
并将您的调整大小代码放入 public void componentResized(ComponentEvent e)
。
我认为 mouseListener 不起作用,因为当您从右下角拖动时,您的鼠标不在 JFrame
中,因此事件侦听器不会拾取它。
【讨论】:
谢谢,但我确实尝试过这个。这是一个 SSCCE 显示我在说什么(将原始代码保存为 MainClass.java,编译,然后运行它)。唯一不实时更新的是从右下角调整“ResizeFrame”(相当于示例中的 HSFrame)的大小。我只是不明白——即使从右下角调整调试框架的大小也可以。我在两个框架中都添加了 ComponentListener 和 MouseMotionListener,但是 ResizeFrame 的右下角在拖动鼠标时不会重新绘制。 抱歉,这里是对该示例的一个小修复:SSCCE。我忘记将 canvas.repaint() 添加到 ResizeFrame 类中的 ComponentListener 方法中。以前我只是调用了 repaint()。 我决定暂时解决这个问题,因为我只是让事情更新调试信息,这与实际程序无关(高度/宽度的东西,用于最佳放置组件和类似的东西)。但如果有人仍然能弄清楚是否有可能做我最初想做的事,那就太好了以上是关于实时监听JFrame高宽的主要内容,如果未能解决你的问题,请参考以下文章