2016-07-11 1 views
-1

Так что у меня есть некоторые проблемы с этим. В основном, я ранее рисовал некоторые сегменты линии на JPanel, используя Graphics2D и GeneralPath, и теперь я хочу получить объект Graphics2D/GeneralPath, когда я нажимаю на него на JPanel, есть ли в этом случае я могу это сделать?Выберите графические компоненты при нажатии на JPanel

ответ

1

Я хочу, чтобы получить объект Graphics2D/GeneralPath, когда я нажимаю на него на JPanel

Вы должны держать ArrayList в Shape объект, который вы рисуете. Затем в MouseListener вы можете получить точку мыши и использовать метод Shape.contains(...), чтобы определить, был ли щелчок мыши на Shape, который вы нарисовали.

Draw On Component пример из Custom Painting Approaches демонстрирует концепцию покраски объекта из массива ArrayList, чтобы вы начали.

Edit:

Метод Shape.contains(...) не работает для строк.

Ниже приведена краткая попытка написать метод contains (...) для объекта Line2D и Point. Не уверен, насколько точно это будет в реальной жизни.

import java.awt.*; 
import java.awt.geom.*; 

class LineContains 
{ 
    public static void main(String...args) 
    { 
     Point point = new Point(10, 19); 
     Line2D.Double line = new Line2D.Double(0, 0, 10, 20); 
     boolean result = LineContains.contains(line, point); 
     System.out.println(result); 
    } 

    static boolean contains(Line2D line, Point point) 
    { 
     double[] location = new double[6]; 

     PathIterator pi = line.getPathIterator(null); 
     pi.currentSegment(location); 
     int x1 = (int)location[0]; 
     int y1 = (int)location[1]; 

     pi.next(); 
     pi.currentSegment(location); 
     int x2 = (int)location[0]; 
     int y2 = (int)location[1]; 

     double xDelta = x2 - x1; 
     double yDelta = y2 - y1; 

     double iterations = Math.max(Math.abs(xDelta), Math.abs(yDelta)); 
     double xMultiplier = xDelta/iterations; 
     double yMultiplier = yDelta/iterations; 

     for (int i = 0; i < iterations; i ++) 
     { 
      int x = (int)Math.round(x1 + (i * xMultiplier)); 
      int y = (int)Math.round(y1 + (i * yMultiplier)); 
      //System.out.println(x + " : " + y); 

      if (x == point.x 
      && y == point.y) 
       return true; 
     } 

     return false; 
    } 
} 
+0

Это не работает для меня прямо сейчас, потому что независимо от того, где я щелкнул, координаты точки всегда являются целыми значениями, и метод contains() всегда возвращает false для меня. –

+0

@LinxuanMichaelYang, выглядит как 'Shape.contains (...)' не работает в строках. См. Править. – camickr

+0

очень грустно это все еще не работает, thx anyways –