1

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

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

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

当我单击并从“The”的开头拖动到“dog”的结尾时,文本被选中。但是,当我双击“棕色”时,“棕色”未被选中,可以执行不同的操作。

有谁知道我怎么能做到这一点?

4

5 回答 5

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);
于 2012-02-29T06:05:26.897 回答
2

我想您可以注册自己的或MouseListenerMouseAdapter检查. 如果它等于,则吞下该事件,否则将事件处理委托给超类(例如)。getClickCount()MouseEvent2super.mouseClicked(...)

于 2012-02-28T17:23:53.067 回答
1

另一种方法是用不执行任何操作的操作替换 selectWord 操作:

    textComponent.getActionMap().put(DefaultEditorKit.selectWordAction, 
            new TextAction(DefaultEditorKit.selectWordAction) {
                public void actionPerformed(ActionEvent e) {
                    // DO NOTHING
                }
            });

如果您对单词的定义与默认的 Swing 不同,您还可以使用此技术来更改 selectWord 操作的行为。

于 2014-10-31T17:32:57.100 回答
0

你可以像这样实现双击:

setCaretPosition(0);

文档:这指向不推荐使用的方法select(int,int),它是一个委托调用setCaretPosition,然后moveCaretPosition

于 2012-02-28T17:26:21.230 回答
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
            }
        }
    });
于 2017-08-17T14:36:00.640 回答