Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing:向组件及其所有装饰添加侦听器?_Java_User Interface_Swing_Events - Fatal编程技术网

Java Swing:向组件及其所有装饰添加侦听器?

Java Swing:向组件及其所有装饰添加侦听器?,java,user-interface,swing,events,Java,User Interface,Swing,Events,我可以向Swing组件添加侦听器(比如说MouseAdapter)吗 以及所有的内部装饰组件 这样当鼠标移动JInternalFrame时 (通过拖动窗口标题栏),它将显示以下事件: 鼠标按下事件 鼠标标记事件 鼠标释放事件 当前,我在拖动时未收到上述事件 金特尔内尔弗雷姆 我希望有一些标准化的解决方案,但我找不到 编辑: 有些人建议使用ComponentListener 我我需要知道,当用户停止拖动时(mouseReleasedEvent), 当组件移动时,不。您可能应该使用a而不是a。在

我可以向Swing组件添加侦听器(比如说MouseAdapter)吗 以及所有的内部装饰组件

这样当鼠标移动JInternalFrame时 (通过拖动窗口标题栏),它将显示以下事件:

  • 鼠标按下事件
  • 鼠标标记事件
  • 鼠标释放事件
当前,我在拖动时未收到上述事件 金特尔内尔弗雷姆

我希望有一些标准化的解决方案,但我找不到

编辑:
有些人建议使用ComponentListener 我我需要知道,当用户停止拖动时(mouseReleasedEvent), 当组件移动时,不

您可能应该使用a而不是a。

在中,它说:

通常,您会将JinternalFrame添加到 JDesktopPane。用户界面委托 观察和感受特定的动作,以 由维护的DesktopManager对象 JDesktopPane


也许您应该将侦听器添加到JDesktopPane

MouseListener/MouseMotionListener在拖动JInternalFrame时不会检测到。检测移动的最佳方法是在JInternalFrame本身上使用ComponentListener。

是的,您可以向容器的所有组件添加一个侦听器<代码>获取组件并添加侦听器。您应该能够以递归的方式实现这一点。您还可以使用
ContainerListener
检查是否添加和删除组件

但是,
MouseListener
MouseMotionListener
的行为异常,事件通常会向父级冒泡,但如果有监听器在场,则不会这样做(这对于无望的设计来说是怎么回事?)

你的选择是:

  • 递归添加侦听器(错误,请参见上文)
  • 将侦听器添加到特定组件(易碎)
  • 添加“玻璃窗格”(一个凌乱的黑客)
  • AWTEventListener
    添加到
    Toolkit
    (需要权限)
  • 推送
    EventQueue
    并检查事件(Opera和Safari显然不起作用;停止系统复制和粘贴以及小程序拖动)
  • 使用组件监听器

我发现了是如何做到的,但有些事情告诉我,这是一个肮脏的黑客行为(

好吧,它确实有效,但是谁能保证它在任何地方都有效呢?

// ctor goes here {

InternalFrameUI thisUI = getUI();
((BasicInternalFrameUI) thisUI).getNorthPane()
    .addMouseMotionListener(new MyMouseListener());

// }

NorthPane原来是窗口标题栏。

ComponentListener触发事件“componentMoved”,但我需要知道用户何时开始和结束拖动操作。用户可以按下鼠标按钮,但不移动组件。ComponentListener不会告诉我鼠标按钮仍然被按下。我意识到了这一点,但不太确定您将如何完成这一点,所以这是我所能做的最好的。出于好奇,您为什么需要知道这一点?MouseAdapter实现了这两个功能,我使用addMouseListener(…)和addMouseMotionListener(…)添加了它。尝试:玻璃窗格不接收必要的事件。我想我要写自己的可拖动组件(已经做过一次)在内部框架的内容区的玻璃窗格(显然)不起作用。啊,对不起,你是说JInternalFrame父级的玻璃窗格。为什么它是乱七八糟的?玻璃窗总是乱七八糟的。所有这些都是事件转发。嗯。在1.6中,弹出窗口从玻璃窗格(这导致了一些问题)移动到awt事件侦听器。