zoukankan      html  css  js  c++  java
  • 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】

  • 相关阅读:
    hdu5249
    hdu5673-Robot
    hihoCoder 1033
    simpleOS 1.0
    hdu3511-Prison Break
    单调栈
    关于每次取PC的值为PC+4的问题
    hdu3652
    Linux MySQL5.7.18安装手册
    Linux MySQL5.6.36安装手册
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6666232.html
Copyright © 2011-2022 走看看