首页 > 解决方案 > Java 绘图到 JPanel Graphics,使用字节数组,闪烁白色

问题描述

所以我正在尝试使用具有指定字节/颜色的字节数组来更新 JPanel 这是一个非常简单的版本。当我启动程序时,它是白色的半秒钟,然后变成正确的颜色,然后在 1 秒钟后又恢复为白色,我试图打印出当前颜色,有时它会变为“0”。我究竟做错了什么?

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

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

public class Test {
public static Random ran = new Random();
public static byte[] buffer;
public static int num = 0;
public static JFrame frame = new JFrame();
public static JPanel panel = new JPanel() {
    private static final long serialVersionUID = 1L;

    @Override
    public void paint(Graphics g) {
        num = 0;
        byte[] current_buffer = buffer.clone();

        for (int y = 0; y < panel.getHeight(); y++) {
            for (int x = 0; x < panel.getWidth(); x++) {
                g.setColor(new Color(current_buffer[num], current_buffer[num], current_buffer[num]));
                g.fillRect(x, y, 1, 1);
                num++;
            }
        }

    }
};

public static void main(String[] args) {
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(1200, 800);
    frame.setLocationRelativeTo(null);
    frame.setContentPane(panel);
    frame.setResizable(false);
    frame.setVisible(true);
    engine.run();
}

public static boolean running = true;
public static Thread engine = new Thread() {
    @Override
    public void run() {
        buffer = new byte[panel.getWidth() * panel.getHeight()];
        for (int i = 0; i < buffer.length; i++) {
            buffer[i] = (byte) 34;
        }
        while (running) {
            panel.repaint(10L);
        }
    }
};

}

标签: java

解决方案


不太了解你的逻辑:

    for (int i = 0; i < buffer.length; i++) {
        buffer[i] = (byte) 34;
    }

您将相同的值分配给缓冲区。

然后使用相同的值创建一个 Color 对象。

 g.setColor(new Color(current_buffer[num], current_buffer[num], current_buffer[num]));

所以每个像素都是相同的颜色。

而且由于缓冲区始终使用相同的值构建,因此颜色不会改变。

另外,你为什么要使用

byte[] current_buffer = buffer.clone();

您只是使用缓冲区中的值,而不是更新缓冲区中的值,所以我看不出克隆的原因。

不要使用带有 while 循环的线程。对于动画,您应该使用Swing Timer. 当 Timer 触发时,您更新缓冲区中的值,然后调用 repaint()。

当我启动程序时,它是白色的半秒钟,然后变成正确的颜色,然后在 1 秒钟后又变回白色,

我看不到这种行为。

  1. 它闪烁浅色
  2. 它保持在较深的颜色

以上是有道理的,因为:

  1. 您的 paintCompnent() 方法不会调用 super.paintComponent(...) 以确保清除背景
  2. 该数组在创建时未初始化为任何值,因此默认值为 0。
  3. 线程接管后,数组将始终包含相同的值,因此将绘制相同的颜色。

你期望它做什么?


推荐阅读