2012-02-28 81 views
1

通常,當您雙擊文本組件時,將選擇整個單詞。在JTextComponent中禁用雙擊選擇

我想禁用這個單詞的選擇,但仍然保持點擊和拖動來選擇它的能力。

例:「敏捷的棕色狐狸跳過懶狗」

當我點擊,並從「的」在2002年底的「狗」,選定文本的開始拖累。但是,當我雙擊「棕色」時,「棕色」未被選中並且可以執行不同的動作。

有誰知道我該如何做到這一點?

+1

有兩個正確的方式如何確定DOUBLE_CLICK,請編輯與[SSCCE(http://sscce.org/) – mKorbel 2012-02-28 17:23:01

+0

@mKorbel感到很抱歉,我更新了你的問題我的帖子有一個例子。 – 2012-03-01 15:48:30

回答

2

凡編輯爲JTextComponent的實例

DefaultCaret c=new DefaultCaret() { 
    public void mouseClicked(MouseEvent e) { 
     int nclicks = SwingUtilities2.getAdjustedClickCount(getComponent(), e); 
     if (! e.isConsumed() && 
       SwingUtilities.isLeftMouseButton(e) && 
       nclicks == 2 
       && SwingUtilities2.canEventAccessSystemClipboard(e)) { 
      return; 
     } 

     super.mouseClicked(e); 
    } 
    public void mousePressed(MouseEvent e) { 
     int nclicks = SwingUtilities2.getAdjustedClickCount(getComponent(), e); 
     if (! e.isConsumed() && 
       SwingUtilities.isLeftMouseButton(e) && 
       nclicks == 2 
       && SwingUtilities2.canEventAccessSystemClipboard(e)) { 
      return; 
     } 
     super.mousePressed(e); 
    } 
}; 
c.setBlinkRate(edit.getCaret().getBlinkRate()); 
edit.setCaret(c); 
+0

偉大的,卓越的知識,你是King_of_JTextComponents,只有+1 – mKorbel 2012-02-29 09:03:48

+0

謝謝。在實現基於java/swing的MS Word之類的編輯器之後,大量類似的問題已經有了解決方案。 – StanislavL 2012-02-29 09:24:31

+0

我試着實現這個代碼,但無法找到SwingUtilities2。我正在使用jre1.6.0_05。我在網上查找SwingUtilities2,大多數帖子都建議不要依賴它。有沒有其他解決方案或解決方法?謝謝。 – 2012-03-01 15:24:41

2

我想你可以註冊自己的MouseListenerMouseAdapter並檢查MouseEvent的點擊數(即getClickCount())。如果它等於2,吞下事件,否則委託事件處理給超類(例如super.mouseClicked(...))。

+2

「燕子」是指event.consume()。 – 2012-02-28 17:44:22

0

你可以實現雙擊這樣的:

setCaretPosition(0); 

Documentation:這點在自嘲方法select(int,int)這是一個代表呼籲setCaretPosition然後moveCaretPosition

1

另一種方法是替換selectWord動作通過一個動作是什麼也不做:

textComponent.getActionMap().put(DefaultEditorKit.selectWordAction, 
      new TextAction(DefaultEditorKit.selectWordAction) { 
       public void actionPerformed(ActionEvent e) { 
        // DO NOTHING 
       } 
      }); 

您也可以使用此TECHNIC改變selectWord操作的行爲,如果你的一個單詞的定義是不是默認的Swing不同。

0

@Loic您的回答爲我工作。 但是,如果滿足某些條件,我仍然希望啓用單詞選擇。這是我如何做的:

Action defaultSelectWordAction = textComponent.getActionMap().get(DefaultEditorKit.selectWordAction); 

textComponent.getActionMap().put(DefaultEditorKit.selectWordAction, new TextAction(DefaultEditorKit.selectWordAction) { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (conditionFulfilled()) { 
       defaultSelectWordAction.actionPerformed(e); 
      } else { 
       // DO NOTHING 
      } 
     } 
    });