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. Mysql用户相关操作

    MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...

  2. Android音频系统之AudioFlinger(一)

    1.1 AudioFlinger 在上面的框架图中,我们可以看到AudioFlinger(下面简称AF)是整个音频系统的核心与难点.作为Android系统中的音频中枢,它同时也是一个系统服务,启到承上 ...

  3. ionic常用命令记录

    npm install -g ionic //安装ionic ionic lib update //更新www/lib/ionic 目录的文件,如有项目中有bower,此命令会运行bower upda ...

  4. Ext4.1 , #Ext4.2

    在类中定义url 和 在参数中定义url不同 Ext4.1 和 Ext4.2 处理上有较大的区别

  5. SpringMVC轻松学习-其他常用(四)

    Spring MVC 3.0 深入 核心原理 1.      用户发送请求给服务器.url:user.do 2.      服务器收到请求.发现DispatchServlet可以处理.于是调用Disp ...

  6. 基于LNMP的Zabbbix之PHP源码安装

    安装一些依赖的包 wget -c ftp://xmlsoft.org/libxml2/libxml2-2.7.8.tar.gz .tar.gz -C ../source/ cd ../source/l ...

  7. [Android]SDK安装

    安装Android环境时,出现的问题 //在国内安装Android环境时,经常会因为Google服务器的原因,出现链接失败的问题. Failed to fetch URL http://dl-ssl. ...

  8. form表单传递下拉框的Value和Text值,不适用Jquery传递

    同时获取下拉框的Value和Text值的解决办法:添加一个<input type="text" >文本框,用户选中一项后就将该项的value值给他 然后接受页面获取该文 ...

  9. memcached命令和配置

    转自:http://www.tuicool.com/articles/VJzAvuB 安装配置 首先,编译.安装.配置libevent库,执行如下命令: wget https://github.com ...

  10. 异常捕获拒绝闪退 让应用从容的崩溃UncaughtExceptionHandler

    虽然大家都不愿意看到程序崩溃,但可能崩溃是每个应用必须面对的现实,既然崩溃已经发生,无法阻挡了,那我们就让它崩也崩得淡定点吧. IOS SDK中提供了一个现成的函数 NSSetUncaughtExce ...