如何让paintComponent()在开始时保持运行?

时间:2012-07-31 01:40:41

标签: java graphics

我正在尝试制作类似于Paint的东西,但我遇到了一些障碍。基本上你在一个调用paintComponent()的JPanel中绘制。但是,运行程序时,左上角会出现一个不需要的点。我认为这是因为在程序开始时调用了paintComponent()。有没有办法禁用它?代码列在下面(我删除了导入)并感谢阅读。 这是paintBoard类:

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();
}

}

2 个答案:

答案 0 :(得分:2)

这有点不对劲。你想要一个后备缓冲区,它是一个缓冲图像,当鼠标向下移动或移动鼠标按钮时你可以绘制它。每次调用paintComponent时,您都希望将此backbuffer复制到带有graphics.draw的组件或类似的东西。

答案 1 :(得分:1)

问题是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的解决方案是一个更好的解决方案,这只是解决问题