【发布时间】:2014-03-07 01:08:02
【问题描述】:
我正在尝试编写一些 Java 代码来将 BufferedImage 绘制到 JFrame 上。
BufferedImage 是使用构造函数创建的。图像未正确绘制到 JFrame 上。它应该是蓝色和绿色的棋子,但结果都是蓝色的。仅渲染第一个像素。如果我从文件中加载图像,它可以工作。
这是 Image 类:
public class Image {
public int width;
public int height;
public Color[] pixels;
public BufferedImage bufferedImage;
public Image() {
width = 2;
height = 2;
pixels = new Color[4];
pixels[0] = new Color(0, 0, 255);
pixels[1] = new Color(0, 255, 0);
pixels[2] = new Color(0, 255, 0);
pixels[3] = new Color(0, 0, 255);
createBufferedImage();
}
private void createBufferedImage() {
BufferedImage img;
IndexColorModel colorModel;
byte[] red = new byte[pixels.length];
byte[] green = new byte[pixels.length];
byte[] blue = new byte[pixels.length];
byte[] alpha = new byte[pixels.length];
for(int i = 0; i < pixels.length; i++) {
red[i] = (byte) pixels[i].getRed();
green[i] = (byte) pixels[i].getGreen();
blue[i] = (byte) pixels[i].getBlue();
alpha[i] = (byte) pixels[i].getAlpha();
System.out.println("The image at pixel " + i + " has RGBA: " + red[i] + ", " + green[i] + ", " + blue[i] + ", " + alpha[i]);
}
colorModel = new IndexColorModel(3, pixels.length, red, green, blue);
img = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_INDEXED, colorModel);
bufferedImage = img;
}
public void printImageData() {
String string;
String[] strings;
string = new String();
strings = new String[width * height];
ColorModel colorModel = bufferedImage.getColorModel();
System.out.println(
new String("Number of pixels: " + pixels.length + "; image width: " + width + "; image height: " + height + "."));
for(int i = 0; i < strings.length; i++) {
strings[i] = new String("pixel=" + i + ";r=" + colorModel.getRed(i) + ";b=" + colorModel.getBlue(i) + ";g=" + colorModel.getGreen(i) + ";;");
}
for(int i = 0; i < strings.length; i++) {
string = string + strings[i];
}
System.out.println(string);
}
}
主类和 ScreenPanel 类:
public class Main {
public static JFrame frame;
public static JPanel screenPanel;
public static Image checkers;
public static Dimension windowDimensions;
public static int pixelSize;
public static void main(String[] arg0) {
windowDimensions = new Dimension(750, 630);
pixelSize = 50;
checkers = new Image();
checkers.printImageData();
screenPanel = new ScreenPanel();
createWindow();
while(true) {
frame.repaint();
}
}
private static void createWindow() {
JLabel emptyLabel = new JLabel();
frame = new JFrame("3D Game Library Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(0, 0, (int) windowDimensions.getWidth(), (int) windowDimensions.getHeight());
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);
frame.add(screenPanel);
frame.setSize(windowDimensions);
frame.pack();
frame.setVisible(true);
}
}
class ScreenPanel extends JPanel {
private static final long serialVersionUID = 978983962098385882L;
public ScreenPanel() {
}
@Override
public Dimension getPreferredSize() {
return Main.windowDimensions;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(Color.BLACK);
g.drawImage(Main.checkers.bufferedImage, 0, 0, Main.checkers.width * Main.pixelSize, Main.checkers.height * Main.pixelSize, null);
}
}
【问题讨论】:
-
您已经创建了颜色模型,但没有为图像设置任何像素信息...
-
顺便说一下,摆脱不断重绘框架的循环。这是不必要的,会导致响应问题。
-
@camickr 我有这个循环的原因是因为这只是在 Java 中玩耍,看看我可以多快在自己的代码中绘制图像。从未将它用于任何严重的事情。
标签: java swing jframe jpanel bufferedimage