java - 从行边距中选择行 - mouseDragged 事件跟不上选择处理

标签 java swing awt

我正在构建一个文本编辑器,并尝试添加使用行号边距选择行的功能。我当前的方法是使用 mouseDragged 来更新所选行。当进行缓慢的鼠标移动时,这工作得很好,但是当进行更快的移动时,选择无法跟上并且只是停止更新。

我尝试使用新线程来处理所选范围,但它仍然卡住。

更新:将鼠标范围更改为两个值(最小/最大)而不是每行 - 这解决了问题

mouseDragged方法

private void mouseDragged(MouseEvent event, Mouse mouse) {
    int eventY = event.getY();
    int currentLineNumber = this.getLineNumber(eventY);

    mouse.endRange(currentLineNumber);

    if(mouse.getRange()[0] != mouse.getRange()[1]) {
        this.selectLineRange(mouse);
    } else {
        this.selectLineForOffset(eventY);
    }
}

鼠标状态

private class Mouse {
    int mouseY = -1;
    int[] range = new int[2];

    private void resetMouse(boolean resetBeginLine) {
        this.mouseY = -1;
        this.range = new int[2];
    }

    void endRange(int lineNumber) {
        range[1] = lineNumber;
    }

    void beginRange(int lineNumber) {
        range[0] = lineNumber;
    }

    int[] getRange() {
        return range;
    }

    boolean validRange() {
        return ((range[0] | range[1]) > 0);
    }
}

最后是选择行范围方法

private void selectLineRange(Mouse mouse) {
        if (mouse.validRange()) {
            int minLine = Math.min(mouse.getRange()[0], mouse.getRange()[1]);
            int maxLine = Math.max(mouse.getRange()[0], mouse.getRange()[1]);;

            Element root = editor.getDocument().getDefaultRootElement();
            int startSelection = root.getElement(minLine).getStartOffset();
            int endSelection = root.getElement(maxLine).getEndOffset();

            //editor.setCaretPosition(mouse.mouseDirection == Direction.UP ? startSelection : endSelection - 1);
            editor.select(startSelection, Math.max(endSelection - 1, 0));
        }
    }

最佳答案

在同一个函数中拥有既了解鼠标概念又了解文档概念的代码将会导致灾难。将代码拆分为多个函数,每个函数在不同的抽象级别上工作。

您所需要的只是知道鼠标在哪个 Y 处按下,以及鼠标当前在哪个 Y 处。由此,您可以在任何给定时刻重新计算所选行的范围。首先,将视口(viewport) Y 转换为工作空间 Y,然后将工作空间 Y 转换为行号,瞧,您就得到了每个行号。

此:selectedLineNumbers.add(currentLineNumber); 假定您将在每一行上收到一个鼠标事件。如果您不这样做,那么您的列表将包含空白。而且您不会,因为当您移动鼠标太快时,鼠标事件会很少且相距很远。这就是为什么您的 selectedLineNumbers 应该是一个范围,(startingLineNumber,endingLineNumber)而不是不同行号的列表。

关于java - 从行边距中选择行 - mouseDragged 事件跟不上选择处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42260814/

相关文章:

java - 使用 JScrollPane 后 JTable 消失

java - 在 Mac 上使用更新的类覆盖 Java 系统库

java - 如何更改 Java 中按下/单击/选择按钮的外观?

java - SwingWorker 不执行 doInBackGround()

java - 将图像插入 JScrollPane 并将 JScrollPane 插入 JFrame

java - (Java) 表达式的类型必须是数组类型,但它解析为对象错误

java - java 逐行读取

java - 使用 ARM64 musl-libs 编译 OpenJDK 9 及更高版本

java - 如何指示 JComboBox 正在加载值?

java - 从 3 个点生成 AffineTransform