书上的一道习题,让我给MessagePanel(继承JPanel,用来显示字符串)添加ActionEvent支持,要实现的效果是鼠标点击后,在MessagePanel上显示当前时间我如下实现,但发现没效果,求指点。
 class MessagePanelWithActionEvent extends JPanel implements ActionListener
{
 // data field
private int xOfMessage = 20;               //message的x坐标
private int yOfMessage = 20;               //message的y坐标
private boolean setCenter = false;            //是否要将message设在中央的标志
  private String message;             //显示的字符串信息
private int interval = 20;        //移动的间隔
  
  //method field
  public MessagePanelWithActionEvent()
  {
   this.message = "Welcome to java !";
  }
  
  public MessagePanelWithActionEvent(String message)
  {
    this.message = message;
  }
  
  public int getXOfMessage()
  {
   return xOfMessage;
  }
  
  public int getYOfMessage()
  {
   return yOfMessage;
  }
  
  public String getMessage()
  {
   return message;
  }
  
  public int getInterval()
  {
   return interval;
  }
  
  public void setXOfMessage(int xOfMessage)
  {
    this.xOfMessage = xOfMessage;
    repaint();
  }
  
  public void setYOfMessage(int yOfMessage)
  {
   this.yOfMessage = yOfMessage;
   repaint();
  }
  
  public void setMessage(String message)
  {
   this.message = message;
   repaint();
  }
  
  public void setInterval(int interval)
  {
   this.interval = interval;
  }
  
  public void setMessageCenter()
  {
   setCenter = true;
   repaint();
  }
  
  public void upMessage()
  {
   yOfMessage -= interval;
   setCenter = false;
   repaint();               //重画图像,在Component中定义
  }
  
  public void downMessage()
  {
   yOfMessage += interval; 
   setCenter = false;      
   repaint();
  }
  
  public void leftMessage()
  {
   xOfMessage -= interval; 
   setCenter = false;      
   repaint();
  }
  
  public void rightMessage()
  {
   xOfMessage += interval; 
   setCenter = false;      
   repaint();
  }
  
  protected void processMouseEvent(MouseEvent event)   //重写processMouseEvent方法
  {
    if(event.getID() == MouseEvent.MOUSE_CLICKED)
    {
      processActionEvent(new ActionEvent(this,ActionEvent.ACTION_PERFORMED,null));
    }
  }
  
  private void processActionEvent(ActionEvent event)
  {
     actionPerformed(event);
  }
  
  public void actionPerformed(ActionEvent event)
  {
    setMessage( new GregorianCalendar().getTime().toString() );
  }

  
  protected void paintComponent(Graphics g)
  {
   super.paintComponent(g);
   if(setCenter == true)
   {
   FontMetrics fontMetric = g.getFontMetrics();
   int MessageWidth = fontMetric.stringWidth(message);
   int MessageAscent = fontMetric.getAscent();
   xOfMessage = getWidth() / 2 - MessageWidth / 2;
   yOfMessage = getHeight() / 2 + MessageAscent / 2;
   }  
   g.drawString(message,xOfMessage,yOfMessage);
  }
}public class TestMessagePanelWithActionEvent extends JFrame
{
  public static void main(String[] args)
  {
    TestMessagePanelWithActionEvent  frame = new TestMessagePanelWithActionEvent();
    frame.add(new MessagePanelWithActionEvent());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300,200);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

解决方案 »

  1.   

    你代码里面没有添加任何的侦听,自然不会有鼠标点击事件的响应
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package view;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.util.*;
    /**
     *
     * @author Administrator
     */
    class MessagePanelWithActionEvent extends JPanel implements ActionListener,MouseListener
    {
         // data field
        private int xOfMessage = 20;               //message的x坐标
        private int yOfMessage = 20;               //message的y坐标
        private boolean setCenter = false;            //是否要将message设在中央的标志
        private String message;             //显示的字符串信息
        private int interval = 20;        //移动的间隔
      
      //method field
      public MessagePanelWithActionEvent()
      {
          this.message = "Welcome to java !";
          this.addMouseListener(this);
      }
      
      public MessagePanelWithActionEvent(String message)
      {
           this.message = message;
           this.addMouseListener(this);
      }
      
      public int getXOfMessage()
      {
          return xOfMessage;
      }
      
      public int getYOfMessage()
      {
          return yOfMessage;
      }
      
      public String getMessage()
      {
          return message;
      }
      
      public int getInterval()
      {
          return interval;
      }
      
      public void setXOfMessage(int xOfMessage)
      {
           this.xOfMessage = xOfMessage;
           repaint();
      }
      
      public void setYOfMessage(int yOfMessage)
      {
          this.yOfMessage = yOfMessage;
          repaint();
      }
      
      public void setMessage(String message)
      {
          this.message = message;
          repaint();
      }
      
      public void setInterval(int interval)
      {
          this.interval = interval;
      }
      
      public void setMessageCenter()
      {
          setCenter = true;
          repaint();
      }
      
      public void upMessage()
      {
          yOfMessage -= interval;
          setCenter = false;
          repaint();               //重画图像,在Component中定义
      }
      
      public void downMessage()
      {
          yOfMessage += interval; 
          setCenter = false;      
          repaint();
      }
      
      public void leftMessage()
      {
          xOfMessage -= interval; 
          setCenter = false;      
          repaint();
      }
      
      public void rightMessage()
      {
          xOfMessage += interval; 
          setCenter = false;      
          repaint();
      }
      
    protected void processMouseEvent(MouseEvent event)   //重写processMouseEvent方法
      {
        if(event.getID() == MouseEvent.MOUSE_CLICKED)
        {
             processActionEvent(new ActionEvent(this,ActionEvent.ACTION_PERFORMED,null));
        }
      }
      
      private void processActionEvent(ActionEvent event)
      {
            actionPerformed(event);
      }
      
      public void actionPerformed(ActionEvent event)
      {
           setMessage( new GregorianCalendar().getTime().toString() );
      }
      
        public void mouseClicked(MouseEvent e){
            System.out.println("-----mouseClicked---------");
        }    /**
         * Invoked when a mouse button has been pressed on a component.
         */
        public void mousePressed(MouseEvent e){}    /**
         * Invoked when a mouse button has been released on a component.
         */
        public void mouseReleased(MouseEvent e){}    /**
         * Invoked when the mouse enters a component.
         */
        public void mouseEntered(MouseEvent e){}    /**
         * Invoked when the mouse exits a component.
         */
        public void mouseExited(MouseEvent e){}
      
      protected void paintComponent(Graphics g)
      {
          super.paintComponent(g);
          if(setCenter == true)
          {
              FontMetrics fontMetric = g.getFontMetrics();
              int MessageWidth = fontMetric.stringWidth(message);
              int MessageAscent = fontMetric.getAscent();
              xOfMessage = getWidth() / 2 - MessageWidth / 2;
              yOfMessage = getHeight() / 2 + MessageAscent / 2;
          }     
          g.drawString(message,xOfMessage,yOfMessage);
      }
    }public class TestMessagePanelWithActionEvent extends JFrame
    {
          public static void main(String[] args)
          {
               TestMessagePanelWithActionEvent  frame = new TestMessagePanelWithActionEvent();
               frame.add(new MessagePanelWithActionEvent());
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               frame.setSize(300,200);
               frame.setLocationRelativeTo(null);
               frame.setVisible(true);
          }
    }
      

  2.   


    额,是这样的,忘了MouseListener,光顾着ActionListener了,谢谢了