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實用程序功能的一部分。
如果所有與鼠標單擊相關的內容引起了對鼠標單擊的實際應用的需求:如何使用下面的社交按鈕共享知識?
翻譯自: https://www.javacodegeeks.com/2014/12/swt-mouse-click-implementation.html
總結
- 上一篇: 电脑cpu一直温度高(电脑cpu温度一直
- 下一篇: 凯特盒子动态换肤快捷键(lol凯特盒子按