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