Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的repaint()_Java_Swing_Graphics_Validation_Repaint - Fatal编程技术网

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()