Spec-Zone .ru
спецификации, руководства, описания, API
След: 2-D Графика
Урок: Усовершенствованные Темы в Java2D
Поддержка Взаимодействия с пользователем
Домашняя страница > 2-D Графика > Усовершенствованные Темы в Java2D

Поддержка Взаимодействия с пользователем

Чтобы позволить пользователю взаимодействовать с графикой, Вы выводите на экран, Вы должны быть в состоянии определить, когда пользователь щелкает по одному из них. hit метод Graphics2D class обеспечивает способ легко определить, произошел ли щелчок мышью по детали Shape объект. Альтернативно можно получить расположение щелчка мышью и вызова contains на Shape определить, был ли щелчок в пределах границ Shape.

Если Вы используете примитивный текст, можно выполнить простое тестирование хита, получая схему Shape это соответствует тексту и затем вызову hit или contains с этим Shape. Поддержка редактирования текста требует намного более сложного тестирования хита. Если Вы хотите позволить пользователю редактировать текст, следует обычно использовать один из Swing доступные для редактирования текстовые компоненты. Если Вы работаете с примитивным текстом и используете TextLayout class, чтобы управлять формированием и расположением текста, можно также использовать TextLayout выполнять тестирование хита на редактирование текста. Для получения дополнительной информации см. текст главы и Шрифты в Java 2D™ Руководство Программиста или см. пример HitTestSample ниже, который использует a TextLayout выполнять простое тестирование хита.

Пример: ShapeMover

Этот апплет позволяет пользователю перетаскивать a Shape вокруг в пределах окна апплета. Shape перерисовывается в каждом расположении мыши, чтобы обеспечить обратную связь, поскольку пользователь перетаскивает это.


Отметьте:  

Если Вы не видите, что апплет работает, Вы должны установить выпуск 6 (или позже) Java Комплект разработчика SE (JDK).


ShapeMover.java содержит полный код для этого апплета.

contains метод вызывают, чтобы определить, является ли курсор в пределах границ прямоугольника, когда мышью щелкают. Если это, расположение прямоугольника обновляется.

public void mousePressed(MouseEvent e){
    last_x = rect.x - e.getX();
    last_y = rect.y - e.getY();
    if(rect.contains(e.getX(),
        e.getY())) updateLocation(e);
    ...

public void updateLocation(MouseEvent e){
    rect.setLocation(last_x + e.getX(),
        last_y + e.getY());
    ...
    repaint();

Вы могли бы заметить ту перерисовку Shape в каждой мыши расположение является медленным, потому что заполненный прямоугольник повторно представляется каждый раз, когда это перемещается. Используя двойную буферизацию может устранить эту проблему. Если Вы будете использовать Swing, то рисунок будет двойной буферизованный автоматически; Вы не должны изменить код рендеринга вообще. Код для версии Swing этой программы SwingShapeMover.java.

Пример: HitTestSample

Это приложение иллюстрирует тестирование хита при рисовании каре значения по умолчанию везде, где пользователь щелкает TextLayout, как показано в следующем числе.


Отметьте:  

Если Вы не видите, что апплет работает, Вы должны установить выпуск 6 (или позже) Java Комплект разработчика SE (JDK).


HitTestSample.java содержит полный код для этого апплета.

mouseClicked использование метода TextLayout.hitTestChar возвратить a java.awt.font.TextHitInfo объект, который содержит расположение щелчка мышью (вставка индексируют) в TextLayout объект.

Информация, возвращенная TextLayout getAscent, getDescent, и getAdvance методы используются, чтобы вычислить расположение источника для TextLayout возразите, таким образом, это горизонтально и вертикально центрируется.

...

private Point2D computeLayoutOrigin() {
  Dimension size = getPreferredSize();
  Point2D.Float origin = new Point2D.Float();
     
  origin.x = (float) (size.width -
             textLayout.getAdvance()) / 2;   
  origin.y = 
    (float) (size.height -
             textLayout.getDescent() +
             textLayout.getAscent())/2;
  return origin;
}

...

public void paintComponent(Graphics g) {
  super.paintComponent(g);
  setBackground(Color.white);
  Graphics2D graphics2D = (Graphics2D) g;                
  Point2D origin = computeLayoutOrigin();
  graphics2D.translate(origin.getX(),
                       origin.getY());
                
  // Draw textLayout.
  textLayout.draw(graphics2D, 0, 0);
     
  // Retrieve caret Shapes for insertionIndex.
  Shape[] carets =
      textLayout.getCaretShapes(insertionIndex);
       
  // Draw the carets.  carets[0] is the strong
  // caret and carets[1] is the weak caret.   
  graphics2D.setColor(STRONG_CARET_COLOR);
  graphics2D.draw(carets[0]);                
  if (carets[1] != null) {
    graphics2D.setColor(WEAK_CARET_COLOR);
    graphics2D.draw(carets[1]);
  }       
}

...

private class HitTestMouseListener
              extends MouseAdapter {
                
    /**
     * Compute the character position of the
     * mouse click.
     */     
    public void mouseClicked(MouseEvent e) {
                
      Point2D origin = computeLayoutOrigin();
                
      // Compute the mouse click location
      // relative to textLayout's origin.
      float clickX =
          (float) (e.getX() - origin.getX());
      float clickY =
          (float) (e.getY() - origin.getY());
         
      // Get the character position of the
      // mouse click.
      TextHitInfo currentHit =
          textLayout.hitTestChar(clickX, clickY);
      insertionIndex =
          currentHit.getInsertionIndex();
            
      // Repaint the Component so the new
      // caret(s) will be displayed.
      hitPane.repaint();
    }

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Построение Сложных Форм от Примитивов Геометрии
Следующая страница: Конец Следа