java - 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);
}
}
};
}
解决方案
不太了解你的逻辑:
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 秒钟后又变回白色,
我看不到这种行为。
- 它闪烁浅色
- 它保持在较深的颜色
以上是有道理的,因为:
- 您的 paintCompnent() 方法不会调用 super.paintComponent(...) 以确保清除背景
- 该数组在创建时未初始化为任何值,因此默认值为 0。
- 线程接管后,数组将始终包含相同的值,因此将绘制相同的颜色。
你期望它做什么?
推荐阅读
- javascript - 获取字符串中第 n 次出现的索引
- powershell - 如果我添加一个安静的参数,安装 VLC 的 Powershell 脚本将停止工作
- kubernetes - 流利的错误“Systemd::JournalError:没有这样的文件或目录”
- reactjs - React - 使用道具设置本地状态不起作用
- swift - 从表视图内的集合视图执行 segue 单击按钮
- ios - 如何在 swift 中在 POST 请求参数中发送字符串键和 json 值?
- c# - 模型中 OnPost 中的更改绑定属性无效
- amazon-web-services - 使用 AWS CloudFormation 添加环境变量会重置 AWS Beanstalk 应用程序
- python - 将逗号分隔值从mysql加载到python中的数据框
- python - 如何使用 MSQLAlchemy (Postgres) (Python) 中的连接进行复合循环查询