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中的重绘()的主要内容,如果未能解决你的问题,请参考以下文章