5

jtextareaからビューポートの開始線とビューポートの終了線を与える関数を探しています。以下のコードは正常に機能します。ただし、jtextareaの行数が多すぎる場合、たとえば10,000行の場合、カーソルの応答が非常に遅くなります。それを引き起こしている線を絞り込みました、それは、

 startLine = getRow(topLeft, editorTextArea) - 1; //editorTextArea is jtextarea name
 endLine = getRow(bottomRight, editorTextArea);

すべてのkeyPressEventでstartAndEndLine()を呼び出しています

誰かが私に効率的なより良いコードを提案できますか?

private void startAndEndLine() {

    Rectangle r = editorTextArea.getVisibleRect();
    Point topLeft = new Point(r.x, r.y);
    Point bottomRight = new Point(r.x + r.width, r.y + r.height);

    try {
        startLine = getRow(topLeft, editorTextArea) - 1;
        endLine = getRow(bottomRight, editorTextArea);
    } catch (Exception ex) {
       // System.out.println(ex);
    }        
}


 public int getViewToModelPos(Point p, JTextComponent editor) {
    int pos = 0;
    try {
        pos = editor.viewToModel(p);
    } catch (Exception ex) {
    }
    return pos;
 }


public int getRow(Point point, JTextComponent editor) {
    int pos = getViewToModelPos(point, editor);
    int rn = (pos == 0) ? 1 : 0;
    try {
        int offs = pos;
        while (offs > 0) {
            offs = Utilities.getRowStart(editor, offs) - 1;
            rn++;
        }
    } catch (BadLocationException e) {
        System.out.println(e);
    }
    return rn;
}
4

1 に答える 1

1

これは、この質問Java: column number and line number of cursor's current position ... You gotta love this site ;)からの JigarJoshi による解決策に基づいています。

protected int getLineNumber(int modelPos) throws BadLocationException {

    return textArea.getLineOfOffset(modelPos) + 1;

}

Rectangle viewRect = scrollPane.getViewport().getViewRect();

Point startPoint = viewRect.getLocation();
int pos = textArea.viewToModel(startPoint);

try {

    int startLine = getLineNumber(pos);

    Point endPoint = startPoint;
    endPoint.y += viewRect.height;

    pos = textArea.viewToModel(endPoint);
    int endLine = getLineNumber(pos);

    System.out.println(startLine + " - " + endLine);

} catch (BadLocationException exp) {
}

これは完全に正確というわけではありませんが、出発点となります。

于 2012-08-21T20:58:56.477 に答える