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
JPanel repaint不清除之前图案的问题
最近OO作业要写电梯。。。 我负责写演示动画,好久没碰java了,手生啊。 我先想试试用JPanel实现一个简单的动画效果。  import javax.swing.*;import java.awt.*;import java.awt.event.*;class mypanel extends JPanel { public int x1, x2, x
reflow(回流)和repaint(重绘)及其优化
为什么不能用CSS通配符 *,CSS选择器层叠为什么不能超过三层,CSS为什么尽量使用类选择器,书写HTML为什么少使用table,为什么结构要尽量简单-DOM树要小…. 对于DOM结构中的各个元素都有自己的盒子(模型),这些都需要浏览器根据各种样式(浏览器的、开发人员定义的等)来计算并根据计算结果将元素放到它该出现的位置,这个过程称之为reflow; 当各种盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定
Qt重绘之update,repaint详解(转)
  Qt里面的重绘和Windows编程里面的重绘差不多。但是Qt的重绘更有特色,更加智能。 在讲之前,先说说paintEvent() paintEvent()是一个虚函数槽(slot),子类可以对父类的paintEvent进行重写。当调用 update(),repaint()的时候,paintEvent()会被调用,另外,当界面有任何改变的时候,paintEvent
什么是浏览器的重排(reflow)和重绘 (repaint)?如何减少重排和重绘?
重绘 重绘是一个元素外观的改变所触发的浏览器行为,例如改变visibility、outline、背景色等属性。浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。重绘不会带来重新布局,并不一定伴随重排。 重排 当DOM变化影响了元素的几何属性(宽、高改变等等) 浏览器此时需要重新计算元素几何属性 并且页面中其他元素的几何属性可能会受影响 这样渲染树就发生了改变,也就是重新构造RenderTree渲染树 这个过程叫做重排(reflow)
swing 中重写repaint方法后画图会出现闪烁或者不及时更新的解决方法
1:往上流传的是双缓冲区的解法,但是这样会对内存照成浪费,并且如果在分布式应用中采用此方法,后果是很严重的2:究其原因,是我们在repaint触发时,没有将当前绘制的图形进行显示import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.MouseAdapt
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...
【java.repaint】制作动画时的刷新
repaint()   2008-07-14 10:50 星期一   repaint()这个方法是一个具有刷新页面效果的方法,如果你要页面进行重画就可以调用.一般都是在AWT的图形绘制当中调用的到.那么该方法具体的工作原来是怎么样的呢?看下面的结构流程图你就可以大概的了解了:          repaint()方法    |    |    V    AWT线程--->
对于用到repaint带来问题的解决方案
先简单描述一下我遇到的问题;        做一个汉字部件系统要求把整张表的内容查找显示出来,而我的内容就用g.drawstring()来绘制的,需调用repaint()方法来清除上一次显示的内容,我当时想的是用一个for循环来搞定就行了,每次g.drawstring()之前先repaint(),但是想想总是美好的,发现很坑要不就是内容闪现一下不见了要不就是循环显示内容全部重叠在一起,想要改之前
关于重绘(repaint)和回流(reflow)以及如何优化
欢迎访问我的个人网站 xiaolongwu.cn 什么是页面的重绘与回流 当页面中的部分或者全部元素改变宽度和高度、或者位置发生变化、删除或者增加某个或者某些元素时、某个元素影藏或者显示时,这时页面就需要重新加载了,这就叫做回流。 当页面的中的可见性发上变化时,比如:背景颜色吗,文字颜色等,这样就形成了重绘。 注:从上面可以看出,回流必将引起重绘,而重绘不一定会引起回流。 怎么...
Java 重新绘制JButton
使用paintComponent()方法绘制的各种Button: 正常状态: 获得焦点状态: 被按下状态: 被释放状态: 实现代码: package com.han; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import
提升页面性能之重排(reflow)和重绘(repaint)
提出问题: JavaSctipt 操作改变元素样式的四种方法之一,element.style.cssText=”width:20px;height:20px;border:solid 1px red;”这样简写比一次次地element.style.width = 20 + 'px'...添加,会**避免页面的重构(refolw),提升页面行性能**。首先我们要了解浏览器的渲染机制(也就是我们写的H...
Swing什么时候使用repaint()
你需要明白布局的原理,平时使用布局是应该的,只要你有窗口缩放的要求,比如自动适应不同屏幕分辨率的最大化和还原。我们应该“通知Swing窗口内组件变化了,需要重新计算大小位置”然后告诉Swing 重绘 repaint(). 现在你的程序是自己定位坐,因此程序的窗口的尺寸必须是固定的,不能改,这样才可以不使用布局。
java中的重绘
三种重绘总结: Q:为什么要重绘? A:因为在画板上作画的时候图形是保存在缓存里面而不是保存在内存里面的。因此当我们把画板最小化的时候,缓存中储存的图形内容就会被释放清空,但是      内存里面并没有存储数据,所以再恢复窗体的时候只有窗体上的组件会被重绘,图形的内容已经消失。 How to dispose it??        上面说了窗体或者面板会在恢复时自动重绘窗体或者面板上已经添加的组件...
重绘(redraw或repaint),重排(reflow)的理解
重绘(redraw或repaint),重排(reflow) 浏览器运行机制图: 浏览器的运行机制:layout:布局; 1、构建DOM树(parse):渲染引擎解析HTML文档,首先将标签转换成DOM树中的DOM node(包括js生成的标签)生成内容树(Content Tree/DOM Tree); 2、构建渲染树(construct):解析对应的CSS样式文件信息(包括js生成的样...
java新手,用repaint方法重新绘图
最近在学习paint方法的使用,想着用一个按钮来改变背景图片(就像我们平时做的那样),然后各方查资料。当然,资料是查不到多少的,因为百度首页的前几页的那几个博客,除了一个原创之外(虽然写的很晦涩难懂),其他的都是滥竽充数之徒!最让我恼火的是百度知道里面的登徒子,一个个为了点点积分而胡乱回答,真不知道那几位问问题的同路那个时候想法。     所以我决定把我自己的repaint代码贴上,因为我冥思苦
Graphics 与 repaint 方法
Graphics 与 repaint 方法
回流(reflow)和重绘(repaint)以及两者的区别
1.总结 reflow(回流):对DOM树进行渲染,只要修改DOM或修改元素的形状大小,就会触发reflow。 display显示/隐藏元素,显示时占据空间,隐藏时元素不占据空间,隐藏前后dom结构有发生变化,需要重新渲染。 visibility显示/隐藏元素,显示时占据空间,隐藏时元素占据空间,隐藏前后dom结构未发生变化,不需要重新渲染。 单纯改变字体颜色,背景只需要repaint(重绘),不...
repaint方法使用和说明
repaint 重绘此组件。如果组件是轻量组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。 目录 1方法 2工作原理 1方法编辑 repaint()方法用于重绘组件,该方法有下面四种形式: 1。public void repaint() 2。p
java画图总结之三(常用方法paint,repaint,update)
三,常用方法paint,repaint,update 这个问题的由来是因为,我在编写java小程序,画图的时候,发现我重写了paint(graphics g)方法,而执行的时候调用的是repaint()无参方法。老师说,repaint里面间接调用了paint方法。但是是如何间接调用的呢?repaint方法里面是否new了一个graphics对象呢然后传给paint呢? 首先paint方法,并不
Java中repaint方法清除原来图像问题
虽然Java界面编程作用不大,但在兴趣的驱使下还是了解了一下,在写小程序的时候发现了repaint方法有时候会清理原来的图像,有时候又不清理。下面贴出我通过API文档得出的结论。 程序作用:每点击一次,窗口上就多出一个小圆。 情形一:
关于repaint()和validate()方法区别的个人见解
repaint()方法是重绘,而validate()是重载,一般来说,从一个容器中删除某个组件需要调用repaint(),而把某个组件添加到某一容器中,则需调用validate()。举个例子: 有两个JPanel分别为p1和p2,要把p2添加到p1里面,则需这样写: p1.add(p2); p1.validate(); 要从p1中移除p2,则需这样写: p1.remove
Java小程序之高级画板重绘篇I
Java小程序之高级画板重绘篇I 前言:我们完成的高级画板在最小化后,然后最大化,画板上绘制的图形全都会消失不见了。原因已在前面的博客中解释,这里不再累赘;今天就让我们一起来解决这个小bug吧! 画板重绘思路: 1、定义直线,椭圆,矩形,圆角矩形等类; 2、在绘制图形的时候生成相应的对象; 3、利用容器将对象进行保存; 4、利用重绘方法,将容器中的对象拿出来,进行重绘;
调用repaint()后为什么这个paintComponent()没有执行
其实,这个问题很简单,很容易被忽视 100%因为你的这Jpanel没有被放到一个JFrame中去显示而导致的。还在等什么,赶快ADD上。
java中paint,repaint,update之间的关系(闪烁问题的解决)
最近总结了一下java中的paint,repaint和updata三者之间的关系,首先咱们都知道用paint方法来绘图,用repaint重绘,用update来写双缓冲。但是他们之间是怎么来调用的呢,咱们来分析一下(想直接看结果,请跳过分析过程): -------------------------------------------------------------------------
QT update和repaint
qt 中更新界面和重绘的问题
Repaint/Reflow 的基本认识和优化
​浏览器解析的大概工作流  (1)解析HTML构建DOM树:渲染引擎开始解析HTML文档,转换树中的HTML标签或js生成的标签到DOM节点,它被称为---内容树。 (2)构建渲染树:解析css(外部css文件和样式元素以及js生成的样式),根据css选择器计算出节点的样式,创建另一个树---渲染树。 (3)布局渲染树:从根节点递归调用,计算每个元素的大小、位置等,给每个节点所应该出现在屏幕
重排(reflow)& 重绘(repaint)
什么是重排和重绘? 重排(重构/回流/reflow):当渲染树中的一部分(或全部)因为元素的规模尺寸,布局,隐藏显示等改变而需要重新构建, 这就称为回流(reflow)。每个页面至少需要一次回流,就是在页面第一次加载的时候。 重绘(repaint):当盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来之后,浏览器便把这些元素都按照各自的属性绘制一遍,将内容呈现在页面上。重绘是指一个元...
Java 中repaint的理解。
ecause we are manually setting the clip, our moveSquare method invokes the repaint method not once, but twice. The first invocation tells Swing to repaint the area of the component where the square previously was (the inherited behavior uses the UI Delegat
java学习总结(画板重绘)
学习重绘后的总结 1.为什么要重绘? 我们在窗体中画了图形,当我们最小化窗体或者弹出颜色选择器时,原来的图形就不见了,于是我们需要学习重绘。 2.重绘就是把原来画的图形重新在窗体中画出来,即当我们最小化窗体或者弹出颜色选择器时,原来的图形还表现在窗体上。 3.重绘的实现: 1.重绘运用到了我上一节课学的自定义队列。我们把我们所画的图形都存入队列中, 当最小化窗体或者弹出颜色选择器时,再将之前...
图像化界面paint,repaint方法的总结
JAVA 画图中出现的paint()函数 问题:小弟刚学JAVA,有一个问题。以下是一段JAVA代码,它弹出了一个窗口,并在窗口上使用paint()画出矩形、椭圆、扇面等图形。但鉴于paint()并不在main()中执行,所以它会一次画完。现在我想让画图行为受用户控制,比如说,开始只有一个空白窗口。当用户输入1,画出矩形。用户输入2,擦掉矩形。用户输入3,画出椭圆。等等等等。 所以小弟应该如何做?...
java基础学习总结——关于Java中的paint,repaint,update三个方法的关系
这些天一直在用repaint()和paint(),到网上一查,还揪出了update(), 其中查到一篇介绍Java中的paint,repaint,update三个方法的关系的文章: 1.  先还是看看 Java API 中的介绍吧:update public void update(Graphics g)     更新组件。     如果此组件不是轻量级组件,则为了响应对 repaint 
java图像闪烁问题解决办法之双缓冲
  这是在做java的一个小项目叫坦克大战的时候遇到的一个问题,就是使用线程进行repaint()面板的时候总是出现闪烁的问题,由于repaint()要把所有图像都重新绘制一遍,因此出现了闪烁。  那么怎么解决闪烁这个问题呢,我们就用到了双缓冲这一技巧(double buffer),我们首先创建一张基于原面板的一场图像,先将绘制图像的工作在这张图片上面完成,最后再将这张图片直接贴到面板上面,...
java界面的面板重绘
今天是超哥给我讲课,给我讲了我的五子棋的不足和bug。我的五子棋一旦拉伸边框和最小化还原,面板上的旗子就会消失不见,超哥给我讲了在JPanel的构造方法了直接重写paint()方法,就可以了,之后还给悔棋按钮添加了悔棋的动作监听机制以及添加了音乐。 public void paint(Graphics g){ super.paint(g); for(int i=0;i<s
JTree刷新
用JTree实现QQ好友列表之后想继续
Swing动态刷新,repaint,updateUI区别
Swing动态刷新,repaint,updateUI区别 repaintpublic void repaint() 重绘此组件。 如果此组件是轻量组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。 注:有关 AWT 和 Swing 所用绘制机制的更多信息,包括如何编写最高效的绘制代码的信息,请参阅 Painting in
转:QGraphicsView 的刷新(update)问题
众所周知,QGraphicsView的绘图操作主要是在paintEvent(相对于VC里的 OnDraw函数)函数里完成, 如果要手动重绘一般调用update或repaint,(这两个函数都会调用paintEvent完成重绘工作) 看官方帮助文档建议用update因为update相对做了很多优化工作,而repaint则没有。 但是在实际使用时发现,直接使用update或update都不能完成
JFrame里面套其他的组件 然后repaint()的解决方法
keyword:JFrame repaint() 线程 JLabel JPanel JComponent在网上找了很长时间没有相关的方法,但是总结之后还是调试成功了。设计一个GUI的时候, 在JFrame里套了JPanel再套了JLabel 然后希望在JLabel里面不断地更新自己的数据,并且画出来,但是完全不行。最后采用了另辟进程的方式成功完成。 感谢http://fuliang.javaeye.com/blog/149340的文章import java.awt.Color; import java.a
reflow和repaint理解总结
repaint就是重绘,reflow就是回流    严重性:    在性能优先的前提下,reflow的性能消耗要比repaint的大。   体现:   repaint是某个dom元素进行重绘,reflow是整个页面进行重排,也就是对页面所有的dom元素渲染。   如何触发reflow和repaint   repaint的触发:   1)不涉及任何dom元素的排版问题的变动为repai
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 从零学习呀大数据 学学习java 没有思想