Swing动态刷新,repaint,updateUI区别

Swing动态刷新,repaint,updateUI区别

repaintpublic void  repaint()
重绘此组件。

如果此组件是轻量组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。

:有关 AWT 和 Swing 所用绘制机制的更多信息,包括如何编写最高效的绘制代码的信息,请参阅 Painting in AWT and Swing。

updateUI

public void  updateUI()
UIManager 发出的关于 L&F 已经更改的通知。用  UIManager 的最新版本替换当前的 UI 对象。

覆盖:
类  中的
另请参见:

可能大家都试过在swing的事件监听中动态添加组件,但是JFrame却不会动态显示,只有变大变小(实际是重画了)才会显示。repaint,updateUI可以,用validate发现也可以。

API中对repaint()方法是这样描述的,调度完当前所有未完成的事件后重新绘制该组件,所以repaint方法不总是马上执行。

package tbutton;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Ss extends JFrame {

    Container con = this.getContentPane();
    JButton jb1 = new JButton("jb1");
    JButton jb2 = new JButton("jb2");
    JLabel jl1 = new JLabel("jl1");
    FlowLayout gly = new FlowLayout();
    JPanel jp = new JPanel(gly);

    public Ss() {
        con.add(jp);
        jp.add(jb1);
        jp.add(jb2);
        MyListener ml = new MyListener();
        jb1.addMouseListener(ml);
        this.setSize(300, 200);
        this.setVisible(true);
    }

    private class MyListener extends MouseAdapter {

        @Override
        public void mouseClicked(MouseEvent e) {
            // TODO Auto-generated method stub
            try {
                JButton jb3 = new JButton("jb3");
                jp.add(jb3);
//                jp.updateUI();//可以正常显示
                jp.repaint();//API中对repaint()方法是这样描述的,调度完当前所有未完成的事件后重新绘制该组件,repaint方法不总是马上执行,所以只有调整大小才可以显示。
            //主要就是下面的invalidate和validate
            //当然,用jp来invalidate和validatae也是可以的
//                  jp.invalidate();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    public static void main(String s[]) {
        Ss sss = new Ss();
        sss.setVisible(true);
    }
}

你可能感兴趣的:(Swing动态刷新,repaint,updateUI区别)