以下是我写的一段代码//测试MessagePanel classimport javax.swing.JPanel;
import java.awt.FontMetrics;
import java.awt.Font;
import javax.swing.JFrame;
import java.awt.Graphics;class MessagePanel  extends JPanel      
{
     // 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 MessagePanel()
  {
   message = "Welcome to Java";
  }
  
  public MessagePanel(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();
  }
  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 void UpMessage()
  {
   yOfMessage -= interval;
   setCenter = false;
   repaint();               
  }
  
  public void DownMessage()
  {
   yOfMessage += interval; 
   setCenter = false;      
   repaint();
  }
  
  public void LeftMessage()
  {
   xOfMessage -= interval; 
   setCenter = false;      
   repaint();
  }
  
  public void RightMessage()
  {
   xOfMessage += interval; 
   setCenter = false;      
   repaint();
  }
  
}public class TestMessagePanel extends JFrame
{
public static void main(String[] args)
      {
    TestMessagePanel frame = new TestMessagePanel();
    frame.setTitle("测试MessagePanle类");
    frame.setSize(300,200);
    MessagePanel test = new MessagePanel("Java is cool !");
    test.setFont(new Font("Dialog",Font.BOLD,20));
    test.setMessageCenter();                         
         test.RightMessage(); 
         test.RightMessage(); 
         test.RightMessage();

         frame.getContentPane().add(test);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.setCenter();
         frame.setVisible(true); 
      }
}我想像的执行结果是 “java is cool”在中央偏右的位置出现,结果却是在上方偏右,我想了一下,执行完
test.setMessageCenter(); 后,test的字符串“java is cool”的y坐标应该是中央的位置,怎么还是最初的20呢?
额,后来想到可能是没有搞清楚paintComponent(Graphics g)的执行的具体时间。
请老鸟们指点一下啦。谢谢了。