テキストエディタを構築していて、ライン番号マージンを使ってラインを選択する機能を追加しようとしています。私の現在のアプローチは、mouseDraggedを使って選択された行を更新することです。これは、マウスの動きが遅い場合はうまく動作しますが、動きが速い場合は選択が追いつかず、更新が停止します。ラインマージンからラインを選択 - 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));
}
}
エディタはスクロールしませんか?ケースをどのように処理しますか?テキストをスクロールする必要がある場合、マウスが最終的な位置に到達する可能性があります。 – thst
他人についてはわかりませんが、コード、問題、質問を理解するには、有効な[mcve]が必要です。 –
@thstエディタはスクロールします。それが私が取り組まなければならない別の問題です。私はこれをどのように処理したいのか分かりませんでした。私は、マウスに行番号のマージンの境界が渡されても、選択肢を継続的に更新するために別のスレッドが必要だが、詳細は分からなかった。 –