Java jPanel没有';有时无法显示完整的缓冲区图像

Java jPanel没有';有时无法显示完整的缓冲区图像,java,jpanel,bufferedimage,Java,Jpanel,Bufferedimage,我正在尝试使用drawImage向jPanel(processedPanel)显示集群图像。 这是我的密码 nt.setData(buff); nt.starting(); BufferedImage clusterizedImage = nt.getClusterizedImage(); Graphics g = processedPanel.getGraphics(); System.out.println(clusterizedImage.getWidth()+"-"+clusteriz

我正在尝试使用drawImage向jPanel(processedPanel)显示集群图像。 这是我的密码

nt.setData(buff);
nt.starting();
BufferedImage clusterizedImage = nt.getClusterizedImage();
Graphics g = processedPanel.getGraphics();

System.out.println(clusterizedImage.getWidth()+"-"+clusterizedImage.getHeight());
g.drawImage(clusterizedImage, 0, 0, null);

try {
    File outputfile = new File("check.png");
    ImageIO.write(clusterizedImage, "png", outputfile);
} catch (IOException e) {
    System.out.println("failed");
}
NetworkTester类

public class NetworkTester {
    private BufferedImage testBuff;
    private Vector<InputSet> testingData;
    private double[] inputD;
    private double output;
    private BufferedImage buff;

    private NeuralNetwork nnValue;

    public void NetworkTester(){
        nnValue = new NeuralNetwork();
    }

    public void setData(BufferedImage testBuff){
        this.testBuff = testBuff;
    }

    public BufferedImage getClusterizedImage(){
        return buff;
    }

    private void extract(){
        int i,j;
        int[] inputs;

        System.out.println("Segmentation started");
        int fff = 0;

        SawitImage si = new SawitImage(200, 200);

        BufferedImage inputImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
        //si.setImage(testBuff);
        for(i=0;i<200;i++){
            for(j=0;j<200;j++){
                si.setOutputPixel(i, j, testBuff.getRGB(i, j));
                inputImage.setRGB(i, j, testBuff.getRGB(i,j));
                //System.out.println(si.getOutputPixel(i, j));
            }
        }
        si.setImage(inputImage);
        //System.out.println(si.getWidth()+" - "+si.getHeight());
        Segmentation pp = new Segmentation(si);
        pp.rgbToLab();
        pp.KMeans();
        pp.index(pp.Kluster(pp.K1(pp.rgbToLab()), pp.K2(pp.rgbToLab()), pp.K3(pp.rgbToLab())));
        buff = pp.theFruits();

        if(fff == 0){
            System.out.println("Feature Extraction started");
            fff = 1;
        }

        HueFinder hf = new HueFinder();
        hf.HueValue(buff);
        HistogramHue hh = new HistogramHue();
        hh.hueHistogram(hf.getHueValues());
        inputs = hh.getH();
        //System.out.println("Length : "+inputs.length);
        //test image
        try {
            // retrieve image
            File outputfile = new File("test_data.png");
            ImageIO.write(buff, "png", outputfile);
        } catch (IOException e) {
            System.out.println("failed");
        }
        //end test image

        System.out.println("Segmentation done!");
        System.out.println("Feature Extraction done!");
        double a;
        InputSet tempInput = new InputSet("1");
        testingData = new Vector<>();
        for(i=0;i<inputs.length;i++){
            a = inputs[i];
            tempInput.addElement(a/360);
        }
        testingData.addElement(tempInput);

        System.out.println("Input vector done!");
    }

    private void testStart(){
        int i;

        BPTester bp = new BPTester();
        inputD = new double[testingData.get(0).size()];
        for(i=0;i<testingData.get(0).size();i++){
            inputD[i] = Double.parseDouble(testingData.get(0).get(i).toString());
            bp.setInput(inputD[i], i);
        }
        bp.readWeight();
        bp.operationOnHidden();
        bp.operationOnOutput();
        output = bp.getOutput();
    }

    public void starting(){
        extract();
        testStart();
    }

    public double getOutput(){
        return output;
    }
}
输出文件正常。没什么问题。问题是我的jPanel有时(不是每次)不会显示BuffereImage的所有像素

截图


我希望我的问题没有违反规则。

你在哪里加载图像?它在哪个线程上运行?我有一个daemonthread,它会随着时间的推移替换我的buff。之后,我使用nt.setData将我的buff(它包含我的相机当前帧)发送到nt线程(我刚刚更新了代码)。然后,我使用getClustereImage()将图像取回。如果你能为这个bug创建一个脚本,你发布的小代码对我们检查bug是没有用的。目前,这个问题将以“主题外的代码为什么不工作?”结束。@Ferrybig我刚刚更新了我的代码,这不是你在JPanel上绘制的方式。您需要重写
paintComponent
方法。并确保重写方法的第一行调用
super.paintComponent
。有关详细信息,请参见教程。(当然,您不需要自定义绘制;只需将图像放在ImageIcon中,然后在面板中放置一个使用该ImageIcon的JLabel。)
class DaemonThread implements Runnable{
    protected volatile boolean runnable = false;

    @Override
    public void run(){
        synchronized(this){
            while(runnable){
                buff = cap.getFrame();

                Graphics g = videoPanel.getGraphics();
                if(g.drawImage(buff, 0, 0, 200, 200, 0, 0, 200, 200, null)){
                    if(runnable == false){
                        System.out.println("Stopped");
                    }
                }
            }
        }
    }
}