Spec-Zone .ru
спецификации, руководства, описания, API
|
Чтобы позволить пользователю взаимодействовать с графикой, Вы выводите на экран, Вы должны быть в состоянии определить, когда пользователь щелкает по одному из них. hit
метод Graphics2D
class обеспечивает способ легко определить, произошел ли щелчок мышью по детали Shape
contains
на Shape
определить, был ли щелчок в пределах границ Shape
.
Если Вы используете примитивный текст, можно выполнить простое тестирование хита, получая схему Shape
это соответствует тексту и затем вызову hit
или contains
с этим Shape
. Поддержка редактирования текста требует намного более сложного тестирования хита. Если Вы хотите позволить пользователю редактировать текст, следует обычно использовать один из Swing доступные для редактирования текстовые компоненты. Если Вы работаете с примитивным текстом и используете TextLayout
TextLayout
выполнять тестирование хита на редактирование текста. Для получения дополнительной информации см. текст главы и Шрифты в TextLayout
выполнять простое тестирование хита.
Этот апплет позволяет пользователю перетаскивать a Shape
вокруг в пределах окна апплета. Shape
перерисовывается в каждом расположении мыши, чтобы обеспечить обратную связь, поскольку пользователь перетаскивает это.
Если Вы не видите, что апплет работает, Вы должны установить
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
.
Это приложение иллюстрирует тестирование хита при рисовании каре значения по умолчанию везде, где пользователь щелкает TextLayout
, как показано в следующем числе.
Если Вы не видите, что апплет работает, Вы должны установить
содержит полный код для этого апплета.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(); }