禁用JTextComponent中的双击选择

时间:2012-02-28 17:20:21

标签: java swing double-click caret jtextcomponent

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

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

示例:“快速的棕色狐狸跳过懒狗”

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

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

5 个答案:

答案 0 :(得分:2)

我想您可以注册自己的MouseListenerMouseAdapter并检查MouseEvent的点击次数(即getClickCount())。如果它等于2,则吞下事件,否则将事件处理委托给超类(例如super.mouseClicked(...))。

答案 1 :(得分: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);

答案 2 :(得分:1)

另一种方法是用无效的动作替换selectWord动作:

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

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

答案 3 :(得分:0)

你可以像这样实现双击:

setCaretPosition(0);

Documentation:这指向弃用方法select(int,int),该方法是setCaretPosition的委托调用,然后是moveCaretPosition

答案 4 :(得分:0)

@Loic你的回答对我有用。 但是,如果满足某个条件,我仍然希望启用单词选择。我是这样做的:

var $doc = $(document),
    $win = $(window),
    $svg = $('svg').drawsvg(),
    max = $doc.height() - $win.height();
$win.on('scroll', function() {
  var p = $win.scrollTop() / max;
  $svg.drawsvg('progress', p);
});