repaint_repaint方法 - CSDN
精华内容
参与话题
  • java新手,用repaint方法重新绘图

    万次阅读 2017-04-06 13:05:05
    最近在学习paint方法的使用,想着用一个按钮来改变背景图片(就像我们平时做的那样),然后各方查资料。当然,资料是查不到多少的,因为百度首页的前几页的那几... 所以我决定把我自己的repaint代码贴上,因为我冥思苦

        最近在学习paint方法的使用,想着用一个按钮来改变背景图片(就像我们平时做的那样),然后各方查资料。当然,资料是查不到多少的,因为百度首页的前几页的那几个博客,除了一个原创之外(虽然写的很晦涩难懂),其他的都是滥竽充数之徒!最让我恼火的是百度知道里面的登徒子,一个个为了点点积分而胡乱回答,真不知道那几位问问题的同路那个时候想法。

        所以我决定把我自己的repaint代码贴上,因为我冥思苦想了几个小时,终于都想明白了怎么去使用repaint才能达到自己的要求。很蠢吧?花了那么多的时间。


    目的:按一个按钮来更换图片;

    使用:repaint 、paintcomponent 、ActionListener

    以下是源码,在eclipse nexo3.0 上可以使用

    package home;



    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;


    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;


    public class PaintTest extends JPanel
    {
    JFrame frame ;
    JButton btn1 ;
    JButton btn2 ;
    String Loca ;

    ImageIcon ii ;
    Image i ;

    public PaintTest ()
    {
    Loca = "/image/piano.jpg" ;
    }
    public void paintComponent (Graphics g)
    {
    ii = new ImageIcon (PaintTest.class.getResource(Loca)) ;
    i = ii.getImage() ;/*这里是得到一个img对象,给drawimage的*/
    super.paintComponent (g)  ;
    g.drawImage (i,0,0,400,300,this) ; 
    }
    public void set ()
    {
    frame = new JFrame () ;

    btn2 = new JButton ("b") ;/*这个button是用来测试画出来的图像是否会覆盖这个按钮的,结果是不会*/
    btn2.setBounds(0, 0, 50, 50);
    this.add(btn2) ;

    btn1 = new JButton ("a") ;
    btn1.setBounds(0, 400, 50, 50) ;
    btn1.addActionListener(new ActionListener ()
    {


    @Override
    public void actionPerformed(ActionEvent e)/*监听器,如果这里看不懂的话先去看看那部分的知识。这里总结起来就是:按一个键,改变Loca,再重绘*/
    {
    Loca = "/image/pic.jpg" ;/*Loca是用来放地址的,给上面的imageicon得到一个icon对象(不是image)*/
    repaint () ;
    }

    }) ;

    this.setLayout(null) ;
    this.add(btn1) ;
    frame.add(this) ;
    frame.setSize(500, 500) ;
    frame.setVisible(true) ;
    }
    public static void main (String [] args) 
    {
    PaintTest pt = new PaintTest () ;
    pt.set() ;
    }
    }


    先吃饭,有些额外的说明以后再说。

    希望能帮助到大家!

    展开全文
  • 图像化界面paint,repaint方法的总结

    千次阅读 多人点赞 2018-11-16 16:37:35
    JAVA 画图中出现的paint()函数 问题:小弟刚学JAVA,有一个问题。以下是一段JAVA代码,它弹出了一个窗口,并在窗口上使用paint()画出矩形、椭圆、扇面等图形。但鉴于paint()并不在main()中执行,所以它会一次画完。...

    JAVA 画图中出现的paint()函数

    问题:刚学JAVA,有一个问题。以下是一段JAVA代码,它弹出了一个窗口,并在窗口上使用paint()画出矩形、椭圆、扇面等图形。现在我想让画图行为受用户控制,比如说,开始只有一个空白窗口。当用户输入1,画出矩形。用户输入2,擦掉矩形。用户输入3,画出椭圆。等等等等。

    所以小弟应该如何做?有什么思路?需要什么东西?

    案例代码:

    import java.awt.*; 
    import javax.swing.*;
    
    public class Test extends JFrame { 
      public static void main(String[] args){
        Test sl = new Test();
        sl.update();
      }
     Test(){
        super("Sample");
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setSize(600,600);
        setVisible(true);
      }
      public void update(){
        repaint();
      }
      public void paint(Graphics g) { 
         g.setColor(Color.black);     
         //有角矩形,起始点(10,30),宽80,高50
         g.drawRect(10,30,80,50);     
         //圆角矩形,起始点(110,30),宽80,高50,角(a=20,b=10)
         g.drawRoundRect(110,30,80,50,20,10);
         //椭圆,圆心(110,90)、a=80,b=50       
         g.drawOval(110,90,80,50); 
         //一条弧,圆心(219,30)、a=80,b=50 角度在0-90之间
         g.drawArc(210,30,80,50,0,90);
         //扇面,圆心(219,90)、a=80,b=50 角度在0-90之间
         g.fillArc(210,90,80,50,0,90);
      }
    }
    

    同样的,在俄罗斯方块的代码中,我们也看到了一个public void paint(Graphics g)函数,似乎这个函数没有被任何东西调用,并且还有一个相关联的repeat方法,代码见下面的:

    public void paint(Graphics g){
    		g.drawImage(background, 0, 0, null);//使用this 作为观察者
    		g.translate(15, 15);//平移绘图坐标系
    		paintTetromino(g);//绘制正在下落的方块
    		paintWall(g);//画墙
    		paintNextOne(g);
    		paintScore(g);
    	}
    

    一,我们先运行第一个Test程序,得到的图像是:

    在这里插入图片描述
    我们可以看到paint方法是被调用了的。

    二,原因分析

    首先paint方法,并不仅是JPanel的方法,而是继承自JComponent的方法,该方法说明如下:
    /**
         * Invoked by Swing to draw components
         * Applications should not invoke <code>paint</code> directly,
         * but should instead use the <code>repaint</code> method to
         * schedule the component for redrawing.
         * <p>
         * This method actually delegates the work of painting to three
         * protected methods: <code>paintComponent</code>,
         * <code>paintBorder</code>,
         * and <code>paintChildren</code>.  They're called in the order
         * listed to ensure that children appear on top of component itself.
         * Generally speaking, the component and its children should not
         * paint in the insets area allocated to the border. Subclasses can
         * just override this method, as always.  A subclass that just
         * wants to specialize the UI (look and feel) delegate's
         * <code>paint</code> method should just override
         * <code>paintComponent</code>.
         *
         * @param g  the <code>Graphics</code> context in which to paint
         * @see #paintComponent
         * @see #paintBorder
         * @see #paintChildren
         * @see #getComponentGraphics
         * @see #repaint
         */
    --------------------- 
    原文:https://blog.csdn.net/tanjun592/article/details/54926041 
    

    这个方法是被swing调用来画组件的,应用不应该直接调用paint,而应该调用repaint。paint这个方法实际上代表了三个protected的方法。 *paintComponent,paintBorder,paintChildren. *里面一次调用者三种方法来确保…(略)

    重要的是子类通常要重写这个方法,来定制special特殊的图形组件

    其次,那么为什么不应该直接调用paint而应该调用repaint呢?查了很多资料,有一个说的很简单,直接。
    • repaint()是重要概念,它是在图形线程后追加一段重绘操作,是安全的!是系统真正调用的重绘!所以如果你需要某个部件刷新一下界面,记得调用repaint(),千万不要直接调用paint()!
    • Graphics是一个抽象类,其实现大都是平台相关的,所以不容易自己创建一个graphics实例。一般graphics的实例会由依照你所在的桌面环境给出。
    最后, repaint里面间接调用了paint方法。但是是如何间接调用的呢?repaint方法里面是否new了一个graphics对象呢然后传给paint呢?

    repeat方法被调用时,发生什么
    Graphics与平台有关的详细介绍

    在这里插入图片描述

    三,程序员使用过程:

    所以做一个图形组件的基本思路可以总结为以下过程:
    选择适合的基本图形组件 -> 继承它 -> 重写paint等方法->在需要刷新图形的时候调用repaint等方法!
    至于Graphics,先假设它存在,因为真正的Graphics实例只有当程序在jvm上跑的时候才会创建。
    在这里插入图片描述
    俄罗斯方块中使用此技术的部分代码:

    public class Tetris extends JPanel{
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		Tetris tetris = new Tetris();
    		frame.add(tetris);
    		frame.setSize(525, 590);
    		frame.setUndecorated(false);//true去掉窗口框!
    		frame.setTitle("俄罗斯方块");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		//Location 位置 RelativeTo相对于 
    		frame.setLocationRelativeTo(null);//使当前窗口居中
    		frame.setVisible(true);
    		tetris.action();
    	}
    		public void action(){
    		//tetromino = Tetromino.randomTetromino();
    		//nextOne = Tetromino.randomTetromino();
    		//wall[19][2] = new Cell(19,2,Tetris.T);
    		startAction();
    		repaint();
    		KeyAdapter l = new KeyAdapter() {
    			public void keyPressed(KeyEvent e) {
    				int key = e.getKeyCode();
    				if(key == KeyEvent.VK_Q){
    					System.exit(0);//退出当前的Java进程
    				}
    				if(gameOver){
    					if(key==KeyEvent.VK_S){
    						startAction();
    					}
    					return;
    				}
    				//如果暂停并且按键是[C]就继续动作
    				if(pause){//pause = false
    					if(key==KeyEvent.VK_C){	continueAction();	}
    					return;
    				}
    				//否则处理其它按键
    				switch(key){
    				case KeyEvent.VK_RIGHT: moveRightAction(); break;
    				case KeyEvent.VK_LEFT: moveLeftAction(); break;
    				case KeyEvent.VK_DOWN: softDropAction() ; break;
    				case KeyEvent.VK_UP: rotateRightAction() ; break;
    				case KeyEvent.VK_Z: rotateLeftAction() ; break;
    				case KeyEvent.VK_SPACE: hardDropAction() ; break;
    				case KeyEvent.VK_P: pauseAction() ; break;
    				}
    				repaint();
    			}
    		};
    		this.requestFocus();
    		this.addKeyListener(l);
    	}
       public void paint(Graphics g){
    		g.drawImage(background, 0, 0, null);//使用this 作为观察者
    		g.translate(15, 15);//平移绘图坐标系
    		paintTetromino(g);//绘制正在下落的方块
    		paintWall(g);//画墙
    		paintNextOne(g);
    		paintScore(g);
    	}
    	
    

    可以看到,main方法中调用了action(),而action()方法中多次使用repaint()方法进行页面刷新。
    paint()方法中,实现具体的画图操作,可以看到都是使用Graphics的相关函数,下面列举下其方法

    • g.drawImage(background, 0, 0, null)加载图像,画出图像
    • g.translate(15, 15);//平移绘图坐标系
    • g.setColor(new Color(FONT_COLOR))设置颜色;
    • g.setFont(font);设置字符串的字体
    • g.drawString(str, x, y)画字符串

    应该注意的是,这里面没有多少其他组件插入的情况,完全是自己造的,从最基本的开始。

    展开全文
  • repaint方法使用和说明

    万次阅读 2014-07-29 11:02:51
    repaint 重绘此组件。如果组件是轻量组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。 目录 1方法 2工作原理 1方法编辑 ...
    repaint 重绘此组件。如果组件是轻量组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。

         方法编辑

    repaint()方法用于重绘组件,该方法有下面四种形式:
    1。public void repaint()
    2。public void repaint(long tm)
    //指定调用update方法之前等待的最大毫秒数tm
    3。public void repaint(int x,int y,int width,int height)
    //重绘组件的指定矩形区域
    4。public void repaint(ling tm,int x,int y,int width,int height)
    repaint方法不总是马上执行,Java虽然会尽可能快的执行repaint,当Applet运行在较慢的平台上或计算机较忙时,应该考虑使用第2或4种repaint方法,指定在多长时间内必须执行repaint,否则就放弃。

    2工作原理编辑

    repaint()这个方法是一个具有刷新页面效果的方法,如果你要页面进行重画就可以调用.一般都是在AWT的图形绘制当中调用的到.那么该方法具体的工作原来是怎么样的呢?看下面的结构流程图你就可以大概的了解了:
    repaint()方法
    |
    |
    V
    AWT线程--->paint()方法-->图形绘制
    |
    |
    V
    update()方法--->paint()方法--图形绘制
    从上面的流程图可以看出,在绘制动画图形时候如果没有调用repaint()方法的时候直接就是由线程调用paint()方法进行绘制,用repaint()进行刷新显示.但是这样的动画会有个缺点(这样的效果绘制出来会有闪烁).想想做出来的动画总是隔一段时间就闪烁,有人会看吗?那么应该怎么去除闪烁呢?我再下面的文章中会讲到.这里主要的是说明repaint()这个方法.
    在调用了repaint()的时候我门可以看出,它并不是直接就去绘制动画(调用paint()),而是通过调用AWT线程在由线程去调用另一个方法update()再由update()调用画笔paint()方法进行绘制.那么这里为什么要多做一步呢?这样是不是为我门多增加代码的书写量呢?回答是当然不会,如果你不调用repaint()那么就不能实现每一次的刷新显示,就只会绘制重叠的图形,不能一张一张的绘制出来.那么其中调用的update()到底是起到什么样的作用呢?
    update():清除当前显示并调用paint()方法.当然这个update()方法是可以被修改的,我门在另一篇文章关于"双缓冲技术"中会给大家讲到这点.
    综合上面的介绍可以总结出repaint()的工作原理:repaint()通过调用线程再由线程去调用update()方法清除当前显示并再调用paint()方法进行绘制下一个需要显示的内容.这样就起到了一种图片的交替显示从而在视角上形成了动画
    展开全文
  • repaint()方法!

    千次阅读 2010-10-20 16:06:00
    <br />repaint()这个方法是一个具有刷新页面效果的方法,如果你要页面进行重画就可以调用.一般都是在AWT的图形绘制当中调用的到.那么该方法具体的工作原来是怎么样的呢?看下面的结构流程图你就可以大概...

    repaint()这个方法是一个具有刷新页面效果的方法,如果你要页面进行重画就可以调用.一般都是在AWT的图形绘制当中调用的到.那么该方法具体的工作原来是怎么样的呢?看下面的结构流程图你就可以大概的了解了:


         repaint()方法
                  |
                  |
                 V
          AWT线程--->paint()方法-->图形绘制
       |
       |
       V
          update()方法--->paint()方法--图形绘制

    从上面的流程图可以看出,在绘制动画图形时候如果没有调用repaint()方法的时候直接就是由线程调用paint()方法进行绘制,用repaint()进行刷新显示.但是这样的动画会有个缺点(这样的效果绘制出来会有闪烁).想想做出来的动画总是隔一段时间就闪烁,有人会看吗?那么应该怎么去除闪烁呢?我再下面的文章中会讲到.这里主要的是说明repaint()这个方法.

    在调用了repaint()的时候我门可以看出,它并不是直接就去绘制动画(调用paint()),而是通过调用AWT线程在由线程去调用另一个方法update()再由update()调用画笔paint()方法进行绘制.那么这里为什么要多做一步呢?这样是不是为我门多增加代码的书写量呢?回答是当然不会,如果你不调用repaint()那么就不能实现每一次的刷新显示,就只会绘制重叠的图形,不能一张一张的绘制出来.那么其中调用的update()到底是起到什么样的作用呢?

      update():清除当前显示并调用paint()方法.当然这个update()方法是可以被修改的,我门在另一篇文章关于"双缓冲技术"中会给大家讲到这点.

    综合上面的介绍可以总结出repaint()的工作原理:repaint()通过调用线程再由线程去调用update()方法清除当前显示并再调用paint()方法进行绘制下一个需要显示的内容.这样就起到了一种图片的交替显示从而在视角上形成了动画.


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yubofighting/archive/2008/09/29/2997676.aspx

    展开全文
  • 笔记:repaint实时重绘问题

    千次阅读 2017-03-28 14:04:27
    GUI创建在某个函数时,当这个函数休眠时,那么GUI也会处于休眠状态 ...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()和paint(),到网上一查,还揪出了update(), 其中查到一篇介绍Java中的paint,repaint,update三个方法的关系的文章:1. 先还是看看 Java API 中的介绍吧:update public void update...
  • 我在paintEvent中调用了 QMessageBox::StandardButton btnValue = QMessageBox::information(this, "congratulations", "win!...为什么会报QWidget::repaint: Recursive repaint detected错误 求解
  • Java 中repaint的理解。

    千次阅读 2015-02-26 09:54:34
    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 ...
  • repaint()方法是重绘,而validate()是重载,一般来说,从一个容器中删除某个组件需要调用repaint(),而把某个组件添加到某一容器中,则需调用validate()。举个例子: 有两个JPanel分别为p1和p2,要把p2添加到p1...
  • 其实,这个问题很简单,很容易被忽视 100%因为你的这Jpanel没有被放到一个JFrame中去显示而导致的。还在等什么,赶快ADD上。
  • Qt重绘之update,repaint详解

    万次阅读 2011-01-04 22:36:00
    Qt重绘之update,repaint详解
  • public class test { public static void main(String[] ... repaint(); } public void repaint(){ System.out.println("nihao"); } } public void repaint(){ System.out.println("hanzhi"); } }
  • Java中repaint方法清除原来图像问题

    万次阅读 2016-08-14 01:51:21
    虽然Java界面编程作用不大,但在兴趣的驱使下还是了解了一下,在写小程序的时候发现了repaint方法有时候会清理原来的图像,有时候又不清理。下面贴出我通过API文档得出的结论。 程序作用:每点击一次,窗口上就多出...
  • Qt重绘之update,repaint详解(转)

    千次阅读 2014-05-04 16:27:59
      Qt里面的重绘和Windows编程里面的重绘差不多。但是Qt的重绘更有特色,更加智能。...当调用 update(),repaint()的时候,paintEvent()会被调用,另外,当界面有任何改变的时候,paintEvent
  • 然后圆的位置不断变化,书上故意用了JPanel.repaint这个方法,结果产生了运动痕迹, 然后书上提出的解决方法是repaint的时候先画一个大的白色的正方形把原来的圆盖住, 然后才画下一个圆。我实践的时候突发奇想用...
  • Swing 重绘 repaint,updateUI区别

    千次阅读 2012-08-19 19:24:27
    repaint public void repaint()重绘此组件。 如果此组件是轻量组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。 注:有关 AWT 和 Swing 所用绘制机制的更多信息,包括...
  • java画图总结之三(常用方法paint,repaint,update)

    万次阅读 多人点赞 2017-05-14 23:19:58
    三,常用方法paint,repaint,update 这个问题的由来是因为,我在编写java小程序,画图的时候,发现我重写了paint(graphics g)方法,而执行的时候调用的是repaint()无参方法。老师说,repaint里面间接调用了...
  • 在我的JFrame中加了一个JPanel,这个JPanel中包含两个JPanel,这两个JPanel同样大小,位置相同...看源码看到在repaint方法中好像调用了Parent.repaint方法,是不是repaint方法只要调用就父层和其他层的控件都会被重绘?
  • 1、Applet/JApplet: repaint+paint -- dragged, paint repaint+update+paint -- dragged, update Applet: repaint+paint -- 自动重画 repaint+update -- 不自动重画 JApplet:都不自动重画 结论:awt组件中...
  • reflow和repaint理解总结

    千次阅读 2017-01-06 22:26:32
    repaint就是重绘,reflow就是回流  严重性:  在性能优先的前提下,reflow的性能消耗要比repaint的大。  体现:  repaint是某个dom元素进行重绘,reflow是整个页面进行重排,也就是对页面所有的dom元素渲染...
1 2 3 4 5 ... 20
收藏数 25,880
精华内容 10,352
关键字:

repaint