#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>()
«)