Swing绘图机制

    xiaoxiao2021-03-25  105

    ------------------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】

    转载请注明原文地址: https://ju.6miu.com/read-20114.html

    最新回复(0)