SWT鼠标单击实现
最近,我做了一些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í)?
翻譯自: https://www.javacodegeeks.com/2014/12/swt-mouse-click-implementation.html
總結(jié)
- 上一篇: 电脑cpu一直温度高(电脑cpu温度一直
- 下一篇: 如何使用Callable和FutureT