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