Swing 重绘 repaint,updateUI区别

repaint   

public void repaint()重绘此组件。

如果此组件是轻量组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。
注:有关 AWT 和 Swing 所用绘制机制的更多信息,包括如何编写最高效的绘制代码的信息,请参阅 。
updateUI
public void updateUI()UIManager 发出的关于 L&F 已经更改的通知。用 UIManager 的最新版本替换当前的 UI 对象。覆盖: 类 JComponent 中的 updateUI另请参见: JComponent.updateUI()
可能大家都试过在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重绘主要有四个关键方法:paint(),repaint(),revalidate(),paintImmediately(); 
而进行绘制时后它会依次调用update(),paint(),paintComponent(),paintBorder(),paintChildren()进行绘制; 

那么repaint()方法为什么会延时呢? 

调用repaint()会导致一个区域被增加到重绘列表队列中,且被预定重绘。产生一个防止到系统事件队列中的请求, 
一旦该请求被处理,内部工具自动毁掉组件的paintImmediately()方法。然后该方法立即执行绘制; 

也就是说通常情况下repaint()它是不会立即执行的,调用它后会有一个等待处理的过程。但repaint比较高效,会推迟实际的绘制并将多余的请求压缩到单个 paint 调用中。 

所以如何解决它的repaint()延时问题呢? 
1.让它立即执行:使用paintImmediately()。 

2.使用SwingUtilities工具类中的invokeLater(Runnable doRun)方法;把你要在repaint()后执行的操作写在要执行的线程中;(它会把这个方法也加入到java内部事件队列中,它排在repaint()之后,所以一般情况下,它是等repaint()执行完之后才会执行,虽然这样达到效果,但并不理想);


您可以通过在按钮的事件处理方法中调用 `repaint()` 方法来实现点击按钮后重绘界面。 首先,您需要创建一个继承自 `JFrame` 的主窗口类,并在其中添加一个按钮。然后,为按钮添加一个动作监听器,监听按钮的点击事件。 在按钮的动作监听器中,您可以重写 `actionPerformed()` 方法,在该方法中调用 `repaint()` 方法来触发界面的重绘。 下面是一个简单的示例代码: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MainFrame extends JFrame { private JButton button; public MainFrame() { button = new JButton("点击重绘"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 在按钮点击事件中调用repaint()方法 repaint(); } }); // 将按钮添加到主窗口中 getContentPane().add(button); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(200, 200); setVisible(true); } @Override public void paint(Graphics g) { super.paint(g); // 在重绘方法中绘制界面的其他组件或图形 g.setColor(Color.RED); g.drawRect(50, 50, 100, 100); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new MainFrame(); } }); } } ``` 在上述代码中,当点击按钮时,`actionPerformed()` 方法中的 `repaint()` 方法会被调用,从而触发 `paint()` 方法的执行,进而绘制界面上的矩形。您可以根据需要在 `paint()` 方法中绘制界面的其他组件或图形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值