Java 如何防止paintComponent()在开始时运行?

Java 如何防止paintComponent()在开始时运行?,java,graphics,Java,Graphics,我正试图做一些类似油漆的东西,但我遇到了一点困难。基本上,您可以在调用paintComponent()的JPanel中绘制。但是,当程序运行时,左上角会出现一个不需要的点。我认为这是因为paintComponent()是在程序开始时调用的。有没有办法禁用此功能?下面列出了代码(我删除了导入),感谢阅读。 以下是彩板类: public class PaintBoard extends JPanel implements MouseListener { Image img; //PaintBoard

我正试图做一些类似油漆的东西,但我遇到了一点困难。基本上,您可以在调用paintComponent()的JPanel中绘制。但是,当程序运行时,左上角会出现一个不需要的点。我认为这是因为paintComponent()是在程序开始时调用的。有没有办法禁用此功能?下面列出了代码(我删除了导入),感谢阅读。 以下是彩板类:

public class PaintBoard extends JPanel implements MouseListener
{
Image img;
//PaintBoard panel;
int circleX = 25;
int circleY = 25;
int x;
int y;

public PaintBoard()
{
    this.addMouseListener(this);
}
public void paintComponent(Graphics g)
{       
    g.setColor(Color.RED);

    g.fillOval(x, y, circleX, circleY);
}
public void mouseClicked(MouseEvent arg0) 
{   
}
public void mouseEntered(MouseEvent arg0) 
{       
}
public void mouseExited(MouseEvent arg0) 
{   
}
public void mousePressed(MouseEvent arg0) 
{
    x = arg0.getX();
    y = arg0.getY();;


    repaint();
}
public void mouseReleased(MouseEvent arg0) 
{   
}

}
这是主要课程:

public class Main 
{
JFrame mainFrame = new JFrame("Painting test");
PaintBoard board = new PaintBoard();



public Main() throws IOException
{   
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.setSize(1750, 1000);
    mainFrame.setLayout(new GridLayout(2, 2));
    mainFrame.add(board);
    //mainFrame.pack();
    mainFrame.setVisible(true);
}

public static void main(String[] args) throws IOException 
{
    new Main();
}

}

这有点错误。您希望有一个backbuffer,它是一个buffereImage,当鼠标按下并移动或鼠标按钮抬起时,您可以绘制到它。每次调用paintComponent时,您都希望使用graphics.draw或类似工具将此backbuffer复制到组件

这有点不对。您希望有一个backbuffer,它是一个buffereImage,当鼠标按下并移动或鼠标按钮抬起时,您可以绘制到它。每次调用paintComponent时,您都希望使用graphics.draw或类似工具将此backbuffer复制到组件

问题是x/y坐标已初始化为0/0,因此您正在使用paint方法执行您要求它执行的操作

最好将x/y坐标设置为您可以识别的值,而不要绘制椭圆形,例如-1/-1

int x = -1;
int y = -1;

public void paintComponent(Graphics g)
{       
    if (x >= 0 && y >= 0) {
        g.setColor(Color.RED);

        g.fillOval(x, y, circleX, circleY);
    }
}

请注意,Markus的解决方案是一个更好的解决方案,这正好解决了问题

问题是x/y坐标已初始化为0/0,因此您正在绘制方法,它正在执行您要求它执行的操作

最好将x/y坐标设置为您可以识别的值,而不要绘制椭圆形,例如-1/-1

int x = -1;
int y = -1;

public void paintComponent(Graphics g)
{       
    if (x >= 0 && y >= 0) {
        g.setColor(Color.RED);

        g.fillOval(x, y, circleX, circleY);
    }
}

请注意,Markus的解决方案是一个更好的解决方案,这正好解决了问题

好的,我将包括这一点。即使我不想让它出现,它也会出现吗?会的。每当需要绘制组件时,都会调用paintComponent。例如,当有人在它上面移动另一个窗口时。好的,我将包括这个。即使我不想让它出现,它也会出现吗?会的。每当需要绘制组件时,都会调用paintComponent。例如,当有人在上面移动另一个窗口时,请注意@MarkusMikkolainen solution实际上是一个更好的解决方案,这正好解决了您的问题;)请注意,@MarkusMikkolainen solution实际上是一个更好的解决方案,它只是解决了您的问题;)