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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SWT鼠标单击实现

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

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

SWT鼠標(biāo)請點(diǎn)擊

事件驅(qū)動(dòng)的窗口小部件工具箱通常區(qū)分低級(jí)事件和語義事件。 低電平事件表示窗口系統(tǒng)出現(xiàn)或低電平輸入。 鼠標(biāo)和鍵盤輸入基本上屬于此組。

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

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

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

顯然,沒有人愿意為每個(gè)控件區(qū)域上的鼠標(biāo)單擊事件添加特定的偵聽器。 這是更舒適的基礎(chǔ)上那些低級(jí)別的賽事有一個(gè)語義抽象,對(duì)關(guān)鍵點(diǎn)或興趣通知觀察者1

單擊按鈕以自定義小部件

那么,按鈕單擊事件實(shí)現(xiàn)在自定義SWT小部件的(子)組件上看起來如何? 例如,考慮一個(gè)由幾個(gè)標(biāo)簽Composite ,無論出于何種原因,其中一個(gè)標(biāo)簽都應(yīng)作為動(dòng)作觸發(fā)。

點(diǎn)擊行為可以通過在SWT的類型化事件抽象之上運(yùn)行一個(gè)小的動(dòng)作包裝器來實(shí)現(xiàn)。 它可以實(shí)現(xiàn)/擴(kuò)展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類包裝了一個(gè)Runnable ,該Runnable應(yīng)該通過單擊觀察到的控件來觸發(fā)。 為此,第一步是驗(yàn)證是否已按下鼠標(biāo)左鍵,并標(biāo)記觀察者已準(zhǔn)備好觸發(fā) 。 一個(gè)簡單的mouseDown實(shí)現(xiàn)可能如下所示:

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

第二步是檢查是否在受監(jiān)視的控件范圍內(nèi)發(fā)生了隨后的mouseUp事件。 如果這樣(并準(zhǔn)備好),則語義條件已經(jīng)滿足并且可以觸發(fā)該動(dòng)作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; }

此實(shí)現(xiàn)足以處理例如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();}} ) );

瞧,這是在運(yùn)行時(shí)的樣子:

包起來

如上所述,SWT省略通用鼠標(biāo)單擊實(shí)現(xiàn)是有充分的理由的。 給出的示例顯示了如何為自定義窗口小部件實(shí)現(xiàn)簡單的按鈕單擊語義。 但是,還有更多需要考慮的地方。 小部件通常會(huì)在視覺上對(duì)鼠標(biāo)按下做出反應(yīng) ,例如,表明它們已準(zhǔn)備好觸發(fā)。

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

如果所有與鼠標(biāo)單擊相關(guān)的內(nèi)容引起了對(duì)鼠標(biāo)單擊的實(shí)際應(yīng)用的需求:如何使用下面的社交按鈕共享知識(shí)?

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

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。