ホームページ >Java >&#&チュートリアル >JPanel のPaintComponent() メソッドが呼び出されないのはなぜですか?それを修正するにはどうすればよいですか?

JPanel のPaintComponent() メソッドが呼び出されないのはなぜですか?それを修正するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-13 06:43:10517ブラウズ

Why isn't my JPanel's paintComponent() method being called, and how can I fix it?

拡張 JPanel クラスのメソッドpaintComponent()にアクセスしないプログラム

この問題は、DrawPanelRemoteControlクラスのpaintComponent()メソッドが呼び出されないために発生します。 PaintComponent() メソッドはパネルのコンテンツを描画する役割を果たしますが、この場合、imageLabel が再描画されていないため実行されません。

この問題を解決するには、imageLabel がbyteArray が変更されるたびに再描画されます。これを行うには、DrawPanelRemoteControl クラスの setNewImageGrayscale() メソッドで imageLabel.repaint() メソッドを呼び出します。これにより、paintComponent() メソッドが確実に実行され、新しい画像が描画されます。

DrawPanelRemoteControl クラスの更新されたコードは次のとおりです。

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.MemoryImageSource;
import java.awt.image.Raster;
import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

class DrawPanelRemoteControl extends JPanel
{
    private byte[] byteArray=null;
    private Image image;
    private JLabel imageLabel=new JLabel();
    private Dimension imageDimension;

    public DrawPanelRemoteControl(Dimension imageDimension)
    {
        this.imageDimension=imageDimension;
        add(imageLabel);
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        System.out.println(".");
        if(byteArray!=null)
        {
            image=getGrayscaleImageFromArray(byteArray,imageDimension.width,imageDimension.height);
            imageLabel.setIcon(new ImageIcon(image));
        }
    }

    private Image getGrayscaleImageFromArray(byte[] buffer, int width, int height)
    {
        ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
        int[] nBits = { 8 };
        ColorModel cm = new ComponentColorModel(cs, nBits, false, true,Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
        SampleModel sm = cm.createCompatibleSampleModel(width, height);
        DataBufferByte db = new DataBufferByte(buffer, width * height);
        WritableRaster raster = Raster.createWritableRaster(sm, db, null);
        BufferedImage result = new BufferedImage(cm, raster, false, null);
        return result;
    }

    void setNewImageGrayscale(byte[] array)
    {
        this.byteArray=array;
        this.intArray=null;
        imageLabel.repaint();
    }
}

で imageLabel.repaint() を呼び出すことにより、 setNewImageGrayscale() を使用すると、byteArray が変更されるたびに imageLabel が再描画されるようになります。これにより、paintComponent() メソッドが実行され、新しい画像が描画されます。

以上がJPanel のPaintComponent() メソッドが呼び出されないのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。