import java。awt。*;
import javax。swing。*;
public class TankWar extends JFrame {
public TankWar (String title) {
super(title);
this。setSize(600,500);
this。setLocationRelativeTo(null); //设置窗口的位置屏幕中间
this。setResizable(false); //设置为不可改变大小
this。setDefaultCloseOperation(EXIT_ON_CLOSE); //设置关闭事件
MyJPanel myJPanel = new MyJPanel(); //创建一个MyJPanel实例对象myJPanel
myJPanel。setBackground(Color。blue);//设置myJPanel的背景颜色
this。add(myJPanel);
this。setVisible(true);
}
/*内部继承JPanel类*/
class MyJPanel extends JPanel {
protected void paintComponent(Graphics g) {
Color c = g。getColor();
g。setColor(Color。red);
g。fillOval(200, 100, 300, 300);
g。setColor(c);
}
}
public static void main(String args[]){
new TankWar (“坦克大战”);
}
}
还是自己去读JDK源码吧。。
部分源码
public void paint(Graphics g) {
}
public void update(Graphics g) {
paint(g);
}
public void paintAll(Graphics g) {
if (isShowing()) {
GraphicsCallback。PeerPaintCallback。getInstance()。
runOneComponent(this, new Rectangle(0, 0, width, height),
g, g。getClip(),
GraphicsCallback。LIGHTWEIGHTS |
GraphicsCallback。HEAVYWEIGHTS);
}
}
public void repaint() {
repaint(0, 0, 0, width, height);
}
朋友,这世上是需要缘分才能碰见一些真正的算命大师的。
和楼上的同赞。
这就是AWT和Swing的区别。
AWT不但最外面的那个Frame有peer,里面那个panel和button都各自有peer(WPanelPeer, WButtonPeer)。这些都是直接关联native窗口系统(如windows的窗口系统和linux的X系统)的一个句柄,每次重画的时候先通知native窗口系统按穿过去的位置,大小参数先画一个本地系统的“panel”,“button”,所以默认的button,panel边框修饰之类的样子都和本地的一样。然后再调用java的paint在那个基础之上继续画。你可以在paint之前设个断点debug看一下,在paint之前,那个窗口,黑色的panel和空白的button已经在那里了,但没有文字。
Swing就不同了,你可以试试JFrame,JPanel,JButton。 除了最外层JFrame还是有peer的,其基本边框也是native系统决定的,和Frame有点像,其余JButton和JPanel你去用空方法重载掉他们的paint,便什么也没有了。