在 JLabel 上绘画 - 更改画笔颜色
Painting on JLabel - change brush color
我正在开发一个需要在标签图标上绘画的工具。到目前为止效果很好,但如果我改变画笔的颜色,所有已经绘制的线条也会改变颜色。
这是我重写的 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();
}
});
嗯,您误解了在 JLabel
或相应的 Graphics
对象中绘图的工作原理。
您的 JLabel
上没有 "already painted" 行,因为 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>()
”)
我正在开发一个需要在标签图标上绘画的工具。到目前为止效果很好,但如果我改变画笔的颜色,所有已经绘制的线条也会改变颜色。
这是我重写的 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();
}
});
嗯,您误解了在 JLabel
或相应的 Graphics
对象中绘图的工作原理。
您的 JLabel
上没有 "already painted" 行,因为 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>()
”)