Java 在JFrame中显示图像时遇到问题

Java 在JFrame中显示图像时遇到问题,java,image,swing,jframe,pixel,Java,Image,Swing,Jframe,Pixel,所以我试着用MemoryImageSource写一些像素,并在一帧中显示。代码如下: public class ImageDraw extends JPanel { Image img; public void ImageDraw(){ //super(); int w=600; int h=400; int pixels[] = new int[w*h]; int i=0; for(i=0;i&l

所以我试着用MemoryImageSource写一些像素,并在一帧中显示。代码如下:

public class ImageDraw extends JPanel {

Image img;

public void ImageDraw(){        
    //super();      
    int w=600;
    int h=400;

    int pixels[] = new int[w*h];    
    int i=0;    
    for(i=0;i<w*h;i++){
        //pixels[i++]=0;
        pixels[i]=255;      
    }   
    img = createImage(new MemoryImageSource(w,h,pixels,0,w));
}

 public void paint(Graphics g){     
    g.drawImage(img,  0, 0, this);
 }
}
它只显示一个空帧。为什么?我的目标是学习如何逐像素绘制,所以这只是我绘制的测试图像,以查看它是否有效


谢谢。

您的代码有两个问题。首先

public void ImageDraw() {  ... }
是一个方法,而不是构造函数。在代码中根本不调用该方法。把这行改成

public ImageDraw() {  ... }
没有
void
,使其成为默认构造函数

其次,需要设置像素数据的alpha值:

pixels[i] = 255 + 0xFF000000;
还有两点:

  • 请不要重写
    paint(…)
    ,而要重写
    paintComponent(…)
  • 不要设置
    JFrame
    的大小,而是覆盖组件的方法
    getPreferredSize()
    并使用
    frame.pack()

您的代码有两个问题。首先

public void ImageDraw() {  ... }
是一个方法,而不是构造函数。在代码中根本不调用该方法。把这行改成

public ImageDraw() {  ... }
没有
void
,使其成为默认构造函数

其次,需要设置像素数据的alpha值:

pixels[i] = 255 + 0xFF000000;
还有两点:

  • 请不要重写
    paint(…)
    ,而要重写
    paintComponent(…)
  • 不要设置
    JFrame
    的大小,而是覆盖组件的方法
    getPreferredSize()
    并使用
    frame.pack()

您希望看到什么?看起来你正在制作一个空白图像,并在空白面板上绘制它…我期望的是一个空白面板。我期望的是一种颜色的背景,因为我刚刚参加了会议,所以并不在乎是哪种颜色。你期望看到什么?看起来你正在制作一个空白图像,并将其绘制在空白面板上……我期望的是一个空白面板。我期望的是一种颜色的背景,因为我刚刚参加了培训,所以并不在乎是哪种颜色。对构造函数的理解很好,但他在运行代码时怎么没有得到NPE呢
img
paint
方法中应为空。@Paul
drawImage
包含
null
检查。噢,谢谢!像素数据的结构是什么?默认情况下是RGBA吗?我可以指定一个不同的模型吗?+1,@achit,您是否阅读了MemoryImageSource API以了解有效的构造函数和方法是什么?@achit您可以使用4参数构造函数创建一个
DirectColorModel
,该构造函数指定24位和掩码,其中红色为
0xff0000
,绿色为
0x00ff00
,蓝色为
0x0000ff
。这将把所有的像素都视为不透明的。对构造函数的理解很好,但是当他运行代码时,怎么会没有NPE呢
img
paint
方法中应为空。@Paul
drawImage
包含
null
检查。噢,谢谢!像素数据的结构是什么?默认情况下是RGBA吗?我可以指定一个不同的模型吗?+1,@achit,您是否阅读了MemoryImageSource API以了解有效的构造函数和方法是什么?@achit您可以使用4参数构造函数创建一个
DirectColorModel
,该构造函数指定24位和掩码,其中红色为
0xff0000
,绿色为
0x00ff00
,蓝色为
0x0000ff
。这会将所有像素视为不透明。