Java Swing:向组件及其所有装饰添加侦听器?
我可以向Swing组件添加侦听器(比如说MouseAdapter)吗 以及所有的内部装饰组件 这样当鼠标移动JInternalFrame时 (通过拖动窗口标题栏),它将显示以下事件:Java Swing:向组件及其所有装饰添加侦听器?,java,user-interface,swing,events,Java,User Interface,Swing,Events,我可以向Swing组件添加侦听器(比如说MouseAdapter)吗 以及所有的内部装饰组件 这样当鼠标移动JInternalFrame时 (通过拖动窗口标题栏),它将显示以下事件: 鼠标按下事件 鼠标标记事件 鼠标释放事件 当前,我在拖动时未收到上述事件 金特尔内尔弗雷姆 我希望有一些标准化的解决方案,但我找不到 编辑: 有些人建议使用ComponentListener 我我需要知道,当用户停止拖动时(mouseReleasedEvent), 当组件移动时,不。您可能应该使用a而不是a。在
- 鼠标按下事件
- 鼠标标记事件
- 鼠标释放事件
有些人建议使用ComponentListener 我我需要知道,当用户停止拖动时(mouseReleasedEvent), 当组件移动时,不。您可能应该使用a而不是a。在中,它说: 通常,您会将JinternalFrame添加到 JDesktopPane。用户界面委托 观察和感受特定的动作,以 由维护的DesktopManager对象 JDesktopPane
也许您应该将侦听器添加到JDesktopPane MouseListener/MouseMotionListener在拖动JInternalFrame时不会检测到。检测移动的最佳方法是在JInternalFrame本身上使用ComponentListener。是的,您可以向容器的所有组件添加一个侦听器<代码>获取组件并添加侦听器。您应该能够以递归的方式实现这一点。您还可以使用
ContainerListener
检查是否添加和删除组件
但是,MouseListener
和MouseMotionListener
的行为异常,事件通常会向父级冒泡,但如果有监听器在场,则不会这样做(这对于无望的设计来说是怎么回事?)
你的选择是:
- 递归添加侦听器(错误,请参见上文)
- 将侦听器添加到特定组件(易碎)
- 添加“玻璃窗格”(一个凌乱的黑客)
- 将
添加到AWTEventListener
(需要权限)Toolkit
- 推送
并检查事件(Opera和Safari显然不起作用;停止系统复制和粘贴以及小程序拖动)EventQueue
- 使用组件监听器
// ctor goes here {
InternalFrameUI thisUI = getUI();
((BasicInternalFrameUI) thisUI).getNorthPane()
.addMouseMotionListener(new MyMouseListener());
// }
NorthPane原来是窗口标题栏。ComponentListener触发事件“componentMoved”,但我需要知道用户何时开始和结束拖动操作。用户可以按下鼠标按钮,但不移动组件。ComponentListener不会告诉我鼠标按钮仍然被按下。我意识到了这一点,但不太确定您将如何完成这一点,所以这是我所能做的最好的。出于好奇,您为什么需要知道这一点?MouseAdapter实现了这两个功能,我使用addMouseListener(…)和addMouseMotionListener(…)添加了它。尝试:玻璃窗格不接收必要的事件。我想我要写自己的可拖动组件(已经做过一次)在内部框架的内容区的玻璃窗格(显然)不起作用。啊,对不起,你是说JInternalFrame父级的玻璃窗格。为什么它是乱七八糟的?玻璃窗总是乱七八糟的。所有这些都是事件转发。嗯。在1.6中,弹出窗口从玻璃窗格(这导致了一些问题)移动到awt事件侦听器。