实时监听JFrame的高度和宽度

4

我遇到了一个情况,我希望能够在用户拖动鼠标调整框架大小时知道JFrame的高度和宽度。

我进行了研究,以下问题提供的答案对我有所帮助,但并不完全: 听取用户拖动鼠标时的JFrame调整大小事件?

我的问题是: 我让我的"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的其他边界发生的任何事情。

嗯,它不会触发属性更改事件吗? - Neil Coffey
6
当我从底部/右侧调整大小时,componentResized()事件会动态触发,我正在使用在XP上使用JDK6_7。请发布证明问题的SSCCE - camickr
抱歉,这个例子有一个小修复:SSCCE。我忘记在ResizeFrame类的ComponentListener方法中添加canvas.repaint()了。之前我只调用了repaint()。 - Waffle
我猜测SSCCE只有15-20行,所以代码应该在论坛上发布,这样我们都可以看到它。 - camickr
很抱歉,将此问题的示例代码缩减至20行是不可能的。如果您想要继续帮助我,那么我能提供的最简单的示例就在pastebin链接中。请查看源代码,我已经在整个过程中进行了注释。 - Waffle
显示剩余3条评论
1个回答

3
你不必使用鼠标来完成这个任务!有一种简便的方法:编写一个组件监听器,让HSFrame实现ComponentListener并将你的调整代码放在public void componentResized(ComponentEvent e)中。
我认为MouseListener不起作用是因为当你从右下角拖动时,鼠标并没有在JFrame内部,因此事件监听器无法捕获它。

谢谢,但我确实尝试过了。这里有一个SSCCE,展示了我的问题(将原始代码保存为MainClass.java文件,编译,然后运行)。唯一不实时更新的是从右下角调整“ResizeFrame”(等同于例子中的HSFrame)的大小。我就是不明白——甚至从右下角调整调试框架的大小也可以。我已经在两个框架上都添加了ComponentListener和MouseMotionListener,但是ResizeFrame的右下角在拖动鼠标时无法重新绘制。 - Waffle
抱歉,这个例子需要进行一些小修正:SSCCE。我忘记在ResizeFrame类的ComponentListener方法中添加canvas.repaint()了。之前我只是调用了repaint()。 - Waffle
我决定暂时忍受这个问题,因为我只是让它更新调试信息,这与实际程序没有什么关系(高度/宽度等最佳组件放置和类似的东西)。但如果有人能够弄清楚我最初想要做的事情是否可能,那就太好了。 - Waffle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接