2012-02-28 33 views
1

我已经以下代码:如何绘制MouseListenerEvent?

 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对象。但是当我点击标签时,它不会画任何东西。我认为线程有问题。我该如何解决它?谢谢。

+1

为了更快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。 – 2012-02-28 10:30:00

+0

在您显示的任何代码中,线程都没有问题。你错过了很多代码(尤其是你的paintComponent重载),并且显示了不必要的代码(所有这些空白方法)。如果仍然陷入困境,那么你最好接受安德鲁的建议并创建并显示[sscce](http://sscce.org)。 – 2012-02-28 12:37:49

回答

3

Graphics对象的相互作用应限制为paintComponent方法。

是的,这是一个线程问题,但并不完全如您所想。

所有的绘画都在组件的paint()方法内完成,该组件调用paintBackground,paintBorderpaintComponent。而不是在鼠标处理程序事件中绘制到该区域,您需要设置一个标志并在要绘制该面板或组件上调用repaint()

在此组件中,覆盖paintComponent方法。打电话super.paintComponent()并绘制标志设置后的内容。

当您在面板上调用repaint()时,它将标记要涂漆的组件。然后,将在下次Event Dispatch Thread呈现此组件时调用paintComponent()方法。这会将您的矩形添加到它的顶部。

+2

仅当绘制到Swing/AWT组件的Graphics对象时,这不适用吗?在这种情况下,有人说图像是一个BufferedImage,在这种情况下,我认为从任何线程或方法绘制它都是可以接受的。基于给定的代码,我可以不肯定地说这个图像以后用于什么。 – Jiddo 2012-02-28 07:28:04