【问题标题】:Working with MouseEvents: Am I doing this correctly?使用 MouseEvents:我这样做正确吗?
【发布时间】:2014-02-05 17:52:26
【问题描述】:

我对 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”。主要方法是在一个单独的驱动文件中,一切运行正常(球场出现在屏幕上)但是当我点击球场时没有任何反应。

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

【问题讨论】:

    标签: java swing graphics jpanel mouselistener


    【解决方案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 即可。

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

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

    从我的代码中也可以看出,我使用了@Override 注释。您应该养成对尝试覆盖的方法执行此操作的习惯。如果覆盖成功,您将不会收到错误消息。如果不是,那么您将收到错误消息。

    【讨论】:

    • 吹毛求疵:不要扩大paintComponent的范围——它仅供内部使用:-)
    • @kleopatra 这是一个错字。这里已经很晚了。差不多该睡觉了:)
    • +1 愉快地授予了.. 给定了一定数量的second life in insomnia 3hrs later
    • @kleopatra 好的,妈妈,你抓住了我。但是..但是..这是周末:P
    猜你喜欢
    • 2012-12-12
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2023-03-19
    相关资源
    最近更新 更多