以下是我写的一段代码//测试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)的执行的具体时间。
请老鸟们指点一下啦。谢谢了。
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)的执行的具体时间。
请老鸟们指点一下啦。谢谢了。
test.RightMessage();
public void RightMessage()
{
xOfMessage += interval;
setCenter = false;
repaint();
}
执行完test.RightMessage(); 后setCenter被重新设置了