Изменить цвет списка формы в JPanel Java

1

У меня есть список Shape, нарисованный на JPanel, и мне нужно изменить цвет тех, которые содержат точку, полученную с помощью мыши, но я действительно не могу понять, как использовать repaint() для этого.

Это тестовый класс:

public class TestShapeViewer
{    
    public static void main(String[] args)
    {
        List<Shape> figure = new ArrayList<Shape>();
        Utils util = new Utils();            

        figure.add(new Rect(new P2d(200,200), new P2d(90,40)));
        figure.add(new Circle(new P2d (150,150), new P2d (300,150)));

        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowWindow(figure);
            }
        });
    }

    private static void createAndShowWindow(List<Shape> figure)
    {
        JFrame window = new JFrame("TestShapeViewer");
        window.setSize(500,500);
        window.setLocationRelativeTo(null);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        window.add(new Viewer(figure));
        window.pack();

        window.setVisible(true);
    }    
}

Это мой класс JPanel

public class Viewer extends JPanel implements ShapeViewer
{
    private List<Shape> shapesToDraw;
    private List<Shape> shapeToColor;
    private Utils utility = new Utils();
    private Color colorToUse;

    public Viewer(List<Shape> shapes)
    {
        this.shapesToDraw = shapes;
        this.colorToUse = Color.BLACK;

        addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent e) {
                repaintShapes(e.getX(), e.getY());
            }
        });
    }

    public void update(List<Shape> shapes)
    {
        this.shapesToDraw = shapes;
    }

    public Dimension getPreferredSize()
    {
        return new Dimension(500,500);
    }

    public void paintComponent(Graphics shape)
    {
        super.paintComponent(shape);
        shape.setColor(colorToUse);

        shapesToDraw.stream().forEach(x -> DrawShape(shape,x));
    }

    public void DrawShape(Graphics shape, Shape s)
    {
        BBox box = s.getBBox();

        if (s instanceof Line)
        {
            shape.drawLine(box.getUpperLeft().getX(), 
                           box.getUpperLeft().getY(), 
                           box.getBottomRight().getX(),
                           box.getBottomRight().getY()); 
        }
        else if(s instanceof Rect)
            {
                int[] xpoints = {box.getUpperLeft().getX(),
                                 box.getBottomRight().getX(),
                                 box.getBottomRight().getX(),
                                 box.getUpperLeft().getX()};
                int[] ypoints = {box.getUpperLeft().getY(),
                                 box.getUpperLeft().getY(),
                                 box.getBottomRight().getY(),
                                 box.getBottomRight().getY()};
                Polygon rect = new Polygon(xpoints, ypoints, 4);
                shape.drawPolygon(rect);
            }
            else if(s instanceof Circle)
                {
                    int raggio = (int)(new Line(box.getUpperLeft(),
                                       new P2d(box.getBottomRight().getX(),
                                           box.getUpperLeft().getY())).getPerim())/2;

                    shape.drawOval(box.getUpperLeft().getX(),
                                   box.getUpperLeft().getY(),
                                   raggio*2, raggio*2);
                }
                else if(s instanceof Combo)
                {
                    Combo co = (Combo) s;
                    co.getComp().stream().forEach(x -> DrawShape(shape,x));
                }
    }

    private void repaintShapes(int x, int y)
    {
        shapeToColor = utility.getContaining(shapesToDraw,new P2d(x,y));
        this.colorToUse = Color.RED;
        repaint();
    }
}

Моя цель - щелкнуть по точке, проверить, какие фигуры содержат эту точку, и изменить только их цвет.

Для ясности:

  • P2d - класс, который идентифицирует точку (x, y)
  • Utils.getContaining() - это метод, который возвращает список фигур, содержащий точку
  • BBox - это самый маленький ограничивающий прямоугольник, который содержит форму
Теги:
swing
shape
paintcomponent

1 ответ

1
Лучший ответ

У меня есть список Shape, нарисованный на JPanel, и мне нужно изменить цвет тех, которые содержат точку

Вместо сохранения списка фигур. Вы можете сохранить список "ColoredShapes". Вы создали бы собственный класс, который содержит два свойства: 1) Shape, 2) Color и добавьте этот объект в List. Конечно, вам также нужно будет изменить код рисования, чтобы получить информацию о цвете до рисования фигуры.

Затем, когда вы используете мышь, чтобы щелкнуть по точке, вы перебираете список, чтобы найти любую фигуру, содержащую точку мыши, и вы обновляете цвет. Затем вы просто вызываете repaint() на своей пользовательской панели рисования.

DrawOnComponent пример DrawOnComponent из пользовательских подходов к рисованию. Этот подход использует "ColoredRectangle" для отслеживания двух свойств, поэтому подход очень похож на то, что вам нужно.

  • 0
    Спасибо! Это именно то, что мне нужно :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню