以下是我写的一段代码//测试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)的执行的具体时间。
请老鸟们指点一下啦。谢谢了。
//哎 基本不搞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
}
}
xOfMessage = getWidth() / 2 - MessageWidth / 2;
yOfMessage = getHeight() / 2 + MessageAscent / 2;
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
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()调用
}