------------------siwuxie095

 
 

 
 

 
 

 
 

 
 

 
 

工程名:TestSwingPaintMethod

包名:com.siwuxie095.swingpaint

类名:SwingPaintMethod.java(主类)、MyPanel.java

 
 

 
 

工程结构目录如下:

 
 

 
 

 
 

 
 

 
 

SwingPaintMethod.java(主类):

 
 

package com.siwuxie095.swingpaint;

 
 

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.EventQueue;

import java.awt.Font;

 
 

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.border.LineBorder;

 
 

 
 

 
 

public class SwingPaintMethod extends JFrame {

 
 

//将原本声明的 JPanel 注释掉,改为 MyPanel

//private JPanel contentPane;

private MyPanel contentPane;

 

 

private JLabel lblNewLabel;

 
 

/**

* Launch the application.

*/

public static
void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

public
void run() {

try {

SwingPaintMethod frame = new SwingPaintMethod();

frame.setVisible(true);

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

 
 

/**

* Create the frame.

*/

public SwingPaintMethod() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(100, 100, 450, 300);

 

//将原本的实例化方式注释掉,改为 MyPanel()

//contentPane = new JPanel();

contentPane = new MyPanel();

 

 

//将 contentPane 的背景设置成
红色

contentPane.setBackground(Color.RED);

contentPane.setBorder(new LineBorder(Color.BLUE, 5));

 

 

contentPane.setLayout(new BorderLayout(0, 0));

setContentPane(contentPane);

 

lblNewLabel = new JLabel("This is a label");

lblNewLabel.setFont(new Font("幼圆", Font.BOLD, 24));

contentPane.add(lblNewLabel, BorderLayout.CENTER);

}

 
 

}

 
 

 
 

 
 

MyPanel.java:

 
 

package com.siwuxie095.swingpaint;

 
 

import java.awt.Graphics;

 
 

import javax.swing.JPanel;

 
 

//通过 Swing 的绘图机制实现 UI 元素的定制和 UI 外观的调整

 
 

//MyPanel 继承自 JPanel

public class MyPanel extends JPanel {

 

//覆盖 JPanel 的四个方法,右键->Source->Override/Implement Methods->JComponent

//paint()、paintComponent()、paintBorder()、paintChildren()

 

 

 

//paint() 方法是当前组件被更新时系统自动调用的方法

//paint() 会自动调用 paintComponent()、paintBorder()、paintChildren()

//即
每当一个组件被更新,四个方法都会被系统自动调用

@Override

public
void paint(Graphics arg0) {

System.out.println("1---paint()");

//如果将 super.paint(arg0); 注释

//则只会输出 1---paint(),其他三个方法均不会被调用

super.paint(arg0);

}

 
 

//paintBorder() 方法是当前组件绘制自身的边缘(边框)所调用的方法

@Override

protected
void paintBorder(Graphics arg0) {

System.out.println("3---paintBorder()");

//如果将 super.paintBorder(arg0); 注释

//则不会执行绘制边框操作

super.paintBorder(arg0);

}

 
 

//paintChildren() 方法是当前组件绘制其中的子对象所调用的方法

@Override

protected
void paintChildren(Graphics arg0) {

System.out.println("4---paintChildren()");

//如果将 super.paintChildren(arg0); 注释

//则运行时当前组件的子对象不会被显示

//(本例:当前组件是 contentPane,子对象:JLabel)

super.paintChildren(arg0);

}

 
 

//paintComponent() 方法是当前组件绘制自身所调用的方法

@Override

protected
void paintComponent(Graphics arg0) {

System.out.println("2---paintComponent()");

//如果将 super.paintComponent(arg0); 注释

//则当前组件本身将不会被绘制

super.paintComponent(arg0);

}

 

}

 
 

 
 

 
 

修改 SwingPaintMethod.java(主类) 中的 contentPane 的

声明与实例化方式:

 
 

 
 

 
 

 
 

 
 


contentPane 的 background 属性设定为 红色

 
 

将 contentPane 的 border 属性设定为 LineBorder,并把颜色

(Color)设为 蓝色,边框厚度(Thickness)设为 5

 
 

「注意:操作在
Design 中完成,代码是自动生成的」

 
 

 
 

 
 

 
 


contentPane 的中间添加一个 JLabel,并将文本(text)

改为:This is a label,Rename 为:label,简单设置其属性

 
 

 
 

 
 

 
 

 
 


MyPanel.java 中覆盖 JPanel 的四个方法,右键->Source

->Override/Implement Methods->JComponent

 
 

(1)paint()

(2)paintComponent()

(3)paintBorder()

(4)paintChildren()

 
 

 
 

准备完毕,运行程序:

 
 

 
 

 
 

 
 

 
 

此时,如果将窗体放大

缩小,系统会连续循环调用这 4 个方法:

 
 

 
 

 
 

 
 

 
 

 
 

(1)如果将 super.paint(arg0); 注释

 
 

 
 

 
 

运行程序:所有设置都没有生效

 
 

 
 

 
 

 
 

 
 

 
 

(2)如果将 super.paintComponent(arg0); 注释

 
 

 
 

 
 

运行程序:contentPane 的背景色没有生效

 
 

 
 

 
 

 
 

 
 

 
 

(3)如果将 super.paintBorder(arg0); 注释

 
 

 
 

 
 

运行程序:contentPane 的边框没有生效

 
 

 
 

 
 

 
 

 
 

 
 

(4)如果将 super.paintChildren(arg0); 注释

 
 

 
 

 
 

运行程序:JLabel 的设置没有生效

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

【made by siwuxie095】

Swing绘图机制的更多相关文章

  1. Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧

    第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...

  2. SurfaceView绘图机制

    一.为什么需要用SurfaceView绘图,不直接继承View绘图 它的特性是:可以在主线程之外的线程中向屏幕绘图上.这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度.在游戏开发 ...

  3. Android群英传笔记——第六章:Android绘图机制与处理技巧

    Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效 ...

  4. Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美

    Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目 ...

  5. Android绘图机制(三)——自定义View的实现方式以及半弧圆新控件

    Android绘图机制(三)--自定义View的三种实现方式以及实战项目操作 在Android绘图机制(一)--自定义View的基础属性和方法 里说过,实现自定义View有三种方式,分别是 1.对现有 ...

  6. Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解

    Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆 ...

  7. Android绘图机制(一)——自定义View的基础属性和方法

    Android绘图机制(一)--自定义View的基础属性和方法 自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目 ...

  8. swing线程机制

    在介绍swing线程机制之前,先介绍一些背景概念. 背景概念 同步与异步:     同步是指程序在发起请求后开始处理事件并等待处理的结果或等待请求执行完毕,在此之前程序被阻塞(block)直到请求完成 ...

  9. 编写Java程序,使用Swing事件处理机制实现用户登录和英雄信息显示

    返回本章节 返回作业目录 需求说明: 使用Swing事件处理机制实现用户登录和英雄信息显示 实现思路: 创建LoginView类,该类用于显示登录界面,为登录按钮添加ActionListener事件, ...

随机推荐

  1. 《Advanced Bash-scripting Guide》学习(十三):引用变量的两个例子

    本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 例1. 使用""可以防止单词分割,将变量看成一个整体,没有& ...

  2. Hadoop2.5.2+HA+zookeeper3.4.6详细配置过程

    心血之作,在熟悉hadoop2架构的过程耽误了太长时间,在搭建环境过程遇到一些问题,这些问题一直卡在那儿,不得以解决,耽误了时间.最后,千寻万寻,把问题解决,多谢在过程提供帮助的大侠.这篇文章中,我也 ...

  3. hdu-1102-Constructing Roads(Prim算法模板)

     题目链接 /* Name:hdu-1102-Constructing Roads Copyright: Author: Date: 2018/4/18 9:35:08 Description: pr ...

  4. 20165210 预习作业3 Linux安装及学习

    Linux安装及学习 一.Linux安装 通过参考教程:基于VirtualBox虚拟机安装Ubuntu图文教程成功的安装上了Linux但在过程中还是有一些小问题的. 首先按着步骤走,一开始没什么毛病, ...

  5. Object 的一个问题

    var s1 = 'abc';     s1 instanceof String //false var s2 = new String('abc');     s2 instanceof Strin ...

  6. 树莓派相机操作 —— luvcview 的安装、raspistill:摄像头命令

    MMAL (Multimedia Abstraction Layer) RaspiCam Documentation 0. lucview 的安装 安装命令:sudo apt-get install ...

  7. Azure Managed Disk

    Azure的磁盘存储是保存在存储账户中的Page Blob.由于Azure Storage Account的各种限制,在设计VM的磁盘存储时,要符合Azure磁盘存储账户的最佳实践,请参考:http: ...

  8. 安装CenOS7.4 LNMP环境

    从头开始安装环境 1.在vmware中安装最新的CentOS7.4 linux版本下载地址:http://man.linuxde.net/download/ 下载好的东东为:iso后缀的文件 安装教程 ...

  9. 自己封装的AJAX (带JSON)

    最简单的封装的AJAX: function myajax(url,onsuccess,fail){ //确定是否支持xhr var xhr = new XMLHttpRequest ? new XML ...

  10. HDU4006(小根堆)

    The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Oth ...