以下是我写的一段代码//测试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)的执行的具体时间。
请老鸟们指点一下啦。谢谢了。

解决方案 »

  1.   


    //哎 基本不搞Java 界面技术的, 但是没人帮你,就来帮下吧 你发2个贴不容易啊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(); //这儿setCenter=true了 , x=20, y=20没变
    test.RightMessage(); //这儿setCenter=false了 x=40, y=20
    test.RightMessage(); //这儿setCenter=false了 x=60, y=20
    test.RightMessage();//这儿setCenter=false了 x=80, y=20
    frame.getContentPane().add(test);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // test.setCenter();没这api啊
    frame.setVisible(true);
                   
                   //最后才调用JFrame的UI显示也就会调用你的paintComponent(Graphics g)
                  //所以调用你的paintComponent(Graphics g) setCenter=false了 x=80, y=20
    }
    }
      

  2.   

    呵呵呵呵呵,非常感谢楼上的仁兄啦,是网速太慢,我点了两次发帖,所以。不过我还有点不太明白,setMessageCenter(),x和y怎么会不变呢?不是有这两句吗?
    xOfMessage = getWidth() / 2 - MessageWidth / 2;
    yOfMessage = getHeight() / 2 + MessageAscent / 2;
      

  3.   

    [code=Java]  public void setMessageCenter()
    public void setMessageCenter() {
    setCenter = true;
    repaint();  //这里 并没有 --立即-- 导致调用paint()方法和paintComponent()调用 仅仅是setCenter = true; 
                                    //x, y当然不变啦
    }//repaint()只会是 --尽快-- 调用此组件的 paint 方法
    public void repaint()重绘此组件。 
    如果此组件是轻量级组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。 
            //看你的RightMessage()
    public void RightMessage() {
    xOfMessage += interval;
    setCenter = false; //这儿吧setCenter = false; 
    repaint(); //这也不会立即去调用paint方法,也就不会导致你的paintComponent()调用 
    }
    [/code
      

  4.   

     public void setMessageCenter()
    public void setMessageCenter() {
    setCenter = true;
    repaint(); //这里 并没有 --立即-- 导致调用paint()方法和paintComponent()调用 仅仅是setCenter = true; 
      //x, y当然不变啦
    }//repaint()只会是 --尽快-- 调用此组件的 paint 方法
    public void repaint()重绘此组件。 
    如果此组件是轻量级组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。 
      //看你的RightMessage()
    public void RightMessage() {
    xOfMessage += interval;
    setCenter = false; //这儿吧setCenter = false; 
    repaint(); //这也不会立即去调用paint方法,也就不会导致你的paintComponent()调用 
    }