gpt4 book ai didi

java - Swing - JPanel背景颜色消失

转载 作者:行者123 更新时间:2023-12-01 18:42:03 24 4
gpt4 key购买 nike

我试图在 JPanel 内绘图,但每次单击时,JPanel 的背景都会消失。它在鼠标所在的位置画一条线。我认为这与 2D 图形有关有人可以帮忙吗?

public Brush() {

addMouseListener(this);
addMouseMotionListener(this);
setBackground(Color.white);


}
@Override
public void paintComponent(Graphics g) {

Graphics2D g2;
// super.paintComponent(g);

g2 = (Graphics2D) g;

g2.setColor(brushColor);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
//Ellipse2D.Double circle = new Ellipse2D.Double(p1.x,p1.y,20,20);

g2.fillOval(p1.x,p1.y,20,20);

}


@Override
public void mousePressed(MouseEvent e) {
dragging = true;
p1 = e.getPoint();
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
dragging = false;
p1 = e.getPoint();
repaint();
}

@Override
public void mouseDragged(MouseEvent e) {
if (dragging) {
p1 = e.getPoint();
repaint();
}
}

最佳答案

请始终调用super.paintComponent(g)重写中的方法。

那你画错了。如果你想画一堆椭圆形,那么要么

  • 创建它们的集合并在paintComponent中使用for循环绘制它们,或者
  • 将它们绘制在 BufferedImage 中,然后在您的 PaintComponent 方法中绘制。
  • 如果我想用鼠标画一条曲线,我通常会创建一个 ArrayList<Point>并在 PaintComponent 或 BufferedImage 中的连续点之间绘制线条。
<小时/>

同样,您的代码编写为在 PaintComponent 中仅绘制一个点(实际上是椭圆形)。如果编码正确,这就是它所要做的。

我建议,最简单的事情是:

  • 给你上课 ArrayList<Point>
  • 按下鼠标时添加点并调用重绘
  • paintComponent ,调用 super 方法,然后使用 for 循环遍历 ArrayList。
  • 从第 1 项(而不是 0)处的 Point 开始循环,然后在前一个 Point 和当前点之间画一条线。
  • 为了变得更时尚,您可能希望拥有 ArrayList<ArrayList<Point>>你从哪里开始一个新的 ArrayList<Point>每次按下鼠标,每次发布都会完成并将其添加到整个集合中。这将允许绘制多条线。

为什么不先自己尝试一下呢?

关于java - Swing - JPanel背景颜色消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19571567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com