2009-05-19 103 views
2

我可以向Swing组件 及其所有的内部装饰组件添加侦听程序(假设MouseAdapter)吗?Swing:将侦听器添加到组件并完成其装饰?

所以,当一个JInternalFrame处于由鼠标 移动(通过拖动窗口的标题栏),它会给我以下事件:

  • 的mousePressed事件,
  • 的mouseDragged事件,
  • mouseReleased event。

目前,我收到了上述事件的没有拖动 的JInternalFrame时。

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

编辑:
有人建议使用的ComponentListener,但不会对 做我的。我需要知道,用户停止拖动(mouseReleasedEvent), 而不是当组件移动。

回答

0

您应该使用MouseMotionListener而不是MouseListener

+0

MouseAdapter同时实现了,我添加使用 addMouseListener将(...)和addMouseMotionListener(...) – 2009-05-19 09:34:44

0

JInternalFrame API documentation,它说:

一般地,增加JInternalFrames到 JDesktopPane中。 UI将 外观特定的操作委托给由 维护的JDesktopPane的 DesktopManager对象。

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

0

拖动JInternalFrame时,MouseListener/MouseMotionListener不会检测到。您最好在这里检测移动是使用JInternalFrame本身的ComponentListener。

+0

的的ComponentListener触发事件“的componentMoved”,但我需要知道用户什么时候开始和结束的拖动操作。用户可以按下鼠标按钮,但不要移动该共享组件。 ComponentListener不会告诉我鼠标按钮仍然被按下。 – 2009-05-19 09:32:19

+0

我意识到这一点,但不太清楚你会怎么做,所以这是我能做的最好的。出于好奇,你为什么需要知道这一点? – willcodejavaforfood 2009-05-19 10:08:26

2

是的,您可以将侦听器添加到所有容器的组件。 getComponents并添加侦听器。你应该能够设法递归地做到这一点。您也可以使用ContainerListener来检查添加和删除组件。

但是,MouseListenerMouseMotionListener的行为很奇怪,因为事件通常会冒泡到父级,但是如果侦听程序存在则不会这样做(对于无望设计,情况如何?)。

你的选择是:

  • 递归添加监听器(坏,见上文)
  • 添加监听到特定的组件(脆弱)
  • 添加 “玻璃板”(一个混乱的黑客)
  • AWTEventListener添加到Toolkit(需要权限)
  • 推动EventQueue并检查事件(不适用于Opera和Safari)显然,停止系统的复制和粘贴和小程序拖动工作)
  • 使用ComponentListener
1

我发现它是如何可能可以做到,但直觉告诉我,这是一个肮脏的黑客

好,它的工作原理,但谁可以给我保证它的工作原理到处?

// ctor goes here { 

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

// } 

NorthPane原来是窗口标题栏。

相关问题