java paintComponent的一些解读

首先,paintComponent()是swing的一个方法,相当于图形版的main(),是会自执行的。如果一个class中有构造函数,则执行顺序是先执行构造函数,再执行这个。


下面直接转载一个网友关于paintComponent()的介绍:

(我们明天就开始java游戏设计之旅啦!)


下面看看Swing中paint与paintComponent的区别。
查API文档,查得在类Jcomponent下的paint方法有以下解释:
      “This method actually delegates the work ofpainting to three protected            methods:  paintComponent paintBorder ,and  paintChildren .They're called in the           order listed to ensure that children appear ontop of component itself.”

也就是说当Swing中的paint方法被调用时,paintComponent、paintBorder、       paintChildren这三个方法也会被按顺序调用,之所以要按这个顺序调用是为了保证子组件能正确地显示在目前这个组件之上。

所以paintComponent就是本身这个容器自己画出自己组件的方法了。如果只是为了改变本身这个容器中的组件,只需要改写 paintComponent方法就可以了,如果还要保留容器中的原本组件就别忘了调用super.paintComponent(g)。如果要改写paint方法来改变本身这个容器的组件,那么也别忘了要调用super.paint(g),不然出来的东西是不包含原组件、原边框和子组件的。这个做个实验就可以很快验证的。
       
      public class MyDrawPanelextends JPanel{
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.orange);
g.fillRect(20, 50, 100, 100);
}
public static void main(String[] args){
JFrame frame = new JFrame();
MyDrawPanel panel = new MyDrawPanel();
JLabel label = new JLabel("aaa");
panel.setBackground(Color.blue);
panel.add(label);
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}
}

以上这个程序除了JPanel本身正常显示之外还会显示出子组件label和一个方块。如果注释掉super.paint(g),那么就只能显示出方块了。

         
不过我还发现了一个更神奇的地方。
那就是以上这些只适用于Swing,如果换成awt就不同了。

awt要改变组件样式,只能重写paint方法了,因为他是没有paintComponent方法的。什么?你有发现这个方法?!如果你看清楚你就会发现这个方法不是paintComponent而是paintComponents方法,后面多了一个sSwing之paint与paintComponent的区别
     
这个paintComponents方法按API说是用来把所有的容器内组件都显示出来的方法,我做了一下实验,这个方法在容器对象初始化的时候应该是没有被自动调用的,当你要用的时候只能自己调用了,不过好像只是显示出子组件而已,因为awt中即使重写paint方法而没有调用父类的paint方法是不影响本身容器自己的组件显示的。这是一个例子:
       
      public class MyDrawPanelextends Panel{
public void paint(Graphics g){
//super.paint(g);
g.setColor(Color.orange);
g.fillRect(20, 50, 100, 100);
paintComponents(g);
}
public static void main(String[] args){
JFrame frame = new JFrame();
MyDrawPanel panel = new MyDrawPanel();
JLabel label = new JLabel("aaa");
panel.setBackground(Color.blue);
panel.add(label);
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}
}

      可以把paintComponents(g)注释掉再看看效果。
      
      总结了一下:Swing中改变组件样式重写paintComponent就可以了,其他paintBorder和paintChildren默认就可以。awt中改变组件样式要重写paint方法,而且如果不需要调用super.paint(g)就可以保留原组件样式,但是不会显示子组件样式,可以调用paint Components(g)解决这个问题。

### 回答1: Java中的paintComponent是一个方法,用于在Swing组件中绘制图形。它是JComponent类的一个方法,可以在子类中重写。在重写paintComponent方法时,可以使用Java的绘图API来绘制图形,如绘制线条、矩形、圆形、文本等。这个方法在组件需要重新绘制时自动调用,例如当组件被添加到容器中、容器大小改变或者组件需要更新时。重写paintComponent方法可以让我们自定义组件的外观和行为,实现更加灵活的界面设计。 ### 回答2: Java中的paintcomponent()方法是绘制组件的的核心方法之一,是在继承JComponent(或其子类)类中使用的。它被用于在屏幕上为组件绘制图像或其他图形。 当一个组件在屏幕上完全或部分可见时,paintcomponent()方法就会被调用。当需要更新组件的外观或大小等属性时,也会触发它的调用。 在继承JComponent类的时候,必须要重写这个方法来实现具体的绘画逻辑。在paintcomponent()中,可以使用Graphics类的实例来绘制任何形状,包括线条、矩形、多边形、弧形、文字和图像等等。 Javapaintcomponent()方法提供了灵活的绘图接口,可以实现各种视觉效果。在实现线框图形时,可以使用drawline()和drawrect()等方法来创建绘制方式简单的线条和矩形;而在绘制复杂图形时,则需要考虑实现Graphics2D类中的方法。 此外,paintcomponent()方法也支持设置颜色、字体、渐变、阴影和图案等绘图元素,从而创建更为丰富的绘图效果。 总之,paintcomponent()方法在Java的GUI编程中扮演着非常重要的角色,开发者们可以根据具体的需求来实现它以获得所需的视觉效果。 ### 回答3: JavapaintComponent()方法是一个可重写的方法,它位于java.awt.Component中,可用于绘制图形和其他自定义组件。在使用Swing组件创建GUI时,可以使用该方法自定义GUI组件的外观。 使用paintComponent()时,必须绘制图形或其他自定义组件。通常情况下,使用Graphics对象来绘制组件。因为Graphics对象是可变对象,因此必须谨慎使用。 在调用paintComponent()方法之前,必须调用super.paintComponent()方法,以确保重绘之前的所有图形都被清除。 paintComponent()方法可以使用不同类型的Graphics对象进行绘制,包括Graphics、Graphics2D和GraphicsEnvironment。Graphics是一个抽象类,它包含了绘制图形所需的方法和属性。Graphics2D是Graphics的子类,它提供了更多的绘制选项和更高级的绘图能力。GraphicsEnvironment类提供了访问底层图形设备的方法。 绘制图形时,可以使用几何形状、文本、图像和颜色等元素,这些元素可以通过Graphics对象中的各种方法进行设置和修改。一些常用的绘制方法包括drawLine()、drawRect()、drawOval()、drawString()、drawImage()和setColor()等。 绘制完成后,程序还可以调用repaint()方法,以便在需要时重新绘制组件。 总之,paintComponent()是Java编程中常用的方法之一,可以用于自定义GUI组件的外观,并且具有很高的灵活性和可定制性。但是,在使用它时,必须了解绘图基础和使用Graphics对象进行绘图的详细信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值