在JTextComponent中禁用双击选择



通常,双击文本组件时,会选择整个单词。

我想禁用这个单词的选择,但仍然保持点击和拖动选择它的能力。

示例:"敏捷的棕色狐狸跳过懒惰的狗"

当我点击并从"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);

我想您可以注册自己的MouseListenerMouseAdapter,并检查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),它是对setCaretPositionmoveCaretPosition 的委托调用

@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
            }
        }
    });

相关内容

  • 没有找到相关文章

最新更新