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 Swing jpanel paint方法执行两次的问题的更多相关文章

  1. angularjs 初始化方法执行两次以及url定义错误导致传值错误问题

    1.初始化方法执行两次以上的问题定义一个 route.如下所示:.state('main.channelQryDetail', { url:'/channelDetail/:channelNo/:pa ...

  2. 地址栏访问Action,后来方法执行两次

    SSH框架,在地址栏输入URL访问Action,后台访问会访问两次.很奇怪. 经排查,最终问题在于方法名称写错了.将getOpinionByPN()修改成queryOpinionByPN(),没有问题 ...

  3. 为什么struts2 ajax 方法执行两次

    struts2中使用json插件执行ajax处理时,如果方法名是get方法的时候,方法会莫名其妙的执行两次. 原因: struts2 中JSON的原理是在ACTION中的get方法都会序列化,所以前面 ...

  4. struts2请求两次即action方法执行两次

    如果方法使用get开头,也会出现重复执行问题....对struts2无语!!! [转]http://www.xuebuyuan.com/301066.html 就把get开头的方法修改了一下,程序就运 ...

  5. java 不使用paint方法进行画图

    private Graphics2D g; g = (Graphics2D) getGraphics();

  6. java SWing事件调用的两种机制

      Java(91)  /** * java swing中事件调用的两种机制: * (一)响应机制 * (二)回调机制 */ package test; import java.awt.*; impo ...

  7. [Java] - 格式字符串替换方法

    Java 字符串格式替换方法有两种,一种是使用String.format(...),另一种是使用MessageFormat.format(...) 如下: import java.text.Messa ...

  8. java获取文件大小的方法

    目前Java获取文件大小的方法有两种: 1.通过file的length()方法获取: 2.通过流式方法获取: 通过流式方法又有两种,分别是旧的java.io.*中FileInputStream的ava ...

  9. UITableView的全部属性、方法以及代理方法执行顺序,看过之后肯定有收获---董鑫

    UITableView-------表视图--继承UIScrollView并遵守NSCoding协议 属性 frame-------------设置控件的位置和大小 backgroundColor-- ...

随机推荐

  1. 单源最短路-dijkstra算法(未优化)

    bool used[maxn]; int g[maxn][maxn]; // 边未联系的填充为INF int d[maxn]; void dijkstra(int s){ memset(g,false ...

  2. angular中控制器之间的通讯方式

    1, 利用作用域的继承方式 由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子作用域 ...

  3. 操作IFRAME及元素

    内容里有两个ifame <iframe id="leftiframe"...</iframe> <iframe id="mainiframe..& ...

  4. javascript高级程序设计 重读系列

    1.基本概念.数据类型.函数 1.1 数据类型 ECMAScript中有5种简单数据类型:Undefind,Null,Boolean,Number,String 问题:判断变量是否是空值的代码 解析: ...

  5. HDU 5611 Baby Ming and phone number

    #include<cstdio> #include<cstring> #include<vector> #include<cmath> #include ...

  6. CodeForces 652C Foe Pairs

    只要计算每个位置最多能到哪个位置,累加即可,DP从后往前预处理一下每个位置到达的最远位置. 有坑点:输入的时候如果同一个点出发的,需要保存最小值. #include<cstdio> #in ...

  7. mysql----ERROR 1040 (HY000): Too many connections

    http://gwokae.mewggle.com/wordpress/index.php/archives/683 查看最大链接 mysql -h alg-db14 -u bfdroot -pqia ...

  8. uses crt;

    1.uses CRT,表示引用CRT.pas单元.CRT.pas单元是Pascal最重要的单元之一,主要用于字符界面的操作,里面内置了清屏.光标定位.删除行.调整字符亮度.前景色.背景色等功能函数.2 ...

  9. iOS所有常用证书,appID,Provisioning Profiles配置说明及制作图文教程

    概述: 苹果的证书繁锁复杂,制作管理相当麻烦,今天决定重置一个游戏项目中的所有证书,做了这么多次还是感觉很纠结,索性直接记录下来,日后你我他查阅都方便: 首先得描述一下各个证书的定位,作用,这样在制作 ...

  10. 微信小程序-未接入app.json错误

    微信小程序建立新项目之后会出现app.json文件未接入错误如下图: 一般是因为在下图添加新项目,项目目录这一列,如果不事先建立一个空的文件夹,直接选择则不会出现quickstartup界面 所以在建 ...