程序无法访问扩展 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中文网其他相关文章!