Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_Jframe_Jpanel - Fatal编程技术网

Java repaint()混淆

Java repaint()混淆,java,jframe,jpanel,Java,Jframe,Jpanel,我有一个程序,可以打开一个窗口,快速改变背景颜色,随机弹出矩形和椭圆。我的代码可以工作,但我不知道为什么,因为我没有在代码中调用repaint()函数。当我使用personal update()函数包含repaint()函数时,我没有看到任何明显的变化。这是我的密码: package epilepsy; import java.awt.Color; import java.awt.Graphics; import java.awt.BorderLayout; import javax.swi

我有一个程序,可以打开一个窗口,快速改变背景颜色,随机弹出矩形和椭圆。我的代码可以工作,但我不知道为什么,因为我没有在代码中调用repaint()函数。当我使用personal update()函数包含repaint()函数时,我没有看到任何明显的变化。这是我的密码:

package epilepsy;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

import Math.Math;

/**
 *
 * @author 21psuby
 */
public class Epilepsy {

    JFrame frame;
    DrawPanel drawPanel;
    Math math = new Math();

    int screenW = 800;
    int screenH = 700;

    int red = math.random(0, 255);
    int green = math.random(0, 255);
    int blue = math.random(0, 255);
    int x = math.random(0, screenW);
    int y = math.random(0, screenH);
    int w = math.random(0, screenW/2);
    int h = math.random(0, screenH/2);

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Epilepsy().go();
    }

    private void go() {
        frame = new JFrame();
        drawPanel = new DrawPanel();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
        frame.setVisible(true);
        frame.setSize(screenW, screenH);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
    }

    class DrawPanel extends JPanel {

        private static final long serialVersionUID = 1L;

        public void paintComponent(Graphics g) {
            randomize();
            frame.setBackground(new Color(red, green, blue));
            randomize();
            g.setColor(new Color(red, green, blue));
            g.fillRect(x, y, w, h);
            randomize();
            g.setColor(new Color(red, green, blue));
            g.fillRect(x, y, w, h);
            randomize();
            g.setColor(new Color(red, green, blue));
            g.fillRect(x, y, w, h);
            randomize();
            g.setColor(new Color(red, green, blue));
            g.fillOval(x, y, w, h);
            randomize();
            g.setColor(new Color(red, green, blue));
            g.fillOval(x, y, w, h);
            randomize();
            g.setColor(new Color(red, green, blue));
            g.fillOval(x, y, w, h);
        }
    }

    private void randomize() {
        red = math.random(0, 255);
        green = math.random(0, 255);
        blue = math.random(0, 255);
        x = math.random(0, screenW);
        y = math.random(0, screenH);
        w = math.random(0, screenW/2);
        h = math.random(0, screenH/2);
    }

    private void update() {
        while (true) {
            try {
                Thread.sleep(10);
            } catch (Exception e) {
                e.printStackTrace();
            }
            frame.repaint();
        }
    }
}

谢谢,Pranav方法setBackground在内部某处导致框架重新绘制自身,这将再次调用paintComponent,并再次调用setBackground。这将创建无限循环。拆下立根盒接地线,应能正常工作。如果要更改面板的背景,请尝试将其设置在paintComponent方法之外,或在整个面板上绘制所需颜色的矩形。

您的程序中从未使用过更新方法。当我把它添加到go方法的末尾时,我看到了一帧癫痫发作的形状。问题是,即使我使用更新方法,也没有任何变化。这个程序不管用哪种方式都能运行,我想知道为什么。我不明白你的问题是什么。您希望从这个给定的代码中得到什么输出?+1,更一般地说:在
paintComponent
中,除了绘制组件外,不要做任何事情。该方法称为
paintComponent
,而不是
paintComponent和dosomerandomotherstuff
。特别是,不要更改组件的状态(因为它可能会触发重新绘制)。谢谢,这很有意义。