Heim >Java >javaLernprogramm >Warum wird die paintComponent()-Methode meines JPanels nicht aufgerufen und wie kann ich das Problem beheben?

Warum wird die paintComponent()-Methode meines JPanels nicht aufgerufen und wie kann ich das Problem beheben?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-13 06:43:10459Durchsuche

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

Programm greift nicht auf die Methode paintComponent() der erweiterten JPanel-Klasse zu

Das Problem tritt auf, weil die Methode paintComponent() der DrawPanelRemoteControl-Klasse nie aufgerufen wird. Die Methode paintComponent() ist für das Zeichnen des Panelinhalts verantwortlich, wird aber in diesem Fall nicht ausgeführt, da das imageLabel nicht neu gezeichnet wird.

Um dieses Problem zu beheben, müssen Sie sicherstellen, dass das imageLabel vorhanden ist wird jedes Mal neu gezeichnet, wenn das ByteArray geändert wird. Sie können dies tun, indem Sie die Methode imageLabel.repaint() in der Methode setNewImageGrayscale() der Klasse DrawPanelRemoteControl aufrufen. Dadurch wird sichergestellt, dass die Methode paintComponent() ausgeführt und das neue Bild gezeichnet wird.

Hier ist der aktualisierte Code für die DrawPanelRemoteControl-Klasse:

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();
    }
}

Durch Aufruf von imageLabel.repaint() in setNewImageGrayscale() stellen Sie sicher, dass das imageLabel jedes Mal neu gezeichnet wird, wenn das byteArray geändert wird. Dadurch wird die Methode paintComponent() ausgeführt und das neue Bild gezeichnet.

Das obige ist der detaillierte Inhalt vonWarum wird die paintComponent()-Methode meines JPanels nicht aufgerufen und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn