JTextPane с сенсорным интерфейсом

#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); Это, по-видимому, работаетпока. Спасибо за помощь 🙂