2009-05-19 45 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原來是窗口標題欄。

相關問題