日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SWT鼠标单击实现

發布時間:2023/12/3 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SWT鼠标单击实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近,我做了一些SWT定制小部件的開發,偶然發現了一個問題, 為什么沒有默認的SWT鼠標單擊偵聽器? 由于這個主題有時會提出,所以我認為寫一兩句話來說明背后的理性基礎以及如何實現鼠標單擊通常不會受到傷害。

SWT鼠標請點擊

事件驅動的窗口小部件工具箱通常區分低級事件和語義事件。 低電平事件表示窗口系統出現或低電平輸入。 鼠標和鍵盤輸入基本上屬于此組。

語義事件又是控件特定的用戶交互的結果,并且可能由一個或多個低級事件組成。 例如,可以將按鈕單擊指定為鼠標下移,然后將其指定為鼠標上 移,而鼠標不會離開控件的邊界 。

問題的關鍵是控件特定的用戶交互 。 可以將圖像單擊指定為鼠標下移,然后單擊鼠標上移而不離開圖像特定區域的邊界。 差別不大,但意義重大。

語義事件類型SWT.Selection例如,對應于上面為org.eclipse.swt.widgets.Button控件提供的按鈕單擊規范。 但是它的組成在org.eclipse.swt.widgets.Slider上卻大不相同。 后者的行為很像圖像單擊定義:

顯然,沒有人愿意為每個控件區域上的鼠標單擊事件添加特定的偵聽器。 這是更舒適的基礎上那些低級別的賽事有一個語義抽象,對關鍵點或興趣通知觀察者1

單擊按鈕以自定義小部件

那么,按鈕單擊事件實現在自定義SWT小部件的(子)組件上看起來如何? 例如,考慮一個由幾個標簽Composite ,無論出于何種原因,其中一個標簽都應作為動作觸發。

點擊行為可以通過在SWT的類型化事件抽象之上運行一個小的動作包裝器來實現。 它可以實現/擴展org.eclipse.swt.events.MouseListener/-MouseAdapter并且可以在控件上注冊以用作按鈕單擊偵聽器:

static class ClickBehavior extends MouseAdapter {private final Runnable action;ClickBehavior( Runnable action ) {this.action = action;}@Overridepublic void mouseDown( MouseEvent event ) {// TODO: decent implementation}@Overridepublic void mouseUp( MouseEvent event ) {// TODO: decent implementation} }

如您所見, ClickBehavior類包裝了一個Runnable ,該Runnable應該通過單擊觀察到的控件來觸發。 為此,第一步是驗證是否已按下鼠標左鍵,并標記觀察者已準備好觸發 。 一個簡單的mouseDown實現可能如下所示:

public static final int LEFT_BUTTON = 1; [...] public void mouseDown( MouseEvent event ) {if( event.button == LEFT_BUTTON ) {armed = true;} }

第二步是檢查是否在受監視的控件范圍內發生了隨后的mouseUp事件。 如果這樣(并準備好),則語義條件已經滿足并且可以觸發該動作2

public void mouseUp( MouseEvent event ) {if( armed && inRange( event ) ) {action.run();}armed = false; }static boolean inRange( MouseEvent event ) {Point size= ( ( Control )event.widget ).getSize();return event.x >= 0 && event.x <= size.x&& event.y >= 0&& event.y <= size.y; }

此實現足以處理例如org.eclipse.widgets.Label上的“按鈕單擊”事件,如以下代碼片段所示:

final Shell shell = [...]; Label label = new Label( shell, SWT.NONE ); label.setText( "Click me!" ); label.addMouseListener(new ClickBehavior( new Runnable() {@Overridepublic void run() {MessageBox box = new MessageBox( shell );box.setMessage( "Label was clicked." );box.setText( "Message" );box.open();}} ) );

瞧,這是在運行時的樣子:

包起來

如上所述,SWT省略通用鼠標單擊實現是有充分的理由的。 給出的示例顯示了如何為自定義窗口小部件實現簡單的按鈕單擊語義。 但是,還有更多需要考慮的地方。 小部件通常會在視覺上對鼠標按下做出反應 ,例如,表明它們已準備好觸發。

因此,自定義窗口小部件代碼很快就被炸毀,并趨于模糊與事件相關的各種責任。 為了將事件語義與視覺效果代碼完全區分開,我通常在小助手類中提取第一個。 我什至有一個用于ButtonClick -click事件的通用版本,稱為ButtonClick ,它是Xiliary P2存儲庫的SWT實用程序功能的一部分。

如果所有與鼠標單擊相關的內容引起了對鼠標單擊的實際應用的需求:如何使用下面的社交按鈕共享知識?

  • 細心的讀者可能已經意識到,我忽略了滑塊的拖動區域,該區域也增加了選擇語義。 這是因為它與單擊行為不匹配,并且將超出本討論的范圍。 ?
  • 值得一提的是,現實世界中的實現應確保在action.run()期間拋出運行時異常的情況下,也重置武裝標志。 ?
  • 翻譯自: https://www.javacodegeeks.com/2014/12/swt-mouse-click-implementation.html

    總結

    以上是生活随笔為你收集整理的SWT鼠标单击实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。