我正在尝试制作类似于Paint的东西,但遇到了一些障碍。基本上,您在一个调用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();
}
}
这有点不对。您想要一个缓冲区,它是一个缓冲图像,当鼠标向下移动或鼠标按钮抬起时,您可以绘制到它。每次调用paintComponent时,您都希望将此后台缓冲区复制到具有graphics.draw或类似功能的组件中。
问题是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的解决方案是一个更好的解决方案,这正好解决了