Java中的repaint()
可能重复:Java中的repaint(),java,swing,graphics,validation,repaint,Java,Swing,Graphics,Validation,Repaint,可能重复: 我写了一个Java代码,但是我遇到了GUI问题。当我将一个组件添加到JFrame对象中时,我调用repaint()方法来更新GUI,但它不起作用。但是,当我最小化或调整此框架的大小时,GUI会更新 这是我的密码: public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(460, 500); frame.setTitle("Circles gene
我写了一个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();
}
您可能还需要调用
frame.repaint()
,以强制帧实际重新绘制自身。我以前遇到过这样的问题:我尝试重新绘制组件,但在调用父级的repaint()方法之前,它不会更新显示的内容。如果您将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);
}
}
}
你按错误的顺序做事 您需要首先将所有JComponents添加到JFrame,然后在JFrame上调用
pack()
,然后调用setVisible(true)
如果以后添加的JComponents可能会更改GUI的大小,则需要再次调用pack()
,然后在执行此操作后在JFrame上重新绘制()。只需编写:
frame.validate();
frame.repaint();
那就行了
关于我将component.repaint()更改为frame.repaint(),但它不起作用。对,没有理由为ContentPane声明+1@mKorbel当前位置我的答案迟到了,但我想您使用ContentPane()的答案要好得多。有人说这是一个很好的练习。但是谢谢你的观点。将+1视为良好的方法。RegardsNow确保main方法中的代码在EDT上运行,甚至better@Robin你说得对,谢谢你注意到它改变了什么,改用
revalidate()
?