Java重绘()困惑

标签 java jframe jpanel

我有一个程序可以打开一个窗口并快速改变背景颜色并随机弹出矩形和椭圆形。我的代码有效,但我不知道为什么,因为我没有在我的代码中调用 repaint() 函数。当我使用我个人的 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();
        }
    }
}

谢谢,普拉纳夫

最佳答案

内部某处的 setBackground 方法会导致框架重新绘制自身,这会再次调用您的 paintComponent 并再次调用 setBackground。这会创建无限循环。删除 setBackground 行,它应该按预期工作。如果您想更改面板的背景,请尝试在 paintComponent 方法之外设置它,或者在整个面板上绘制一个所需颜色的矩形。

关于Java重绘()困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48443472/

相关文章:

java - 如果定义了 maxLength 和模式限制,则针对长字符串验证 XML 的速度会很慢

Java - 了解 PrintWriter 和刷新需求

java - 在不停止执行流程的情况下显示 "JOptionPane.showMessageDialog"

java - JDialog 和 JFrame 以及新实例

Java JPanel,如何重叠它们(设置背景图像)

java - 在 Tomcat 上部署 Spring Boot + WebSocket + Stomp

java - 迁移到适用于 Java 的 Google Cloud Endpoints Framework

Java - PaintComponent 不会在 JPanel 上显示绘图

java - 重新排序滚动 Pane 中的面板

java - 调整大小时由 LayoutManager 通知 JPanel