#java #touch #highlighting #mt4j
#java #коснитесь #выделение #mt4j
Вопрос:
Я разрабатываю приложение для Windows 7 на основе Touch, используя настройку клиент-сервер tuio и библиотеку touch, которая расширяет мультитач 4 java. Одна из функций, с которой я борюсь, — включить выделение текста при использовании touch. Я отображаю простой текстовый файл, используя JTextPane для отображения текста, выделение выполняется с помощью перетаскивания. Я получаю позицию щелчка, где начинается событие перетаскивания, а затем, когда оно останавливается, и пытаюсь преобразовать эти координаты в пространство текстовой панели, но я получаю значения, отличные от тех, которые я должен иметь, обычно перед фактическим текстом.
Код, который я использую для отображения документа, следующий:
//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) amp;amp; 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);
передавая вместо этого ссылку на фактический компонент и получая местоположение, когда это необходимо.
Ответ №1:
попробуйте вместо
Point calcStart = new Point(start.x - compPosition.x, start.y - compPosition.y);
чтобы использовать
Point calcStart = new Point(start.x, start.y);
интересно, чем это закончится, так что дайте нам некоторое значение того, что вы получаете
Комментарии:
1. Я попробовал это, и, как ни странно, это дало тот же результат… итак, я предполагаю, что каким-то образом местоположение было установлено на (0,0), что может иметь смысл, поскольку я инициализирую процессор жестов при создании компонента, и его начальная позиция равна 0,0, только после этого я перемещаю его туда, куда я хочу. Теперь я передаю ссылку на компонент в процессор жестов и ищу местоположение, когда оно мне нужно: Point calcStart = new Point(start.x — this.component.getLocation().x, start.y — this.component.getLocation().y); Это, по-видимому, работаетпока. Спасибо за помощь 🙂