Java中的重绘()

Posted

技术标签:

【中文标题】Java中的重绘()【英文标题】:repaint() in Java [duplicate] 【发布时间】:2012-02-09 19:45:33 【问题描述】:

可能重复:Java GUI repaint() problem?

我编写了一个 Java 代码,但我遇到了 GUI 问题。当我将一个组件添加到 JFrame 对象中时,我调用 repaint() 方法来更新 GUI,但它不起作用。但是当我最小化或调整这个框架时,GUI 会更新。

这是我的代码:

public static void main(String[] args)

    JFrame frame = new JFrame();

    frame.setSize(460, 500);
    frame.setTitle("Circles generator");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setVisible(true);

    String input = JOptionPane.showInputDialog("Enter n:");
    int n = Integer.parseInt(input);

    CircleComponent component = new CircleComponent(n);
    frame.add(component);
    component.repaint();

【问题讨论】:

【参考方案1】:

如果你将JComponent添加到已经可见的容器中,那么你有调用

frame.getContentPane().validate();
frame.getContentPane().repaint();

例如

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class Main 

    public static void main(String[] args) 
        JFrame frame = new JFrame();
        frame.setSize(460, 500);
        frame.setTitle("Circles generator");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        SwingUtilities.invokeLater(new Runnable() 
            public void run() 
              frame.setVisible(true);
           
        );

        String input = JOptionPane.showInputDialog("Enter n:");
        CustomComponents0 component = new CustomComponents0();
        frame.add(component);
        frame.getContentPane().validate();
        frame.getContentPane().repaint();
    

    static class CustomComponents0 extends JLabel 

        private static final long serialVersionUID = 1L;

        @Override
        public Dimension getMinimumSize() 
            return new Dimension(200, 100);
        

        @Override
        public Dimension getPreferredSize() 
            return new Dimension(300, 200);
        

        @Override
        public void paintComponent(Graphics g) 
            int margin = 10;
            Dimension dim = getSize();
            super.paintComponent(g);
            g.setColor(Color.red);
            g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
        
    

【讨论】:

+1 是一个好方法。问候 现在确保 main 方法中的代码在 EDT 上运行,这样会更好 @Robin 你是对的,谢谢通知 改用revalidate() 有什么改变吗?【参考方案2】:

你做事的顺序不对。

您需要先将所有个JComponents添加到JFrame中,然后才在JFrame上调用pack()然后setVisible(true)

如果您稍后添加了可以更改 GUI 大小的 JComponent,则需要再次调用 pack(),然后在 JFrame 上调用 repaint()

【讨论】:

【参考方案3】:

简单写:

frame.validate();
frame.repaint();

这样就可以了。

问候

【讨论】:

对,没有理由为 ContentPane +1 声明 @mKorbel :我迟到了答案,但我想您使用 ContentPane() 的答案要好得多。有人说这是一种很好的做法。但是感谢您的积分。问候【参考方案4】:

您可能还需要调用frame.repaint() 来强制框架实际重绘自身。我在尝试重绘组件之前遇到过问题,并且在调用父级的 repaint() 方法之前它不会更新显示的内容。

【讨论】:

我把component.repaint()改成frame.repaint(),还是不行。

以上是关于Java中的重绘()的主要内容,如果未能解决你的问题,请参考以下文章

页面的重绘与回流及优化

如何在 Qt5 中触发 QTableView 的重绘?

解决winform中的panel重绘闪烁问题

解决winform中的panel重绘闪烁问题

浏览器的重绘与重排

[Android FrameWork 6.0源码学习] View的重绘过程