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