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