Рисование на JLabel - изменение цвета кисти - PullRequest
0 голосов
/ 27 марта 2019

Я работаю над инструментом, который требует рисования на иконке ярлыка. Пока это работает нормально, но если я изменю цвет кисти, все уже нарисованные линии также изменят цвет.

Это мой переопределенный метод paintComponent:

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(brushColor);
        g2.setStroke(brush);
        for (int i = 1; i < point.size(); i++) {
            g2.draw(new Line2D.Float(point.get(i), point.get(i)));
        }
    }

Вот как изменить цвет моей кисти:

    public void changeBrushColor(int red, int green, int blue) {
        this.brushRed = red;
        this.brushGreen = green;
        this.brushBlue = blue;

        brushColor = new Color(red, green, blue);
        this.brush = new BasicStroke(brushWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
    }

И вот как я добавляю точки к массиву точек:

        imageLabel.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent event) {
                updateBrush();
                point.add(event.getPoint());
                imageLabel.updatePointList(point);
                repaint();
            }
        });

        imageLabel.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent event) {
                updateBrush();
                point.add(event.getPoint());
                imageLabel.updatePointList(point);
                repaint();
            }
        });

1 Ответ

0 голосов
/ 27 марта 2019

Ну, вы неправильно поняли, как работает рисование в JLabel или соответствующем Graphics -объекте.

На вашем JLabel нет "уже нарисованных" линий, так как Graphics -объект будет удален. paintComponent() заново нарисует все линии.

В вашем коде вы устанавливаете цвет для всех линий перед рисованием.

Вам нужно сохранить цвет линии вместе с точками и изменить цвет при рисовании одной линии.

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    for (int i = 1; i < point.size(); i++) {
        g2.setColor(colors.get(i));
        g2.setStroke(brushes.get(i));
        g2.draw(new Line2D.Float(point.get(i).x, point.get(i).y));
    }
}

Ну, здесь вам нужно 3 списка, один для цвета, один для кисти и один для точек. Возможно, вы подумаете о создании объекта, который содержит эти значения (например, "Linedesc(color, brush, point)"), чтобы иметь только список, содержащий их ("point = new ArrayList<LineDesc>()")

...