Swing绘图机制

Posted siwuxie095

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swing绘图机制相关的知识,希望对你有一定的参考价值。

------------------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 的边框设置成 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 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绘图机制的主要内容,如果未能解决你的问题,请参考以下文章

Swing绘图API

清除我的 jpanel 后我无法绘图

java绘图

Java程序设计图形用户界面

Java程序设计图形用户界面

SurfaceView绘图机制