zoukankan      html  css  js  c++  java
  • Java Swing jpanel paint方法执行两次的问题

    Java Swing jpanel paint方法执行两次的问题:

    在其他环境下执行了两次,自己测试怎么都是执行了一次,记录一下这个问题;需要后继工作;

    可能是进行各种参数设置的时候导致了paint方法的调用;

    在调试过程中,发现repaint方法会因为各种情况不断的调用;注意JFrame和JPanel是不一样的哦;

    package com.srie.test;
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    public class JFrame002 extends JFrame {
        private static final long serialVersionUID = 1L;
        private JPanel contentPane;
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        JFrame002 frame = new JFrame002();
                        frame.setSize(80, 60);
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        /**
         * Create the frame.
         */
        public JFrame002() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 450, 300);
            contentPane = new JPanel() {
                private static final long serialVersionUID = 1L;
                int j = 10000;
                // 如果override paint方法,就不会执行paintComponent方法
                @Override
                public void paint(Graphics g) {
                    System.out.println("com.srie.test.JFrame002.JFrame002().new JPanel() {...}.paint(Graphics):" + j++);
                }
                @Override
                protected void paintComponent(Graphics g) {
                    System.out.println("com.srie.test.JFrame002.JFrame002().new JPanel() {...}.paintComponent(Graphics):" + j++);
                }
                @Override
                public void update(Graphics g) {
                    System.out.println("com.srie.test.JFrame002.JFrame002().new JPanel() {...}.update(Graphics):" + j++);
                }
                @Override
                public void repaint() {
                    // 最开始打印的时候,j输出的竟然是0,在4种初始化之后,才把j初始化了;
                    System.out.println("com.srie.test.JFrame002.JFrame002().new JPanel() {...}.repaint():" + j++);
                }
            };
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            contentPane.setLayout(new BorderLayout(0, 0));
            // 这个会增加一次repaint方法的调用;
            contentPane.setFont(null);
            // contentPane.setMinimumSize(new Dimension(10, 10));
            setContentPane(contentPane);
        }
        int i = 0;
        // 这个放开了之后,里面的内容都不进行重绘了;只是在初始化的时候里面repaint了6次;
        // @Override
        // public void paint(Graphics g) {
        // System.out.println("com.srie.test.JFrame002.paint(Graphics):" + i++);
        // }
        // 这个不是paintComponent,多了一个s哦;是java.awt.Container的方法;
        @Override
        public void paintComponents(Graphics g) {
            System.out.println("com.srie.test.JFrame002.paintComponents(Graphics):" + i++);
        }
        @Override
        public void update(Graphics g) {
            System.out.println("com.srie.test.JFrame002.update(Graphics):" + i++);
        }
        @Override
        public void repaint() {
            System.out.println("com.srie.test.JFrame002.repaint():" + i++);
        }
    }

    参考:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Date;
    import javax.swing.*;
    public class SimpleGui3C implements ActionListener {
        JFrame frame;
        public static void main(String[] args) {
            SimpleGui3C gui = new SimpleGui3C();
            gui.go();
        }
        public void go() {
            frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JButton button = new JButton("Change colors");
            button.addActionListener(this);
            MyDrawPanel drawPanel = new MyDrawPanel();
            frame.getContentPane().add(BorderLayout.SOUTH, button);
            frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
            frame.setResizable(false);
            frame.setSize(300, 300);
            frame.setVisible(true);
        }
        @Override
        public void actionPerformed(ActionEvent arg0) {
            frame.repaint();
        }
        class MyDrawPanel extends JPanel {
            private static final long serialVersionUID = 1L;
            public void paintComponent(Graphics g) {
                Graphics2D g2d = (Graphics2D) g;
                int red = (int) (Math.random() * 255);
                int green = (int) (Math.random() * 255);
                int blue = (int) (Math.random() * 255);
                Color startColor = new Color(red, green, blue);
                red = (int) (Math.random() * 255);
                green = (int) (Math.random() * 255);
                blue = (int) (Math.random() * 255);
                Color endColor = new Color(red, green, blue);
                GradientPaint gradient = new GradientPaint(70, 70, startColor, 150, 150, endColor);
                g2d.setPaint(gradient);
                g2d.fillOval(70, 70, 100, 100);
                System.out.println(new Date());
            }
        }
    }
  • 相关阅读:
    Java 调用存储过程、函数
    Java BaseDao
    写好Java代码的30条经验总结
    15款Java程序员必备的开发工具
    Oracle基础 表分区
    Oracle基础 索引
    Oracle基础 触发器
    Oracle基础 程序包
    Oracle基础 自定义函数
    Oracle基础 存储过程和事务
  • 原文地址:https://www.cnblogs.com/stono/p/5016388.html
Copyright © 2011-2022 走看看