簡體   English   中英

Java SWT:在mousDown()中打開對話框時不會觸發mouseUp()

[英]Java SWT: mouseUp() is not fired when opening a Dialog in mousDown()

如果在StyledText中單擊某個字符串,我的程序將打開一個對話框。 因此,在mouseDown()中,我首先要檢查已單擊的內容,然后打開一個對話框。 這可行。 關閉對話框后,不會調用mouseUp()。 這將導致在移動光標時選擇文本,就像用戶嘗試選擇文本一樣。 我可以通過執行以下任務來重現該行為:

  • 單擊StyledText中的字符串->對話框打開
  • 關閉對話框
  • 無需單擊即可移動鼠標->文本被標記為選中狀態

在我的用例中,不需要觸發mouseUp()。 但是,如果不觸發它,則表示操作系統假定鼠標按鈕仍處於按下狀態並選擇了文本。 如果對話框打開並奪走焦點,這可能是正確的行為。 但是,肯定沒有辦法告訴系統鼠標按鈕已被釋放。

myStlyedText.addMouseListener(new MouseListener() {
    @Override
    public void mouseUp(MouseEvent e) {
        System.out.println("MouseUp is fired");
    }

    @Override
    public void mouseDown(MouseEvent e) {
        if (certainStringClicked()) {
            openDialog();
        }
    }

    @Override
    public void mouseDoubleClick(MouseEvent e) {}
});

我可以驗證未調用mouseUp(),因為未在控制台上打印“ MousUp被觸發”。

處理此問題的最佳方法是什么? 我已經嘗試將焦點放在另一個小部件(setFocus()和forceFocus())上,但這沒有幫助。

我試圖自己打電話給mouseUp:

Event event = new Event();
event.type = SWT.MouseUp;
event.button = 1;
MouseEvent mouseUpEvent = new MouseEvent(event);
mouseUp(mouseUpEvent);

這導致出現消息“已觸發MousUp”,但是選擇問題仍然存在。

我可以將代碼移到mouseUp()方法中,但這實際上並不是我想要的。 該對話框應立即出現。 我還可以做些什么?

嘗試添加myStlyedText.notifyListeners(SWT.MouseUp, null); 您的代碼。 它應該工作。

myStlyedText.addMouseListener(new MouseListener() {
    @Override
    public void mouseUp(MouseEvent e) {
        System.out.println("MouseUp is fired");
    }

    @Override
    public void mouseDown(MouseEvent e) {
        if (certainStringClicked()) {
            myStlyedText.notifyListeners( SWT.MouseUp, null );
            openDialog();
        }
    }

    @Override
    public void mouseDoubleClick(MouseEvent e) {}
});

這不是一個好的解決方案 但這對於某些人來說可能是一種解決方法。

可以在Dialog的構造函數中將SWT.MODELESS添加到外殼樣式中,該構造函數擴展了jface.dialog.Dialog

setShellStyle(SWT.MODELESS);

MouseUp()獲取立即被解雇。

這里的問題是,盡管一個對話框已經打開,但仍可以通過單擊文本來打開許多對話框。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM