Maison >Java >javaDidacticiel >Pourquoi la méthode paintComponent() de mon JPanel n'est-elle pas appelée et comment puis-je y remédier ?

Pourquoi la méthode paintComponent() de mon JPanel n'est-elle pas appelée et comment puis-je y remédier ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-13 06:43:10459parcourir

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

Le programme n'accède pas à la méthode paintComponent() de la classe JPanel étendue

Le problème se pose car la méthode paintComponent() de la classe DrawPanelRemoteControl n'est jamais appelée. La méthode paintComponent() est chargée de dessiner le contenu du panneau, mais dans ce cas, elle n'est pas exécutée car l'imageLabel n'est pas repeint.

Pour résoudre ce problème, vous devez vous assurer que l'imageLabel est repeint chaque fois que le byteArray est modifié. Vous pouvez le faire en appelant la méthode imageLabel.repaint() dans la méthode setNewImageGrayscale() de la classe DrawPanelRemoteControl. Cela garantira que la méthode paintComponent() est exécutée et que la nouvelle image est dessinée.

Voici le code mis à jour pour la classe 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();
    }
}

En appelant imageLabel.repaint() dans setNewImageGrayscale(), vous vous assurez que l'imageLabel est repeint chaque fois que le byteArray est modifié. Cela entraînera l'exécution de la méthode paintComponent() et la nouvelle image sera dessinée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn