Java 为什么我的缓冲图像不显示在我的JPanel中?

Java 为什么我的缓冲图像不显示在我的JPanel中?,java,swing,jpanel,bufferedimage,Java,Swing,Jpanel,Bufferedimage,我试图编辑新缓冲图像的像素,但当我使用新缓冲图像的构造函数时,它不会显示,当我加载图像并设置像素时,它会显示。为什么不显示 public void paintComponent(Graphics g) { super.paintComponent(g); int w = 1000; int h = 1000; BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

我试图编辑新缓冲图像的像素,但当我使用新缓冲图像的构造函数时,它不会显示,当我加载图像并设置像素时,它会显示。为什么不显示

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    int w = 1000;
    int h = 1000;

    BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
                          //ImageIO.read(new File("/Users/george/Documents/Ali.png"));

    int color = Color.BLACK.getRGB();

    for(int x = 0; x < w; x++) {
        for(int y = 0; y < h; y++) {
            image.setRGB(x, y, color);
        }
    }
    g.drawImage(image, 0, 0, null);
}
公共组件(图形g){
超级组件(g);
int w=1000;
int h=1000;
BuffereImage=新的BuffereImage(w,h,BuffereImage.TYPE_INT_RGB);
//read(新文件(“/Users/george/Documents/Ali.png”);
int color=color.BLACK.getRGB();
对于(int x=0;x
同样,不要从paintComponent内部编辑BuffereImage,而要在其他地方编辑。例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.*;

public class ImageEdit extends JPanel {
    private static final int PREF_W = 400;
    private static final int PREF_H = PREF_W;
    private static final int COLOR = Color.BLACK.getRGB();
    private BufferedImage image = null;

    public ImageEdit() {
        image = new BufferedImage(PREF_W, PREF_H, BufferedImage.TYPE_INT_RGB);
        for(int x = 0; x < PREF_H; x++) {
            for(int y = 0; y < PREF_W; y++) {
                image.setRGB(x, y, COLOR);
            }
        }        
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (image != null) {
            g.drawImage(image, 0, 0, this);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private static void createAndShowGui() {
        ImageEdit mainPanel = new ImageEdit();

        JFrame frame = new JFrame("ImageEdit");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.image.buffereImage;
导入javax.swing.*;
公共类ImageEdit扩展了JPanel{
专用静态最终整型预加值W=400;
私有静态final int PREF_H=PREF_W;
私有静态final int COLOR=COLOR.BLACK.getRGB();
私有缓冲区映像=空;
公共图像编辑(){
image=newbufferedimage(PREF_W,PREF_H,BufferedImage.TYPE_INT_RGB);
对于(int x=0;x
上面的代码运行时间相当长,因此不属于paintComponent方法。上面应该在paintComponent中的唯一代码是第一行和最后一行——super调用和
g.drawImage(…)
,就这样。图像创建和更改代码属于其他地方,因此不会降低程序的响应速度。另外,永远不要在paintComonent中读取图像,除非你想让你的用户体验一个痛苦的无响应GUI。我只是想创建一个图像,并想知道为什么这两种方法会产生不同的结果。不管怎样,你做得都不对,所以你应该期待意外的结果。在paintComponent中编辑图像是愚蠢的,有可能使paintComponent无法工作。从正确的地方开始,例如,在别处编辑你的图像,然后如果它失败了,然后显示你的更正代码。对我来说很好,你可以考虑使用<代码> < <代码> > <代码> >图像观察者<代码> >代码> DaveMaGe<代码>,坦率地说,<代码>图形> fIrrct < /C> >将更快:P-但我也同意HovercraftFullOfEels。