gpt4 book ai didi

java - 在 Java 中对像素网格进行动画处理

转载 作者:行者123 更新时间:2023-12-01 21:26:25 26 4
gpt4 key购买 nike

我是一名菜鸟程序员,我正在研究 a little project它涉及 1000 x 1000 boolean 值的 2D 网格,这些 boolean 值根据指令模式而变化。 “在x指令之后,网格中有多少个值是真的?”诸如此类的事情。

我想对其进行一些旋转,并将这些值渲染为像素网格,如果相应的值为假,则为黑色,如果为真,则为白色,并且在处理指令时实时动画,但我我很迷茫——我从未涉足过 Java 中的 2D 图形。我已通读Oracle's tutorial ,这很有帮助,但我做事的方式与它的演示完全不同,我仍然感到迷失。

我最直接的问题是,我什至无法使用 BufferedImage 初始化 1000 x 1000 黑色像素的网格。运行我的代码会产生一个非常小的窗口,其中没有任何内容(灰色)。谁能告诉我我做错了什么并建议如何继续?我的代码如下:

import java.awt.image.BufferedImage;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PixelGrid extends JPanel {

private BufferedImage grid;

// Ctor initializing a grid of binary (black or white) pixels
public PixelGrid(int width, int height) {
grid = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
}

/**
* Fill an area with a given color
* @param color 0 for black; 1 for white
* @param x1 Starting x coordinate
* @param y1 Starting y coordinate
* @param x2 Ending x coordinate
* @param y2 Ending y coordinate
*/
public void toggleBlock(int color, int x1, int y1, int x2, int y2) {
if (color == 0) {
color = Color.BLACK.getRGB();
}
else {
color = Color.WHITE.getRGB();
}
for (int x = x1; x <= x2; x++) {
for (int y = y1; y <= y2; y++) {
grid.setRGB(x, y, color);
}
}
}

// Clear the grid (set all pixels to black)
public void clear() {
toggleBlock(0, 0, 0, grid.getWidth() - 1, grid.getHeight() - 1);
}

public static void main(String[] args) {
int width = 1000;
int height = 1000;
PixelGrid aGrid = new PixelGrid(width, height);
JFrame window = new JFrame("A Wild Pixel Grid Appears!");

window.add(aGrid); // Incorporates the pixel grid into the window
window.pack(); // Resizes the window to fit its content
window.setVisible(true); // Makes the window visible
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

请注意,它根本不处理实际的二维 boolean 数组或指令处理;我很确定我可以自己处理这个问题,但是现在,我只是想了解如何设置图形组件。

最佳答案

您的代码创建了一个 BufferedImage,但随后不对其执行任何操作(以图形方式)。几个选项:

选项 1:重写 PixelGrid 类的 paintComponent 并将图像绘制到 JPanel

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(grid, 0, 0, this);
}

选项 2:使用 JLabelImageIcon

JLabel label = new JLabel(new ImageIcon(grid));
add(label);

无论哪种情况,每次 BufferedImage 更改时,您都必须在组件上调用 repaint

//some code
grid.setRGB(x, y, color);
//some more code
repaint();//or label.repaint() if Option 2

关于java - 在 Java 中对像素网格进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38108506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com