使用MouseEvents:我这样做是否正确?

时间:2014-02-05 17:52:26

标签: java swing graphics jpanel mouselistener

我是MouseEvents和MouseListeners的新手,最近我问了一个关于创建篮球投篮图的问题。到目前为止我所拥有的是

    import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class StatTracker extends JPanel //implements MouseListener
{
   JPanel court;
   int xCoord, yCoord, clicks;
   boolean made, missed = false;
   public void paintComponent(Graphics g)
   {
      //Draw court lines
      g.setColor(Color.BLUE);
      g.fillRect(190,0,120,190);
      g.drawOval(190,130,120,120);
      g.drawRect(0,0,500,400);
      g.drawArc(52,-110,396,360,0,-180);
      g.drawLine(52,0,52,70);
      g.drawLine(448,0,448,70);

      g.setColor(Color.BLACK);
      g.fillRect(220,35,60,5);
      g.fillOval(240,40,20,20);
      if(made)
      {
         g.setColor(Color.GREEN);
         g.drawString("O", xCoord, yCoord);
      }
      if(missed)
      {
         g.setColor(Color.RED);
         g.drawString("X", xCoord, yCoord);
      }
      //made=false;
      //missed=false;
   } 
   public StatTracker()
   { 
      setLayout(new BorderLayout());
      court = new JPanel();
   }
   public void mouseClicked(MouseEvent e) 
   {
      clicks = e.getClickCount();
      xCoord = e.getX();
      yCoord = e.getY();
      if(xCoord <=500 && xCoord >= 0)
      {
         if(clicks==1)
            missed=true;
         if(clicks==2)
            made=true;
      }
      repaint();
   }
}

因此,基本上如果在球场边界内点击鼠标(0-500,0-400),它将根据单击还是双击显示'X'或'O'。主要方法是在一个单独的驱动文件中,一切都正常运行(法庭出现在屏幕上),但是当我点击球场时没有任何事情发生。

感谢您的任何帮助或建议,谢谢。

1 个答案:

答案 0 :(得分:1)

我假设您已将MouseListener注释掉,因为您收到了错误。

问题是,当您implements MouseListener时,您需要@Override 所有方法,而不仅仅是mouseClicked

public class StatTracker extends JPanel implements MouseListener {
    ...

    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}
}

你不需要的人可以留空。如果您需要,只需将代码添加到mouseClicked即可。

您还需要在super.paintComponent(g)方法

中致电paintComponent
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

从我的代码中可以看出,我使用@Override注释。您应该养成为尝试覆盖的方法执行此操作的习惯。如果是成功覆盖,则不会出现错误。如果不是那么你会得到一个错误。