我有以下代码:
label.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
Graphics g=image.getGraphics();
g.setColor(Color.YELLOW);
g.fillRect(0, 0, image.getWidth(), image.getHeight());
}
}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
@Override
public void mousePressed(MouseEvent arg0) {}
@Override
public void mouseReleased(MouseEvent arg0) {}
});
图像是BufferedImage对象。但是,当我点击标签时,它不会绘制任何东西。我认为线程存在问题。我该如何解决?谢谢。
答案 0 :(得分:3)
与Graphics
对象的互动应仅限于paintComponent
方法。
是的,这是线程的问题,但并不完全像你想象的那样。
所有绘画都在调用paint()
,paintBackground
和paintBorder
的组件的paintComponent
方法内完成。您需要设置一个标志,并在要绘制它的面板或组件上调用repaint()
,而不是在鼠标处理程序事件中绘制到该区域。
在此组件中,覆盖paintComponent
方法。调用super.paintComponent()
并绘制标志设置后的内容。
当您在面板上调用repaint()
时,它将标记要绘制的组件。然后,下次Event Dispatch Thread呈现此组件时将调用paintComponent()
方法。这会将你的矩形添加到它的顶部。