2012-02-28 82 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 
      } 
     } 
    });