2017-11-07 1 views
-1

Also habe ich einen JFrame mit einigen Buttons und einer JComponent zum Einzeichnen. Ich lade einige Images und male den 1. in die JComponent. Jetzt ist mein Problem, dass meine JComponent, sobald ich das 1. Mal male, permanent neu streicht und nach ein paar Sekunden bekomme ich ein OutOfMemoryError ... Ich denke, das g.drawImage(...) ist das Problem, denn wenn ich es auskommentieren gibt es keine unendliche Schleife mehr:JComponent permanent neu streichen

@Override 
public void paintComponent(Graphics g){ 
    System.out.println("Test"); 
    if(!images.isEmpty()){ 
     Image img = activeImage.img.getScaledInstance(middleImage.getWidth(), middleImage.getHeight(), Image.SCALE_SMOOTH); 
     if(mode != 0){ 
      if(mis != null){ 
       img = createImage(mis).getScaledInstance(middleImage.getWidth(), middleImage.getHeight(), Image.SCALE_SMOOTH);      
      } 
     } 
     g.drawImage(img, 0, 0, this); 
    } 
} 
+2

Willkommen bei DAMIT. Bitte tun Sie die Leute, die Ihnen einen Gefallen tun wollen und erstellen Sie ein [minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) –

+1

1) Sie müssen 'repaint 'und' revalidate' ausführen auf Event-Versand-Thread (EDT) über 'invokeLater'. 2) Ihre Threads, insbesondere das 'ContinuousDraw' gehen in eine Schleife und schlafen niemals, was die EDT-Fähigkeit beeinträchtigen kann, sich neu zu streichen. 3) 'createImage (mis)' in der Schleife kann zu wenig Arbeitsspeicher verursachen, wenn es viel zu oft ausgeführt wird. – tsolakp

+1

Aktualisieren Sie den Status einer Komponente nicht innerhalb einer Paint-Methode. – MadProgrammer

Antwort

0

Sie sind nicht wirklich etwas zu malen, und setBounds tut Anruf invalidate (dass Anrufe neu streichen)

So wird dieser Block:

newImage.setBounds(560, 640 + this.getHeight()-720, 720 + this.getWidth()-1280, 40); 
    scrollRoom.setBounds(0, 0, 437, this.getHeight()); 
    middleImage.setBounds(560, 0, this.getWidth()-560, this.getHeight()-80); 
    autoFade.setBounds(436, 0, 124, 100); 
    createHistogram.setBounds(436, 100, 124, 100); 
    imageMorphology.setBounds(436, 200, 124, 100); 
    editImage.setBounds(436, 300, 124, 100); 
    endActiveMode.setBounds(436, this.getHeight() - (720-573), 124, 100); 

Muss an den Konstruktor vor setVisi bewegt werden ble (true)

und Sie nicht Farbe außer Kraft setzen müssen (Graphics)

Das zweite Problem ist die Threads, durch Lauf rufen Sie es auf Haupt-Thread ausgeführt werden, rufen Sie stattdessen:

super.start(); 
+1

Nein, Sie müssen die Farbe entfernen @HovercraftFullOfEels –

+0

Ich habe das in Farbe, so dass es die Komponenten im JFrame neu überpinselt, wenn es in der Größe geändert wird. Aber während ich dies schreibe, denke ich darüber nach, es in einen Größenanpasser zu setzen. – ultimate2106

+0

Aber das änderte nicht das permanente Repaint für die JComponent:/ – ultimate2106