Доступ к линии после того, как она нарисована - PullRequest
0 голосов
/ 19 марта 2012

Этот вопрос уже задавался кем-то другим, но у меня нет четкого ответа.

Я создал класс Line и метод рисования для него, чтобы нарисовать линию.

Я хочу знать, как мы можем получить доступ к линии после того, как она нарисована.У меня есть два JLabels, которые отмечают конечные точки линии.Так что я могу изменить размер строки, используя их, но я не могу выбрать эту строку.

Я также попытался создать панель вокруг линии и добавил к ней mouseListener, но она не очень эффективна.

Кто-нибудь может предложить более разумный способ?

Вотконструктор для линии

 public Line(Point a,Point b,JLabel l1,JLabel l2){
    this(a,b);
    this.l1=l1;
    this.l2=l2;
    this.addMouseListener(this);
 }

Ответы [ 4 ]

2 голосов
/ 19 марта 2012

@ StanislavL имеет правильную идею использовать метод contains() класса, который реализует Shape, но @Catalina отмечает, что это всегда ложно для Line2D. Вместо этого визуализируйте конечные точки, используя Shape с непустой границей. Например, GraphPanel использует Rectangle, чтобы разрешить перетаскивание каждой конечной точки.

GraphPanel

2 голосов
/ 19 марта 2012

Создать Line2D объект.Затем используйте BasicStroke и определите желаемую толщину линии.Используйте метод

public Shape createStrokedShape(Shape s)

, чтобы получить штриховую форму линии.Используйте contains() метод Линии Shape, чтобы проверить, находится ли точка щелчка на линии.

0 голосов
/ 19 марта 2012

Вы можете расширить свою строку из JComponent или одного подходящего класса-преемника (например, JButton)

Затем переопределить функцию содержащий;

Shape shape;   
public boolean contains(int x, int y) {   
    // If the button has changed size, make a new shape object.   
    if (shape == null || !shape.getBounds().equals(getBounds())) {   
        shape = new Line2D.Float(a.x, a.y, b.x, b.y);   
    }   
    return shape.contains(x, y);   
}

Примечание: параметры конструктора Line2D.Float могутбыть неупорядоченным, я написал это по памяти.

0 голосов
/ 19 марта 2012

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

public void mousePressed(MouseEvent ev) 
{
  double TOLERANCE = 5;   // Small tolerance measured in pixels

  if (ev.getClickCount() == 1)
  {
    Point cursor = ev.getPoint();

    if (Math.abs(cursor.x - a.x) < TOLERANCE && 
        Math.abs(cursor.y - a.y) < TOLERANCE)
    {
      // Clicked on the first point
    }
    else if (Math.abs(cursor.x - b.x) < TOLERANCE && 
             Math.abs(cursor.y - b.y) < TOLERANCE)
    {
      // Clicked on the second point
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...