Heim >Java >javaLernprogramm >Warum wird die paintComponent()-Methode meines JPanels nicht aufgerufen und wie kann ich das Problem beheben?
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!