java中paint方法和paintComponent方法的不同

简介: /* 1.由Component.java源代码中可以看见其中的paint()方法体是空的,在Container中重写了该方法,其子类Window等也重写了该方法 2.由JComponent.
/*
   1.由Component.java源代码中可以看见其中的paint()方法体是空的,在Container中重写了该方法,其子类Window等也重写了该方法
   2.由JComponent.java源代码中可以看见其中的paint()方法中调用paintComponent, paintChildren, paintBorder等方法;
     所以该类中的paint方法会影响子组件的绘制, 而paintComponent方法只会影响该组件本身

   3.paint方法 和 paintComponent方法都是对一个组件进行渲染的(组件创建并显示之后),并不是产生和显示该组件的!
  
   4.swing 组件和 awt组件 paint方法的不同:awt组件的paint方法有自动刷新背景颜色的功能, 而swing组件一定要调用super.paint()
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class BkGnd extends Frame{
   public BkGnd(){
       setTitle("更换背景!");
       setSize(new Dimension(600, 600));
       setLayout(new FlowLayout());
       myPanelOne panel = new myPanelOne();
       panel.setBackground(Color.yellow);
       panel.setPreferredSize(new Dimension(500, 500));
       myPanelTwo pl = new myPanelTwo();
       pl.setPreferredSize(new Dimension(400, 400));
       pl.setBackground(Color.blue);
       panel.add(pl);
       add(panel);
       addWindowListener(new MyClosingListener());
   }
   public static void main(String args[]){
      BkGnd myFrame = new BkGnd();
      myFrame.setVisible(true);
   }
}

/*
//第一种情况: 如果没有super.paint(g);则该面板上的组件将不能正常显示
//如果加上super.paint(g);那么首先通过该方法将该面板上的组件显示出来,然后在执行super.paint(g);下面的绘图语句。会导致将该面板上的组件覆盖
//父类的paint方法来负责调用paintComponent, paintChildren, paintBorder, update方法
class myPanelOne extends JPanel{
   public void paint(Graphics g){
      super.paint(g);
      g.drawImage(new ImageIcon("zjy1.jpg").getImage(), 0, 0, 400, 400, this);
   }
}


class myPanelTwo extends JPanel{
   public void paintComponent(Graphics g){
      super.paintComponent(g);
      g.drawImage(new ImageIcon("zjy1.jpg").getImage(), 0, 0, 200, 200, this);
   }
}

*/

/*
//第二种就可以的到正常预想的结果
class myPanelOne extends JPanel{
   public void paintComponent(Graphics g){
      super.paintComponent(g);//用于绘制自身面板的背景
      g.drawImage(new ImageIcon("zjy1.jpg").getImage(), 0, 0, 400, 400, this);
   }
}

class myPanelTwo extends JPanel{
   public void paintComponent(Graphics g){
      super.paintComponent(g);
      g.drawImage(new ImageIcon("zjy1.jpg").getImage(), 0, 0, 200, 200, this);
   }
}

*/


//重写Component类中的paint()方法的子类,super.paint(g) 不会影响其子组件。
//第三种的效果等同于第二种的效果(正常的预想的结果)
class myPanelOne extends Panel{
   public void paint(Graphics g){
      //super.paint(g);//加和不加都一样
      g.drawImage(new ImageIcon("zjy1.jpg").getImage(), 0, 0, 400, 400, this);
   }
}

class myPanelTwo extends Panel{
   public void paint(Graphics g){
      g.drawImage(new ImageIcon("zjy1.jpg").getImage(), 0, 0, 200, 200, this);
   }
}

/*
*/

class MyClosingListener extends WindowAdapter{
   public void windowClosing(WindowEvent e){
      System.exit(0);
   }
}

  

目录
相关文章
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
643 1
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
569 1
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
535 0
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
730 16
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
603 83
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
586 0
|
存储 Java 调度
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
637 83