通常,双击文本组件时,会选择整个单词。
我想禁用这个单词的选择,但仍然保持点击和拖动选择它的能力。
示例:"敏捷的棕色狐狸跳过懒惰的狗"
当我点击并从"the"的开头拖动到"dog"的末尾时,文本就被选中了。但是,当我双击"棕色"时,"棕色"不会被选中,可以执行不同的操作。
有人知道我怎样才能做到这一点吗?
其中edit是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);
我想您可以注册自己的MouseListener
或MouseAdapter
,并检查MouseEvent
的点击次数(即getClickCount()
)。如果它等于2
,吞下事件,否则将事件处理委托给超类(例如super.mouseClicked(...)
)。
另一种方法是用一个什么都不做的操作替换selectWord操作:
textComponent.getActionMap().put(DefaultEditorKit.selectWordAction,
new TextAction(DefaultEditorKit.selectWordAction) {
public void actionPerformed(ActionEvent e) {
// DO NOTHING
}
});
如果你对一个单词的定义与默认的Swing不同,你也可以使用这种技术来改变selectWord操作的行为。
您可以实现如下双击:
setCaretPosition(0);
文档:这指向弃用方法select(int,int)
,它是对setCaretPosition
和moveCaretPosition
的委托调用
@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
}
}
});