通常,当您双击文本组件时,会选择整个单词。
我想禁用这个单词的选择,但仍然保持点击和拖动来选择它的能力。
示例:“敏捷的棕色狐狸跳过懒惰的狗”
当我单击并从“The”的开头拖动到“dog”的结尾时,文本被选中。但是,当我双击“棕色”时,“棕色”未被选中,可以执行不同的操作。
有谁知道我怎么能做到这一点?
通常,当您双击文本组件时,会选择整个单词。
我想禁用这个单词的选择,但仍然保持点击和拖动来选择它的能力。
示例:“敏捷的棕色狐狸跳过懒惰的狗”
当我单击并从“The”的开头拖动到“dog”的结尾时,文本被选中。但是,当我双击“棕色”时,“棕色”未被选中,可以执行不同的操作。
有谁知道我怎么能做到这一点?
在哪里编辑是 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
检查. 如果它等于,则吞下该事件,否则将事件处理委托给超类(例如)。getClickCount()
MouseEvent
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
}
}
});