Рисование на JLabel — изменение цвета кисти

#java #user-interface #paint #brush

#java #пользовательский интерфейс #Краски #кисть

Вопрос:

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

Это мой переопределенный метод 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. Возможно, вы захотите сохранить коллекцию линейных объектов вместе с их цветом и использовать это в своем методе рисования.

Ответ №1:

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

На вашем JLabel объекте не будет «уже нарисованных» строк, так как Graphics -object будет удален. 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>() «)