------------------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 SwingPaintMethodextends JFrame {
//将原本声明的 JPanel 注释掉,改为 MyPanel
//private JPanel contentPane;
private MyPanel contentPane;
private JLabel lblNewLabel;
/**
* Launch the application.
*/
public staticvoid main(String[] args) {
EventQueue.invokeLater(new Runnable() {
publicvoid 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 的边框设置成 LineBorder、蓝色、厚度为 5
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 MyPanelextends JPanel {
//覆盖 JPanel 的四个方法,右键->Source->Override/Implement Methods->JComponent
//paint()、paintComponent()、paintBorder()、paintChildren()
//paint()方法是当前组件被更新时系统自动调用的方法
//paint()会自动调用 paintComponent()、paintBorder()、paintChildren()
//即每当一个组件被更新,四个方法都会被系统自动调用
@Override
publicvoid paint(Graphics arg0) {
System.out.println("1---paint()");
//如果将 super.paint(arg0); 注释
//则只会输出 1---paint(),其他三个方法均不会被调用
super.paint(arg0);
}
//paintBorder()方法是当前组件绘制自身的边缘(边框)所调用的方法
@Override
protectedvoid paintBorder(Graphics arg0) {
System.out.println("3---paintBorder()");
//如果将 super.paintBorder(arg0); 注释
//则不会执行绘制边框操作
super.paintBorder(arg0);
}
//paintChildren()方法是当前组件绘制其中的子对象所调用的方法
@Override
protectedvoid paintChildren(Graphics arg0) {
System.out.println("4---paintChildren()");
//如果将 super.paintChildren(arg0); 注释
//则运行时当前组件的子对象不会被显示
//(本例:当前组件是 contentPane,子对象:JLabel)
super.paintChildren(arg0);
}
//paintComponent()方法是当前组件绘制自身所调用的方法
@Override
protectedvoid 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】
