Rumah > Java > javaTutorial > Mengapa kaedah paintComponent() JPanel saya tidak dipanggil, dan bagaimana saya boleh membetulkannya?

Mengapa kaedah paintComponent() JPanel saya tidak dipanggil, dan bagaimana saya boleh membetulkannya?

Patricia Arquette
Lepaskan: 2024-12-13 06:43:10
asal
458 orang telah melayarinya

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

Program tidak mengakses kaedah paintComponent() kelas JPanel lanjutan

Isu timbul kerana kaedah paintComponent() kelas DrawPanelRemoteControl tidak pernah dipanggil. Kaedah paintComponent() bertanggungjawab untuk melukis kandungan panel, tetapi dalam kes ini, ia tidak dilaksanakan kerana imageLabel tidak dicat semula.

Untuk menyelesaikan isu ini, anda perlu memastikan bahawa imageLabel adalah dicat semula apabila byteArray diubah. Anda boleh melakukan ini dengan memanggil kaedah imageLabel.repaint() dalam kaedah setNewImageGrayscale() kelas DrawPanelRemoteControl. Ini akan memastikan bahawa kaedah paintComponent() dilaksanakan dan imej baharu dilukis.

Berikut ialah kod yang dikemas kini untuk kelas 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();
    }
}
Salin selepas log masuk

Dengan memanggil imageLabel.repaint() dalam setNewImageGrayscale(), anda memastikan bahawa imageLabel dicat semula setiap kali byteArray diubah. Ini akan menyebabkan kaedah paintComponent() dilaksanakan dan imej baharu akan dilukis.

Atas ialah kandungan terperinci Mengapa kaedah paintComponent() JPanel saya tidak dipanggil, dan bagaimana saya boleh membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan