通常,当您双击文本组件时,将选择整个单词。在JTextComponent中禁用双击选择
我想禁用这个单词的选择,但仍然保持点击和拖动来选择它的能力。
例:“敏捷的棕色狐狸跳过懒狗”
当我点击,并从“的”在2002年底的“狗”,选定文本的开始拖累。但是,当我双击“棕色”时,“棕色”未被选中并且可以执行不同的动作。
有谁知道我该如何做到这一点?
通常,当您双击文本组件时,将选择整个单词。在JTextComponent中禁用双击选择
我想禁用这个单词的选择,但仍然保持点击和拖动来选择它的能力。
例:“敏捷的棕色狐狸跳过懒狗”
当我点击,并从“的”在2002年底的“狗”,选定文本的开始拖累。但是,当我双击“棕色”时,“棕色”未被选中并且可以执行不同的动作。
有谁知道我该如何做到这一点?
凡编辑为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);
伟大的,卓越的知识,你是King_of_JTextComponents,只有+1 – mKorbel 2012-02-29 09:03:48
谢谢。在实现基于java/swing的MS Word之类的编辑器之后,大量类似的问题已经有了解决方案。 – StanislavL 2012-02-29 09:24:31
我试着实现这个代码,但无法找到SwingUtilities2。我正在使用jre1.6.0_05。我在网上查找SwingUtilities2,大多数帖子都建议不要依赖它。有没有其他解决方案或解决方法?谢谢。 – 2012-03-01 15:24:41
我想你可以注册自己的MouseListener
或MouseAdapter
并检查MouseEvent
的点击数(即getClickCount()
)。如果它等于2
,吞下事件,否则委托事件处理给超类(例如super.mouseClicked(...)
)。
“燕子”是指event.consume()。 – 2012-02-28 17:44:22
你可以实现双击这样的:
setCaretPosition(0);
Documentation:这点在自嘲方法select(int,int)
这是一个代表呼吁setCaretPosition
然后moveCaretPosition
另一种方法是替换selectWord动作通过一个动作是什么也不做:
textComponent.getActionMap().put(DefaultEditorKit.selectWordAction,
new TextAction(DefaultEditorKit.selectWordAction) {
public void actionPerformed(ActionEvent e) {
// DO NOTHING
}
});
您也可以使用此TECHNIC改变selectWord操作的行为,如果你的一个单词的定义是不是默认的Swing不同。
@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
}
}
});
有两个正确的方式如何确定DOUBLE_CLICK,请编辑与[SSCCE(http://sscce.org/) – mKorbel 2012-02-28 17:23:01
@mKorbel感到很抱歉,我更新了你的问题我的帖子有一个例子。 – 2012-03-01 15:48:30