坦克大战在jpanel上画和在jframe jpanel画的区别

Swing编程方面步骤之三JFrame、JPanel、paint与paintComponent的区别 - CSDN博客
Swing编程方面步骤之三JFrame、JPanel、paint与paintComponent的区别
接着很久之前的博客
1.JFrame和JPanel区别
包含Swing组件的程序必须包含一个顶级容器。但是Swing组件不可以直接加入到顶级容器中,而JFrame是顶级容器。通常是把Swing组件先加入JFrame, JDialog, and JApplet三个顶层容器类中的一个,然后再放入JFrame中。之前相关Swing的博客例子的类都直接继承JFrame,下面的例子的类先是继承JPanel,然后在类的构造函数中添加JFrame。
2.add()是任何JComponent都可以调用的,JPanel也可以,但是JFrame不可以。
对JFrame添加组件有两种方式,常用方式一。即通过 getContentPane ()方法获得JFrame的内容面板,再对其加入组件,如frame. getContentPane ().add(childComponent)。在下篇的五子棋单机版博客中,就是把棋盘对象加入到JFrame的内容面板中,如 Container contentPane=getContentPane(); contentPane.add(chessBoard);
3.java里面的paint()方法不是由用户调用的,而是由虚拟机系统调用的,即和下面的paintComponent()是一样的。
4.JComponent类有一个方法paintComponent(Graphics g),当主方法并没有调用这个类的方法,而这个方法里的代码仍被执行。什么时候paintComponent(Graphics g)被调用?
当java认为需要重新绘制组件的时候由java调用。例如在程序中repaint();或者程序窗口最小化,然后恢复;或者程序窗口被遮挡,又显现的时候。
在下篇的五子棋单机版博客中,单步执行主窗体程序,setVisible(true) ---》super.setVisible(b)--》show(b)--》show()--》super.show(),这个方法如下:
public void show() {
&&&&&&& if (!visible) {
&&&&&&&&&&& synchronized (getTreeLock()) {
&&&&&&&&&&&&&&& visible =
&&&&&&&&&&&&&&& mixOnShowing();
&&&&&&&&&&&&&&& ComponentPeer peer = this.
&&&&&&&&&&&&&&& if (peer != null) {
&&&&&&&&&&&&&&&&&&& peer.show();
&&&&&&&&&&&&&&&&&&& createHierarchyEvents(HierarchyEvent.HIERARCHY_CHANGED,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& this, parent,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& HierarchyEvent.SHOWING_CHANGED,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Toolkit.enabledOnToolkit(AWTEvent.HIERARCHY_EVENT_MASK));
&&&&&&&&&&&&&&&&&&& if (peer instanceof LightweightPeer) {
&&&&&&&&&&&&&&&&&&&&&&& repaint();
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& updateCursorImmediately();
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& if (componentListener != null ||
&&&&&&&&&&&&&&&&&&& (eventMask & PONENT_EVENT_MASK) != 0 ||
&&&&&&&&&&&&&&&&&&& Toolkit.PONENT_EVENT_MASK)) {
&&&&&&&&&&&&&&&&&&& ComponentEvent e = new ComponentEvent(this,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& PONENT_SHOWN);
&&&&&&&&&&&&&&&&&&& Toolkit.getEventQueue().postEvent(e);
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& Container parent = this.
&&&&&&&&&&& if (parent != null) {
&&&&&&&&&&&&&&& parent.invalidate();
&&&&&&&&&&& }
当在这个方法中单步执行到红字部分 peer.show(),继续跟进peer.show()方法,然后出来父窗体。再返回到void show()方法继续单步往下执行到 红字部分
& if (componentListener != null || (eventMask & PONENT_EVENT_MASK) != 0 ||& Toolkit.PONENT_EVENT_MASK)) {
&&&&&&&&&&&&&&&&&&& ComponentEvent e = new ComponentEvent(this,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& PONENT_SHOWN);
&&&&&&&&&&&&&&&&&&& Toolkit.getEventQueue().postEvent(e);
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
Container parent = this.parent,由于componentListener != null,会调用了我们在棋盘类中的重写的paintComponent方法,最后出现棋盘。
5.Swing中paint与paintComponent的区别
当Swing中的paint方法被调用时,paintComponent、paintBorder、 paintChildren 这三个方法也会被按顺序调用,之所以要按这个顺序调用是为了保证子组件能正确地显示在目前这个组件之上。
paintComponent就是本身这个容器自己画出自己组件的方法,且在JComponent中的方法paintComponent()还是保护类型的,即我们平常并不用管这个方法。只在我们需要改变绘制组件动作的时候,类只要先继承paintComponent(一般是JFrame),然后重写这个方法即可。
(1)如果只是为了在Swing中改变组件样式,重写paintComponent就可以了,其他paintBorder和paintChildren默认。如果还要保留容器中的原本组件就别忘了调用super.paintComponent(g)。
(2)如果要改写paint方法来改变本身这个容器的组件,那么也别忘了要调用super.paint(g),不然出来的东西是不包含原组件、原边框和子组件的。此处有例子如下:
package TestP
import java.awt.C
import java.awt.G
import javax.swing.JF
import javax.swing.JL
import javax.swing.JP
public class MyDrawPanel extends JPanel {//JPanel是普通容器
public static void main(String[] args) {
new MyDrawPanel();
public MyDrawPanel(){
//创建组件
JFrame frame = new JFrame();//JFrame是顶级容器,包含Swing组件的程序必须包含一个顶级容器
JLabel label = new JLabel(&aaa&);
//把JPanel添加组件 。因为Swing组件不可以直接加入到顶级容器中,通常是 JFrame, JDialog, and JApplet三个顶层容器类。
this.add(label);
//把JPanel及JPanel上的其他组件都加入顶层容器JFrame
frame.getContentPane().add(this);
//设置面板和框架的基本属性
this.setBackground(Color.blue);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
public void paint(Graphics g) {
super.paint(g);//如果注释掉super.paint(g),那么就不显示父类JPanel容器中的原本组件,只能显示出方块了。
g.setColor(Color.orange);
g.fillRect(20, 50, 100, 100);
6.当我们重写JPanel这个父类的paintComponent()方法,来实现自己的绘制方案时,为啥要调用super.paintComponent()?
因为类是从JPanel继承而来的,相当于这个类本身就保存了JPanel的一个引用。当重写paintComponent()方法时,为了确保在此期间,父类JPanel能保留容器中的原本组件
,要先把自己的paintComponent()方法运行完,即调用super.paintComponent(),然后再运行我们自己的paintComponent()。否则就有可能出现的情况是,父类JPanel自己还没有绘制完,程序已经开始绘制子类的了。
本文已收录于以下专栏:
相关文章推荐
1 - paint() 中调用 paintComponent(), paintBorder(), paintChildren()
2 - 最重要的区别是“双缓冲”。Swing 组件...
首先,paintComponent()是swing的一个方法,相当于图形版的main(),是会自执行的。如果一个class中有构造函数,则执行顺序是先执行构造函数,再执行这个。
下面直接转载...
Java 关于paintComponent函数问题
20:36Bakkwo | 分类:JAVA相关 | 浏览2993次
public class MyPanel exte...
根据android sdk中的snake sample来写一个swing版本。
想写一个snake程序,因为手上有一个Snake程序了,是Android版本的,最近想学习一下Android编程,所以...
Component在Swing的MVC模型中担任Controller的角色,同时它也是SwingAPI中代表具体组件的对象。Component在Swing中对外负责提供API接口,对内负责协调控制Mo...
honphenc的博客
JFrame是一个顶层的框架类,好比一个窗户的框子。也是一个容器类。这个框子可以嵌入几个玻璃窗。
JPanel是一个容器类,相当于一大玻璃窗。
JLabel等是一些基础...
近来学习Graphics类,以及绘图方法,做了一个小程序,运行结果如下(按钮部分是ps做出来的图片):代码如下:Code:
  
public class TestDrawPicture ...
JAVA图形编程Swing之——JPanel
paint方法是从Component中
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:1&分页:&发信人: froglyle (froglyle), 信区: JavaTutorial
标&&题: [求助,急!]为什么在JPanel上画线不显示
发信站: 水木社区 (Fri Jun 15 15:25:10 2007), 站内 && 下面是我在JB下写的程序,在一个Frame上天加一Panel,再在其上添加一按钮和一条折线,现在按钮显示,而折线不显示。那位大牛帮帮我啊!
import javax.swing.*;
import java.awt.*; && public class test extends JFrame{ && JPanel jPanel1 = new JPanel(); && JButton jButton1 = new JButton(); && public test() { &&&& try { &&&&&& jbInit(); &&&& } &&&& catch(Exception e) { &&&&&& e.printStackTrace(); &&&& } && } && private void jbInit() throws Exception { &&&& this.setSize(new Dimension(400,300)); &&&& this.getContentPane().setLayout(null); &&&&&& jPanel1.setLayout(null); &&&&&& jPanel1.setBounds(new Rectangle(4, 0, 384, 286)); &&&& jButton1.setBackground(Color.red); &&&& jButton1.setBounds(new Rectangle(111, 79, 97, 45)); &&&& jButton1.setText("jButton1"); &&&& this.getContentPane().add(jPanel1, null); &&&& jPanel1.add(jButton1, null); &&&&&& line2 l = new line2(); &&&& jPanel1.add(l); &&&&&&&& this.setVisible(true); && } &&&& public static void main(String args[]) { &&&& new test(); && }
} &&&&&& class line2 extends JPanel {&&&& public line2() { && } &&&& public void paint(Graphics g) { &&&& super.paint(g); &&&& g.setColor(Color.red); &&&& g.drawLine(20, 20, 200,20); &&&& g.drawLine(200,20,200,220); && }
-- && ※ 来源:·水木社区 ·[FROM: 219.239.227.*]
&文章数:1&分页:阅读(...) 评论()}

我要回帖

更多关于 jframe和jpanel的区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信