EDT Problem? Kein Aufruf der repaint Methode

Planich

Aktives Mitglied
Hallo,
ich schildere zunächst mein Problem: ich habe bereits gegoogled und denke mein Problem hängt mit dem EDT zusammen. Ich habe gelesen man soll nicht GUI spezifische Arbeiten von einem extra Thread erledigen lassen. Ich glaube an diesem Punkt habe entweder Mist gebaut oder die Sache völlig falsch verstanden. Außerdem habe ich gelesen man soll nicht einfach so Komponenten erstellen über die contentPane innerhalb des Frames, sondern soll das irgendwie anders machen, das hab ich nicht ganz verstanden, vielleicht liegts auch daran.

ich poste jetzt mal den Code der für mein Problem in Frage kommt.

Java:
private void buttonZoomInActionPerformed(java.awt.event.ActionEvent evt)
       {
           //Hier lasse ich vom Thread die Arbeiten verrichten
           new Thread(new Runnable() {
                            @Override
                            public void run() {
                                
                                ownImage.increaseZoomFactor();      
                                ownImage.zoomUpdate();

                                
                            }
                        }).start();
           
           
           
           
           
           //Und hier dann die GUI spezifischen Sachen - ich dachte an der Stelle übernimmt dann       einfach der EDT wieder die Arbeit
           //Remove
           panelLeft.remove(ownPanel);
           getContentPane().remove(panelLeft);


           //OwnPanel mit geladenem BufferedImage erstellen
           ownPanel=null;
           ownPanel = new OwnPanel(ownImage.getBI());
           //dem LeftPanel das OwnPanel hinzufügen
           panelLeft=null;
           panelLeft = new JScrollPane(ownPanel); 
           getContentPane().add(panelLeft, BorderLayout.WEST);
           ownPanel.repaint();
                                
           
           //ownPanel.setImage(ownImage.getBI());
               
           //getContentPane().repaint();
            
       }

Hier mal das was im zoomUpdate() passiert
Java:
public void zoomUpdate()
        {
            //bei 16bit
            if(type==1)
            {        
            short[] data = ((DataBufferUShort) bi.getData().getDataBuffer()).getData();
            byte[] bytearr = new byte[data.length];
                       
            bytearr=shortToByte(data,ug ,og ); 
            
            byte [] bytearrZoomed = new byte[bytearr.length*zoomFactor];
            for (int i=0; i<bytearr.length;i++)
            {
                bytearrZoomed[i*2]=bytearr[i];                
                bytearrZoomed[(i*2)+1]=bytearr[i];
            }
            
            width=width*zoomFactor;
            height=height*zoomFactor;
            
            DataBufferByte buffer = new DataBufferByte(bytearrZoomed, bytearrZoomed.length);
            binew=OwnImage.create8bitBufferedImage(buffer,width,height);
            
            
            }


            //bei 8bit   
            if(type==0)
            {              
            byte[] data = ((DataBufferByte) bi.getData().getDataBuffer()).getData();

            

            DataBufferByte buffer = new DataBufferByte(data, data.length);
            binew=OwnImage.create8bitBufferedImage(buffer,width,height);
            
            }
        }

ich will einfach nur das Bild größer machen.
Durch ein System.out. im paintComponent meines OwnPanel würde ich sehen wenn er zeichnet. Macht er aber nicht und ich möchte gerne rausfinden was ich falsch mache, deshalb bitte ich euch Profis um Hilfe.

Danke
 
wo kann man hier editieren? oder geht das beim ersten Post im Thread gar nicht? bin wohl grad blind

also ich habe ein wenig Code geändert und kriege nun ein repaint mittels validate(), jedoch wirft er mir sofort eine Exception

Java:
private void buttonZoomInActionPerformed(java.awt.event.ActionEvent evt)
       {         
           new Thread(new Runnable() {
                            
                            public void run() {
                                
                                ownImage.increaseZoomFactor();      
                                ownImage.zoomUpdate();
                                System.out.println("Erste Methode nach Ende ZoomUpdate");
                            
                                SwingUtilities.invokeLater(new Runnable() {
                                    
                                    
                                    public void run() {
                                       //Remove
                                       panelLeft.remove(ownPanel);
                                       getContentPane().remove(panelLeft);


                                       //OwnPanel mit geladenem BufferedImage erstellen
                                       ownPanel=null;
                                       System.out.println("Fütterung    "+ownImage.getWidth()+"   "+ownImage.getHeight() );
                                       ownPanel = new OwnPanel(ownImage.getBI());
                                       ownPanel.setSize(new Dimension(1200,1500));
                                       //dem LeftPanel das OwnPanel hinzufügen
                                       panelLeft=null;
                                       panelLeft = new JScrollPane(ownPanel); 
                                       panelLeft.setSize(new Dimension(1300,1600));
                                       getContentPane().add(panelLeft, BorderLayout.WEST);
                                       System.out.println(panelLeft.getSize()+"  "+ownPanel.getSize());
                                       System.out.println(ownPanel.image.getHeight());
                                       validate();
                                       //ownPanel.repaint();
                                    }

                                
                            
                            
                                });}}).start();
           
                                
                       
       
       }

die Systemouts sind für mich zum Debuggen

Hier mal das was er mir auswirft:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 659352
at java.awt.image.DataBufferByte.getElem(DataBufferByte.java:183)
at java.awt.image.ComponentSampleModel.getDataElements(ComponentSampleModel.java:593)
at java.awt.image.Raster.getDataElements(Raster.java:1469)
at sun.java2d.loops.OpaqueCopyAnyToArgb.Blit(CustomComponent.java:126)
at sun.java2d.loops.GraphicsPrimitive.convertFrom(GraphicsPrimitive.java:542)
at sun.java2d.loops.GraphicsPrimitive.convertFrom(GraphicsPrimitive.java:523)
at sun.java2d.loops.MaskBlit$General.MaskBlit(MaskBlit.java:171)
at sun.java2d.loops.Blit$GeneralMaskBlit.Blit(Blit.java:186)
at sun.java2d.pipe.DrawImage.blitSurfaceData(DrawImage.java:927)
at sun.java2d.pipe.DrawImage.renderImageCopy(DrawImage.java:550)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:54)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:982)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2979)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2964)
at frametest.OwnPanel.paintComponent(OwnPanel.java:45)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JViewport.paint(JViewport.java:747)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)



Falls jemand helfen möchte, was schön wäre weil es wirklich dringend ist, so füge ich mal das komplette Projekt mit an

Ich bin über jede Hilfe dankbar, weil ich mit meinem Latein am Ende bin
 
Zuletzt bearbeitet von einem Moderator:
das anzuzeigende Bild scheinst du während der Berechnungen nicht zu verändern, wie sieht es mit den Variablen width und height aus,
werden die in OwnPanel.paintComponent() verwendet?

grundsätzlich musst du alle Datenänderungen in SwingUtilities.invokeLater() machen,
für OwnPanel führst du das ja bereits aus
----

1 MB gepackter Anhang, das klingt nicht sehr attraktiv,
bastle ein 200 Zeilen-Programm direkt fürs Forum,

----

man kann Beiträge eine Stunde lang editieren


----
edit:
Java:
 byte [] bytearrZoomed = new byte[bytearr.length*zoomFactor];

            width=width*zoomFactor;
            height=height*zoomFactor;
hierbei ist doch grundsätzlich nicht sicher, dass bytearrZoomed.length == width*height ist, oder?
ist das egal?
 
Zuletzt bearbeitet von einem Moderator:
das anzuzeigende Bild scheinst du während der Berechnungen nicht zu verändern, wie sieht es mit den Variablen width und height aus,
werden die in OwnPanel.paintComponent() verwendet?
width und height werden in OwnPanel.paintComponent() nur verwendet um das Bild zentriert zu zeichnen

grundsätzlich musst du alle Datenänderungen in SwingUtilities.invokeLater() machen,
für OwnPanel führst du das ja bereits aus

Datenänderungen klingt jetzt sehr allgemein, kannst du das vielleicht näher erläutern? Und wenn ich nicht in einem extra Thread bin, dann bin ich doch eigentlich mit meinem Code im EDT und kann mir das invokeLater sparen, oder habe ich da wieder irgendwo was falsch verstanden?

1 MB gepackter Anhang, das klingt nicht sehr attraktiv,
bastle ein 200 Zeilen-Programm direkt fürs Forum,
Anders kann ich das ja nun mal hier nicht hochladen 🙁 und ich weiß grad nicht so recht wie ich das ohne es aus dem Zusammenhang zu reißen abspecken soll. Vielleicht kann ich auch einfach mehr relevanten Code hier posten?

man kann Beiträge eine Stunde lang editieren
ah ok!

edit:
Java:
 byte [] bytearrZoomed = new byte[bytearr.length*zoomFactor];

            width=width*zoomFactor;
            height=height*zoomFactor;
hierbei ist doch grundsätzlich nicht sicher, dass bytearrZoomed.length == width*height ist, oder?
ist das egal?

ich probiere gerade erstmal vom Anfangszoomfactor 1 mit einem increase auf Zoomfactor 2 das ganze aus. In diesem Falle verdoppelt sich Höhe und Breite. Und mir fällt auch gerade auf, dass sich ja dann das bytearr nicht auch einfach verdoppelt, ich glaube hier werd ich gleich mal ansetzen. Das könnte nämlich die Exception sein

EDIT: fast hät ichs vergessen, ein riesen großes Dankeschön erstmal

EDIT2: SUPER! Genau das war der Fehler. Bin halt kein Profi. Also ich hab einfach die Arraygröße des Bildes falsch berechnet. Jetzt muss ich nur die Farbwerte in das "neue" Array richtig setzen, das scheint grad auf Anhieb nicht so trivial.
 
Zuletzt bearbeitet:
an die quadratische Erhöhung hatte ich (auch) gar nicht gedacht, nur die Rundungsdifferenz 😉

> Datenänderungen klingt jetzt sehr allgemein, kannst du das vielleicht näher erläutern?
alles worauf der EDT/AWT-Thread parallel zugreift, also GUI-Daten wie das Bild, Model von JTable, JList usw.

> Und wenn ich nicht in einem extra Thread bin, dann bin ich doch eigentlich mit meinem Code im EDT
> und kann mir das invokeLater sparen, oder habe ich da wieder irgendwo was falsch verstanden?

richtig, aber du bist ja anscheinend in einem extra Thread
 
Zuletzt bearbeitet von einem Moderator:
Statt den Zoom manuell über ein neues Array zu erledigen, was echt nervenaufreibend wäre, habe ich mich für g2.drawImage(image, 0, 0, newW, newH, null); mit den angepassten Imagegrößen entschieden. Das ist um ein vielfaches einfacher zu implementieren.
Im Moment ist alles super, danke nochmal 🙂

Edit: kann ich meinen Anhang oben irgendwie wieder löschen?
Wenn nein, kannst du das als Mod bitte für mich machen?
 

Neue Themen


Zurück
Oben