tuio クライアント サーバー セットアップと、マルチタッチ 4 Java を拡張するタッチ ライブラリを使用して、タッチ ベースの Windows 7 アプリを開発しています。私が苦労している機能の 1 つは、タッチの使用時にテキストの強調表示を有効にすることです。テキストを表示するために JTextPane を使用して単純な txt ファイルを表示します。強調表示はドラッグ アクションによって行われます。ドラッグイベントが開始されたクリック位置を取得し、停止してそれらの座標をテキストパネルのスペースに変換しようとしましたが、通常は実際のテキストの前に、必要な値とは異なる値を取得します。
ドキュメントを表示するために使用しているコードは次のとおりです。
//Create the JDialog that is the container of it
window = new JDialog(parent);
window.setUndecorated(true);
//Create the JTextPane
text = new JTextPane();
text.setPage(newFile.toURI().toURL());
text.setEditable(false);
text.setHighlighter(null);
//ScrollPane that will be used to display the text
JScrollPane scroll = new JScrollPane(text);
scroll.setPreferredSize(new Dimension(500, 700));
window.getContentPane().add(scroll, BorderLayout.CENTER);
window.pack();
window.setVisible(true);
window.validate();
JDialog の親は、アプリで使用されるメインの表示コンポーネントです。
ドラッグは次のように処理されます。
@Override
public boolean processGestureEvent(GestureEvent ge) {
if((ge instanceof DragEvent) && this.component.isHighlight())
{
tapCount=0;
if(this.component.isHighlight())
{
//do highlighting
DragEvent drag = (DragEvent) ge;
switch (drag.getId()) {
case GestureEvent.GESTURE_STARTED:
Point start = drag.getFrom();
Point calcStart = new Point(start.x - compPosition.x, start.y - compPosition.y);
startPos = this.textDisplay.viewToModel(calcStart);
break;
case GestureEvent.GESTURE_ENDED:
Point end = drag.getTo();
Point calcEnd = new Point(end.x - compPosition.x, end.y - compPosition.y);
endPos = this.textDisplay.viewToModel(calcEnd);
System.out.println("I have this positions:" + startPos + "/" + endPos);
System.out.println("Should have " + this.textDisplay.getSelectionStart() + "/" + this.textDisplay.getSelectionEnd());
System.out.println("And the text is: " + this.textDisplay.getText().substring(startPos, endPos));
break;
case GestureEvent.GESTURE_CANCELED:
startPos = 0;
endPos = 0;
break;
}
}
return true;
}
compPosition は、テキストペインを保持する JDialog の位置です。マウスでのタッチをシミュレートしているため、マウスを使用したテキストペインの組み込みの強調表示機能から得られる強調表示の正しいテキスト位置。
JDialog と JScroll ペインが何らかの形で変換をゆがめているために問題が発生していますか? タッチから取得したポイントの座標系は、原点が画面の左上隅にあり、テキスト ペインの座標系の原点が同じ左上隅にあります。
どうすれば問題を解決できるかについてのアイデアはありますか? 任意の提案をいただければ幸いです。
LE: コンポーネントを初期化したときにジェスチャ プロセッサを追加していて、その位置が (0,0) だったという点で、私は何か間違ったことをしていました。その後、必要な場所に移動しました。
位置計算を次のように変更しました。
Point calcStart = new Point(start.x - this.component.getLocation().x, start.y -this.component.getLocation().y);
代わりに実際のコンポーネントへの参照を渡し、必要に応じて場所を取得します。