java的repaint()没有重绘,怎么回事呀。

package chapter17;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class showRadioButton extends JFrame{

/**
 * @param args
 */
showRadioButton(){
    creatButtonPanel bp =new creatButtonPanel();
    messagePanel mp = new messagePanel();

    setLayout(new BorderLayout());
    add(bp,BorderLayout.SOUTH);
    add(mp,BorderLayout.CENTER);

    messagePanel  messagepanel = new messagePanel();
    setSize(800,600);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}
public static void main(String[] args) {
    // TODO 自动生成的方法存根
    showRadioButton srb = new showRadioButton();


}
//生成String,并操作String
class messagePanel extends JPanel{
    private String s = "Welcome to Java";
    private boolean bl = true;
    private int x ;
    private int y ;

    // 第一次绘制图形
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        // 设置string的位置   
        if(bl == true){
            FontMetrics fm = g.getFontMetrics();
            int sw = fm.stringWidth(s)/2;
            int sh = fm.getAscent()/2;
            x = getWidth()/2 - sw;
            y = getHeight()/2 - sh;
            //开始绘制sting并且设置布尔值
            g.drawString(s,x,y);
            bl = false;
        }else{
            g.drawString(s,x,y);
        }
    }
    //重绘方法
    protected  void left(){
        x = x - 50;
        repaint();
    }
    public void right() {
        x = x + 50;
        repaint();
    }
}

//绘制button按钮并出册事件

class creatButtonPanel extends JPanel{
    public creatButtonPanel(){
    JButton jbtl = new JButton("left");
    JButton jbtr = new JButton("rigtht");
    jbtl.setMnemonic('L');
    jbtr.setMnemonic('R');
    //showRadioButton srb = new showRadioButton();


    add(jbtl);
    add(jbtr);
    jbtl.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            messagePanel mp = new messagePanel();
            mp.left();                    // 重要   外部类调用内部类
        }
    });
    jbtl.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            new messagePanel().right();
        }
    });
    //return buttonPanel;
    }
}

}


0

2个回答

你对象是内部类的,超出这个作用域之后会直接销毁,那么你每次重绘的都是不一样的对象,而不是同一个,每次都新建对象,你将这个对象设置为全局的看一下

1
qq_36788865
qq_36788865 一语中的
2 年多之前 回复

package chapter17;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class showRadioButton extends JFrame{

/**
 * @param args
 */
showRadioButton(){
    creatButtonPanel bp =new creatButtonPanel();
    messagePanel mp = new messagePanel();

    setLayout(new BorderLayout());
    add(bp,BorderLayout.SOUTH);
    add(mp,BorderLayout.CENTER);

    messagePanel  messagepanel = new messagePanel();
    setSize(800,600);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}
public static void main(String[] args) {
    // TODO 自动生成的方法存根
    showRadioButton srb = new showRadioButton();


}
//生成String,并操作String
class messagePanel extends JPanel{
    private String s = "Welcome to Java";
    private boolean bl = true;
    private int xn ;
    private int yn ;
    private int q = 1;



    // 第一次绘制图形
    protected void paintComponent(Graphics g){
        System.out.println("a");
        super.paintComponent(g);
        if(bl == true){
            // 设置string的位置   
            FontMetrics fm = g.getFontMetrics();
            int sw = fm.stringWidth(s)/2;
            int sh = fm.getAscent()/2;
            int x = getWidth()/2 - sw;
            int y = getHeight()/2 - sh;
            xn = x;
            yn = y;

            //开始绘制sting并且设置布尔值
            g.drawString(s,xn,yn);
            bl = false;
            System.out.println(q++);
        }else{
            g.drawString(s,xn,yn);
        }
    }
    //重绘方法
    protected  void left(){
        xn = xn - 50;
        repaint();
        System.out.println("left" + q++);
    }
    public void right() {
        xn = xn + 50;
        repaint();
    }
}

//绘制button按钮并出册事件

class creatButtonPanel extends JPanel{
    public creatButtonPanel(){
    JButton jbtl = new JButton("left");
    JButton jbtr = new JButton("rigtht");
    jbtl.setMnemonic('L');
    jbtr.setMnemonic('R');
    //showRadioButton srb = new showRadioButton();


    add(jbtl);
    add(jbtr);
    jbtl.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            new messagePanel().left();
                                // 重要   外部类调用内部类
        }
    });
    jbtl.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            new messagePanel().right();
        }
    });
    //return buttonPanel;
    }
}

}


0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
笔记:repaint实时重绘问题
GUI创建在某个函数时,当这个函数休眠时,那么GUI也会处于休眠状态 所以用void change(){ for(int i=0;i<10000;i++){ frame.repaint(); for(Shape s:vs) {dx=Math.random()*0.8; dy=Math.random()*0.6; alpha=Math.random()*0.36; s.move(dx, dy
repaint重绘不消除之前图像问题
好久没写过Java界面的程序,一写就搞不定: 如下,就是一个小球在在几面里来回移动的问题public class ReboundPanel extends JPanel { private final int WIDTH = 300, HEIGHT = 100; private final int DELAY = 20; private Timer timer; p
什么是浏览器的重排(reflow)和重绘 (repaint)?如何减少重排和重绘?
重绘 重绘是一个元素外观的改变所触发的浏览器行为,例如改变visibility、outline、背景色等属性。浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。重绘不会带来重新布局,并不一定伴随重排。 重排 当DOM变化影响了元素的几何属性(宽、高改变等等) 浏览器此时需要重新计算元素几何属性 并且页面中其他元素的几何属性可能会受影响 这样渲染树就发生了改变,也就是重新构造RenderTree渲染树 这个过程叫做重排(reflow)
关于重绘(repaint)和回流(reflow)以及如何优化
欢迎访问我的个人网站 xiaolongwu.cn 什么是页面的重绘与回流 当页面中的部分或者全部元素改变宽度和高度、或者位置发生变化、删除或者增加某个或者某些元素时、某个元素影藏或者显示时,这时页面就需要重新加载了,这就叫做回流。 当页面的中的可见性发上变化时,比如:背景颜色吗,文字颜色等,这样就形成了重绘。 注:从上面可以看出,回流必将引起重绘,而重绘不一定会引起回流。 怎么...
Graphics 与 repaint 方法
Graphics 与 repaint 方法
Java GUI中repaint方法延时问题
在上课做的题目里, 做出了一个迷宫, 在迷宫里有两只老鼠, 现在希望每1秒老鼠移动一次在迷宫中的位置, 我的想法最初是, 调用repaint函数和Thread.sleep(1000)实现每秒重绘移动一次位置, 代码大概这样: for(int i=0;i&amp;amp;lt;10;i++){ mouse.move(); try { Thread.sleep(100); } catch(Int...
提升页面性能之重排(reflow)和重绘(repaint)
提出问题: JavaSctipt 操作改变元素样式的四种方法之一,element.style.cssText=”width:20px;height:20px;border:solid 1px red;”这样简写比一次次地element.style.width = 20 + 'px'...添加,会**避免页面的重构(refolw),提升页面行性能**。首先我们要了解浏览器的渲染机制(也就是我们写的H...
对于用到repaint带来问题的解决方案
先简单描述一下我遇到的问题;        做一个汉字部件系统要求把整张表的内容查找显示出来,而我的内容就用g.drawstring()来绘制的,需调用repaint()方法来清除上一次显示的内容,我当时想的是用一个for循环来搞定就行了,每次g.drawstring()之前先repaint(),但是想想总是美好的,发现很坑要不就是内容闪现一下不见了要不就是循环显示内容全部重叠在一起,想要改之前
java画图总结之三(常用方法paint,repaint,update)
三,常用方法paint,repaint,update 这个问题的由来是因为,我在编写java小程序,画图的时候,发现我重写了paint(graphics g)方法,而执行的时候调用的是repaint()无参方法。老师说,repaint里面间接调用了paint方法。但是是如何间接调用的呢?repaint方法里面是否new了一个graphics对象呢然后传给paint呢? 首先paint方法,并不
Java中repaint方法清除原来图像问题
虽然Java界面编程作用不大,但在兴趣的驱使下还是了解了一下,在写小程序的时候发现了repaint方法有时候会清理原来的图像,有时候又不清理。下面贴出我通过API文档得出的结论。 程序作用:每点击一次,窗口上就多出一个小圆。 情形一:
重绘与回流
重绘:当渲染树中的元素外观(如:颜色)发生改变,不影响布局时,产生重绘 回流:当渲染树中的元素的布局(如:尺寸、位置、隐藏/状态)发生改变时,产生重绘(回流) 注意:JS获取Layout属性值(如:offsetLeft、scrollTop、getComputedStyle等)也会引起回流。因为浏览器需要通过回流计算最新值。 回流必将引起重绘,而重绘不一定会引起回流。 如何最小化repain...
QT update和repaint
qt 中更新界面和重绘的问题
java中的重绘
三种重绘总结: Q:为什么要重绘? A:因为在画板上作画的时候图形是保存在缓存里面而不是保存在内存里面的。因此当我们把画板最小化的时候,缓存中储存的图形内容就会被释放清空,但是      内存里面并没有存储数据,所以再恢复窗体的时候只有窗体上的组件会被重绘,图形的内容已经消失。 How to dispose it??        上面说了窗体或者面板会在恢复时自动重绘窗体或者面板上已经添加的组件...
Java小程序之高级画板重绘篇I
Java小程序之高级画板重绘篇I 前言:我们完成的高级画板在最小化后,然后最大化,画板上绘制的图形全都会消失不见了。原因已在前面的博客中解释,这里不再累赘;今天就让我们一起来解决这个小bug吧! 画板重绘思路: 1、定义直线,椭圆,矩形,圆角矩形等类; 2、在绘制图形的时候生成相应的对象; 3、利用容器将对象进行保存; 4、利用重绘方法,将容器中的对象拿出来,进行重绘;
java中paint,repaint,update之间的关系(闪烁问题的解决)
最近总结了一下java中的paint,repaint和updata三者之间的关系,首先咱们都知道用paint方法来绘图,用repaint重绘,用update来写双缓冲。但是他们之间是怎么来调用的呢,咱们来分析一下(想直接看结果,请跳过分析过程): -------------------------------------------------------------------------
java新手,用repaint方法重新绘图
最近在学习paint方法的使用,想着用一个按钮来改变背景图片(就像我们平时做的那样),然后各方查资料。当然,资料是查不到多少的,因为百度首页的前几页的那几个博客,除了一个原创之外(虽然写的很晦涩难懂),其他的都是滥竽充数之徒!最让我恼火的是百度知道里面的登徒子,一个个为了点点积分而胡乱回答,真不知道那几位问问题的同路那个时候想法。     所以我决定把我自己的repaint代码贴上,因为我冥思苦
reflow和repaint理解总结
repaint就是重绘,reflow就是回流    严重性:    在性能优先的前提下,reflow的性能消耗要比repaint的大。   体现:   repaint是某个dom元素进行重绘,reflow是整个页面进行重排,也就是对页面所有的dom元素渲染。   如何触发reflow和repaint   repaint的触发:   1)不涉及任何dom元素的排版问题的变动为repai
java界面的面板重绘
今天是超哥给我讲课,给我讲了我的五子棋的不足和bug。我的五子棋一旦拉伸边框和最小化还原,面板上的旗子就会消失不见,超哥给我讲了在JPanel的构造方法了直接重写paint()方法,就可以了,之后还给悔棋按钮添加了悔棋的动作监听机制以及添加了音乐。 public void paint(Graphics g){ super.paint(g); for(int i=0;i<s
图像化界面paint,repaint方法的总结
JAVA 画图中出现的paint()函数 问题:小弟刚学JAVA,有一个问题。以下是一段JAVA代码,它弹出了一个窗口,并在窗口上使用paint()画出矩形、椭圆、扇面等图形。但鉴于paint()并不在main()中执行,所以它会一次画完。现在我想让画图行为受用户控制,比如说,开始只有一个空白窗口。当用户输入1,画出矩形。用户输入2,擦掉矩形。用户输入3,画出椭圆。等等等等。 所以小弟应该如何做?...
QWindow重绘、避免闪烁
1.处理重绘事件的函数 QWindow的重绘与QWidget重绘有点不一样,QWindow的没有提供PaintEvent相关的函数,这个时候可以重写下面的虚函数,在里面对Paint事件进行处理: [virtual protected] bool QWindow::event(QEvent *ev) 2.重绘的Painter 在QWindow中,获取一个QPainter对象可以通过QBacking...
repaint重绘
问个很菜的问题,多线程repaint如何控制重绘paint时间间隔rnrn我的代码:rnrnimport java.awt.*;rnimport java.applet.*;rnimport java.util.Calendar;rnpublic class pro extends Appletrnrn public void paint(Graphics g)rn rn Calendar c=Calendar.getInstance();rn g.drawString("当前时间:"+c.get(c.YEAR)+"年"+c.get(c.MONTH)+"月"+c.get(c.DATE)+"日",10,10);rn g.drawString("当前时间:"+c.get(c.HOUR)+"时"+c.get(c.MINUTE)+"分"+c.get(c.SECOND)+"秒",10,25);rn repaint();rn rn rn如何让他每隔2秒刷新一次
java问题1解决方法:repaint()(更新ing)
不久前发的问题博客,绘制对象撤销的问题,前几天看到一个repaint()方法, 试了一下,棋盘是全部撤销了,也能够重新下了,但是也有了新问题:悔棋这一步骤做不下去了,主要是对repaint()方法的认识还不够,现在java学的还是初步吧,以后继续更新这篇博客。        问题:http://blog.csdn.net/thehide/article/details/49804319if (i
【Qt5】频繁调用update()若干时间后无法自动重绘界面的问题
最近在项目中遇到了这样的问题:程序的结构:主线程用于界面控制,线程1用于生成显示内容,线程2用于精确控制在正确的时刻控制界面显示生成的内容。实现方式:在线程2中直接调用显示控件的update()方法,让主线程重绘。运行效果:运行开始后的一段时间能够正常工作,但是几个小时后,会出现调用update()方法不能让控件重绘,显示控件一直显示旧的内容。但是可以通过缩放界面窗口等方法,让窗口自己重绘,能显示...
Java之repaint()定时刷面板问题及演示代码(附滚动条实现)
问题:1、绘画面板主要是UI线程执行,所以要注意:如果你在主线程中休眠,UI线程也会休眠,导致界面覆盖、卡顿等现象 解决:开辟一个异步线程,定时休眠,在调用repaint()重绘面板 如: new Thread(new Runnable() { public void run() { while (true) { try { ...
java龟兔赛跑中关于线程调用repaint无效
java龟兔赛跑中关于线程调用repaint无效 参照了 https://bbs.csdn.net/topics/390752602 按照在线程中只改变一个已经声明的面板用repaint方法使小圆点移动的想法 进行编写但是画面仍是没有改变。 import java.awt.Color; import java.awt.Graphics; import java.util.ArrayList; im...
前端试题今日笔记
1.下列说法正确的是()   A display: none;不为被隐藏的对象保留其物理空间;  B visibility:hidden;所占据的空间位置仍然存在,仅为视觉上的完全透明;  C visibility:hidden;产生reflow和repaint(回流与重绘);  D visibility:hidden;与display: none;两者没有本质上的区别; 解答:disp
浏览器渲染页面原理,reflow、repaint及其优化
浏览器的主要组件包括:1.      用户界面 - 包括地址栏、前进/后退按钮、书签菜单等。除了浏览器主窗口显示的你请求的页面外,其他显示的各个部分都属于用户界面。2.      浏览器引擎 - 在用户界面和渲染引擎之间传送指令。3.      渲染引擎 - 负责显示请求的内容。如果请求的内容是 HTML,它就负责解析 HTML 和 CSS 内容,并将解析后的内容显示在屏幕上。4.      网络...
重绘与回流(repaint和reflow)
reflow:回流 回流:指计算页面布局。render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流,每个页面至少需要一次回流,就是在页面第一次加载的时候。 repaint :重绘 重绘:当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color。则就叫称为重绘。
回流(reflow)与重绘(repaint)
一.明确概念 首先我们要明确页面在文档加载完成之后到完全显示中间的过程是1.根据文档生成DOM树(包括display:none的节点)2.在DOM树基础上根据节点的几何属性(margin/padding/width/height等)生成render树(不包括display:none、head节点但会包含visibility:hidden节点)3.在render树基础上进行进一步渲染包括col
java两种重绘方式的比较
[size=large]两种重绘方式的比较 重绘,顾名思义,就是重新绘画的意思,因为画上去的图案在计算机刷新后就没有了,因为没有存到内存中,所以,我们要进行重绘,将画过的内容保存起来。 保存的方法有2种,一种是利用队列,将画过的图像均保存起来,这种保存方式适用于较简单的图案或者进行了较简单的操作。这种方法,首先要创建一个队列,或者用系统自带的队列,然后,创建一个抽象类,其中创建一个抽象的方法,...
CAD标志框促销宣传促销
怎么回事呀,一直上传不了,我快崩溃了。
java 画板repaint后面的语句不执行
查了半天没找到解决方法。 于是自己想了一个代替方法: 1.把要重绘的曲线用背景色先画一遍。 2.再画新的曲线。
前端性能原理解读(一)
1、网页的生成过程   要了解网页性能好不好,那就必须先了解网页是怎么生成的 HTML转换为DOM节点 CSS转换为CSSOM(CSS Object Model) DOM与CSSOM结合生成一个渲染树(包含每一个节点的视觉信息) 生成布局:即将所有渲染树的所有节点进行平面合成 将布局绘制(paint)在屏幕上   这五步里面,第一步到第三步都非常快,耗时的是第四步和第五步。...
重绘和重排
重绘不一定需要重排(比如颜色的改变),重排必然导致重绘(比如改变网页位置) DOM的变化影响了元素的几何属性,浏览器需要重新计算元素的几何属性,同时其他元素的几何属性和位置也会受到影响,浏览器会使渲染树中受到影响的部分失效,并重新构造渲染树,这个过程是重排,浏览器会重新绘制受到影响的部分到屏幕,这个过程叫重绘。 1&amp;gt;重排(Reflow):当渲染树的一部分必须更新并且节点的尺寸发生了变化,...
qwtPlot实现清屏重绘
#include &quot;readflowpoint.h&quot; #include &quot;qfile.h&quot; #include &quot;qmessagebox.h&quot; #include &quot;qwt_legend.h&quot; #include &quot;qwt_plot_grid.h&quot; #include &quot;qwt_scale_draw.h&quot; #include &quot;qdatetime.h&quot; #include &qu
Qt中update()和repaint()的源码分析
Qt中update()和repaint()的源码分析
Android绘制图形(重绘方法在此可以找到)
package com.example.k.myapplication; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Pai
双缓冲解决Java绘图严重闪烁
在编写一个Java小游戏时,需要画出一个坦克,于是在坦克这个类中创建了一个内部类实现Runnable接口来启动一个线程,在线程中调用repaint()方法不断重画,线程的睡眠时间设为50毫秒,代码如下: 结果发现,运行时闪烁现象特别明显,更改睡眠时间为100秒,1000秒也不行,延迟非常严重,而且仍然闪烁。网上查到原来是因为repaint()不断调用paint
前端性能优化 —— reflow(回流)和repaint(重绘)
简要:整个在浏览器的渲染过程中(页面初始化,用户行为改变界面样式,动画改变界面样式等)reflow(回流)和repaint(重绘) 会大大影响web性能,尤其是手机页面。因此我们在页面设计的时候要尽量减少reflow和repaint。 什么是reflow和repaint(原文链接:http://www.cnblogs.com/Peng2014/p/4687218.html) reflo
reflow回流 repaint重绘 硬件加速
浏览器处理动画顺序 获取dom:获得我们所有的dom树 分割图层:浏览器根据z-index,和脱离了原来dom层的dom解构进行分层。 计算样式:分解图层完毕后,将所有的图层批量进行样式计算。这里有些属性是CPU去计算的,有些属性是GPU去计算的,具体哪些,请看下文。 reflow-relayout-paint set up-repaint:这一系列过程其实是页面从回流到重绘发生的步骤...