repaint() in run-Methode funktioniert nicht

MK234

Aktives Mitglied
Hallo,

ich habe zwei Klassen eine enthält eine paintComponent-Methode und die andere
einen Thread, in dessen run-Methode die paintComponent-Methode der anderen Klasse
durch repaint() aufgerufen werden soll. Leider funktioniert dies nicht.
Ich kann in der run-Methode sehrwohl andere Methoden der anderen Klasse aufrufen, aber paintComponent nicht.

Code-Fragment der Thread-Klasse
Java:
   public void run() {    
        while(!isInterrupted()) {          
            boolean angekommen = true; l                 
            try {               
                zeichenfl.repaint();                   
                Thread.sleep(300);  
                for(int i=0; i < zeichenfl.index_zu_Stelle.size(); i++) {
                    //wenn Marke noch nicht an Zielstelle angekommen
                    if(!zeichenfl.stellePressed(zeichenfl.markenX.get(i), 
                            zeichenfl.markenY.get(i), 
                            model.Stellen_Liste.get(zeichenfl.index_zu_Stelle.get(i)))) {
                       
                        angekommen = false;


Code-Fragmente der Klasse mit paintComponent und in welcher der obige Thread erzeugt wird:

Java:
 public void paintComponent (Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;

        setPreferredSize(new Dimension(panelWidth, panelHeight));        
        
        //Linienstärke und Unschärfe einstellen
        Stroke s = new BasicStroke((3*model.groesseWidth)/40);
        g2.setStroke(s);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                                RenderingHints.VALUE_ANTIALIAS_ON);





Java:
public void mousePressed(MouseEvent e) {           
         x = e.getX();
         y = e.getY();         
         
         //wenn aktivierte Transition geschaltet wurde
         if(e.isMetaDown() && !model.getLoeschKenn() && !model.getVerschKenn() &&
                         !model.getMehrVerschieben()) {                  
                 
                 //prüfen ob mit rechter Maustaste auf eine Transition geklickt wurde
                 for(int i=0; i < model.Trans_Liste.size(); i++) { 
                         if(!model.Trans_Liste.get(i).geloescht && transitionPressed(x, y, model.Trans_Liste.get(i))) {
                                 
                                 //prüfen ob Transition auch aktiviert ist
                                 if(model.Trans_Liste.get(i).trans_aktiv) {  
                                    
                                         
                                         //alle Ein- und Ausgangsstellen der Transition zwischenspeichern
                                         speichereEinAusStellen(i);     
                                
                                //Anzahl der Marken der Eingangsstellen werden jeweils um 1 reduziert
                                for(int l=0; l < index_von_Stelle.size(); l++) {                                                                                
                                         int index1 = index_von_Stelle.get(l);
                                         model.Stellen_Liste.get(index1).anzahl_Marken = 
                                                         model.Stellen_Liste.get(index1).anzahl_Marken - 1;
                                }
                                
                               
                                th = new Simulation(model, this, model.Trans_Liste.get(i).trans_x_kor,
                                        model.Trans_Liste.get(i).trans_y_kor, i);
                               
                                th.start();                                
                                simuLaeuft = true;                               
                             
                                //warten bis Marken Ziel erreicht haben                      
                                
                                while(simuLaeuft) { 
                                                            
                                    //do nothing
                                }              
                                  
                                
                                th.interrupt();


Hat jemand einen Tipp?

Danke im voraus
 

njans

Top Contributor
Ist deine Klasse, bei der du versuchst paintComponent aufzurufen anonym?

Wenn du sowas machst:
Java:
JPanel zeichenfl = new JPanel(){

public void paintComponent(...)
{
...
}
};

Dann wirst du die Methode nicht aufrufen können. Dazu muss es schon eine eigene Klasse sein (Innere würde auch gehen).
 

HoaX

Top Contributor
Ist deine Klasse, bei der du versuchst paintComponent aufzurufen anonym?

Wenn du sowas machst:
Java:
JPanel zeichenfl = new JPanel(){

public void paintComponent(...)
{
...
}
};

Dann wirst du die Methode nicht aufrufen können. Dazu muss es schon eine eigene Klasse sein (Innere würde auch gehen).

Nö, wie kommst du auf diesen Schluss? Eine anonyme Klasse ist auch eine echte eigene Klasse...
 

njans

Top Contributor
Also ich nehme mal an, dass du von der Variable "zeichenfl" die paintComponent aufrufen willst.
Es wäre wohl hilfreich einmal zu sehen, wo du die Variable initialisierst und deklarierst.
 

njans

Top Contributor
Eine anonyme Klasse ist auch eine echte eigene Klasse...

Das ist soweit ja auch richtig, nur sie definiert ja keinen eigenen Datentyp. Eine Anonyme Klasse welche von JPanel erbt, wird von Java immer noch wie ein JPanel behandelt. Wenn du ich nun meinem anonymen JPanel Methoden gebe, die JPanel eben nicht hat, kann ich diese auch nicht aufrufen :)

Java:
JPanel panel = new JPanel() {
			public void wouldLikeToCallIt()
			{}
		};
panel.wouldLikeToCallIt(); // Geht somit nicht
 

MK234

Aktives Mitglied
zeichenfl ist ein Objekt der Klasse Zeichenflaeche welche eine Erweiterung von JPanel ist, sie wird in einer Klasse Start durch die main-Methode erzeugt:

Java:
 public static void main(String[] args) {
                Model model = new Model();              
                NetzSpeichern dateiKlasse = new NetzSpeichern();
                Zeichenflaeche zeichenfl = new Zeichenflaeche(model);
                Oberflaeche oberflaeche = new Oberflaeche(zeichenfl, model, dateiKlasse);
                oberflaeche.setVisible(true);
        }

Die Klasse Oberflache ist eine Erweiterung von JFrame, in welches das JPanel eingefügt wird.


In zeichenfl wird ein Objekt der Klasse Simulation erzeugt, welche die run-Methode enthält (siehe auch das erste Code-Fragment):

Java:
public class Simulation extends Thread {

    Zeichenflaeche zeichenfl;
    
    Model model;
    
    /**
     * x Position der geschalteten Transition
     */
    int x;
    
    /**
     * y Position der geschalteten Transition
     */
    int y; 
    
    
    int indexTrans;
    
    public Simulation(Model model, Zeichenflaeche zeichenfl, int x, int y, int indexTrans) {  
        this.model = model;
        this.zeichenfl = zeichenfl;       
        this.x = x;
        this.y = y;
        this.indexTrans = indexTrans;
               
        //x-Position der wandernden Marken zu Beginn
        for(int i=0; i < zeichenfl.index_zu_Stelle.size(); i++) {
            zeichenfl.markenX.addLast(x);
        }
        
        //y-Position der wandernden Marken zu Beginn
        for(int i=0; i < zeichenfl.index_zu_Stelle.size(); i++) {
            zeichenfl.markenY.addLast(y);
        }
    }    
    
    
    public void run() {    
        while(!isInterrupted()) {          
            boolean angekommen = true; l                 
            try {               
                zeichenfl.repaint();                   
                Thread.sleep(300);  
                for(int i=0; i < zeichenfl.index_zu_Stelle.size(); i++) {
                    //wenn Marke noch nicht an Zielstelle angekommen
                    if(!zeichenfl.stellePressed(zeichenfl.markenX.get(i), 
                            zeichenfl.markenY.get(i), 
                            model.Stellen_Liste.get(zeichenfl.index_zu_Stelle.get(i)))) {
                       
                        angekommen = false;
                        
                        //einen Pixel in der x-Koordinate weiter
                        zeichenfl.markenX.set(i, zeichenfl.markenX.get(i) + 1);
                        
                        //y-Koordinate berechnen
                        double a = model.Stellen_Liste.get(zeichenfl.index_zu_Stelle.get(i)).stelle_y_kor;
                        double b = model.Trans_Liste.get(indexTrans).trans_y_kor;
                        double c = model.Stellen_Liste.get(zeichenfl.index_zu_Stelle.get(i)).stelle_x_kor;
                        double d = model.Trans_Liste.get(indexTrans).trans_x_kor;
                        double y1 = (a-b)/(c-d);
                        double y2 = y1 * zeichenfl.markenX.get(i) + b - y1*d;
                        int y3 = (int) y2;                   
                        
                        //einen Pixel in der y-Koordinate weiter
                        zeichenfl.markenY.set(i, y3);
                    }
                    //wenn Marke an Zielstelle angekommen
                    else {                       
                        //do nothing
                    }                   

                
                }
                //wenn alle Marken an ihren Zielen angekommen sind, dann Abbruch
                if(angekommen) {                  
                    interrupt();
                }     
                         
            } catch (InterruptedException e) {
                interrupt();               
            }          
        }
        zeichenfl.simuLaeuft = false;
    }
 

Marco13

Top Contributor
@njans: paintComponent ist schon eine Methode von JPanel (bzw. JComponent) aber ...

das Problem ist wohl das hier
Java:
public void mousePressed(MouseEvent e) {           
...

// Viele irrelevante Zeilen und tiefe Verschachtlungen später:
                                th.start();                                
                                simuLaeuft = true;                               
                             
                                //warten bis Marken Ziel erreicht haben                      
                                
                                while(simuLaeuft) { 
                                                            
                                    //do nothing
                                }

Durch das Warten wird der Event-Dispatch-Thread (EDT) blockiert, der sowohl für die Mauseingaben-Verarbeitung als auch das Zeichnen verantwortlich ist. Ein KSKB WILL ich in diesem Fall gar nicht sehen. Schau halt mal ob du dieses Warten da rausbringst....
 

njans

Top Contributor
@njans: paintComponent ist schon eine Methode von JPanel (bzw. JComponent) aber ...

Das die Methode von JComponent kommt, war auch nie bezweifelt worden. Es ging lediglich um das folgende:
Java:
JPanel panel = new JPanel() {
			
			@Override
			public void paintComponent(Graphics g)
			{
				super.paintComponent(g);
			}
		};
		panel.paintComponent(...); // Diese Public Methode hat JPanel nicht

Da das Problem aber anderen Ursprungs ist, ist diese Diskussion wohl obsolet.


das Problem ist wohl das hier
Java:
public void mousePressed(MouseEvent e) {           
...

// Viele irrelevante Zeilen und tiefe Verschachtlungen später:
                                th.start();                                
                                simuLaeuft = true;                               
                             
                                //warten bis Marken Ziel erreicht haben                      
                                
                                while(simuLaeuft) { 
                                                            
                                    //do nothing
                                }

Durch das Warten wird der Event-Dispatch-Thread (EDT) blockiert, der sowohl für die Mauseingaben-Verarbeitung als auch das Zeichnen verantwortlich ist. Ein KSKB WILL ich in diesem Fall gar nicht sehen. Schau halt mal ob du dieses Warten da rausbringst....

Hmm habe ich das Problem falsch verstanden?
@TO bitte erkläre doch einmal genau, was das Pronlem ist.

Ich bin bis eben davon ausgegangen, dass dir der Aufruf der Methode unmöglich ist, insofern, dass du vom Compiler bereits eine Fehlermeldung bekommst.
Aber Marco sieht da nun eher einen blockierten EDT. Demnach kannst du schon versuchen das aufzurufen, allerdings setzt das Programm den Aufruf niemals um, da es in der while-Schleife hängt.
 

MK234

Aktives Mitglied
ich habe dieses Warten entfernt und jetzt funktioniert es.

Es war wie Marco es vermutet hatte, es lag an der while-Schleife.

Vielen Dank in alle Helfer
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Repaint() in Methode Java Basics - Anfänger-Themen 13
F repaint() - Methode verzögern lassen? Java Basics - Anfänger-Themen 3
D Wenn ich repaint(); mache, flackert es so stark, das man fast nichts erkennen kann. Java Basics - Anfänger-Themen 11
S Repaint() Java Basics - Anfänger-Themen 1
J Erste Schritte Mit repaint() ist Label nicht sichtbar Java Basics - Anfänger-Themen 15
S Repaint() in der Schleife funktioniert nicht immer Java Basics - Anfänger-Themen 5
H Graphics / repaint Java Basics - Anfänger-Themen 8
D Verhindern das repaint beim vergrößern aufgerufen wird Java Basics - Anfänger-Themen 9
M Liste mit repaint aktualisieren Java Basics - Anfänger-Themen 1
E Probleme mit repaint() Java Basics - Anfänger-Themen 15
K Erkennt repaint nicht Java Basics - Anfänger-Themen 1
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
1 repaint() Funktion erzeugt Flackern Java Basics - Anfänger-Themen 33
I Anfängerfrage JPanel repaint() Java Basics - Anfänger-Themen 6
A externer repaint Aufruf Java Basics - Anfänger-Themen 9
G Problem mit repaint() Java Basics - Anfänger-Themen 2
J repaint() geht gar nicht; GUI aktualisieren Java Basics - Anfänger-Themen 10
J paint() vs repaint() Java Basics - Anfänger-Themen 3
C repaint wird nicht während Druck auf Maustaste ausgeführt. Java Basics - Anfänger-Themen 4
A Methoden repaint() zeichnet JPanel falsch Java Basics - Anfänger-Themen 3
P [JTable] Problem mit repaint() Java Basics - Anfänger-Themen 2
P Interpreter-Fehler Im for loop funkzioniert repaint nicht :( Java Basics - Anfänger-Themen 4
O Probleme mit der repaint-Funktion Java Basics - Anfänger-Themen 6
W repaint() ruft paint() nicht auf Java Basics - Anfänger-Themen 9
J repaint() funktioniert nicht wie gewünscht Java Basics - Anfänger-Themen 30
I Hangman CardLayout/repaint? Java Basics - Anfänger-Themen 2
H Variablen Probleme mit repaint() Java Basics - Anfänger-Themen 2
Y im applet malen ohne repaint paint ? Java Basics - Anfänger-Themen 6
J repaint(); launisch ? Java Basics - Anfänger-Themen 3
E Altes Bild bei repaint() löschen? Java Basics - Anfänger-Themen 10
Z Wie repaint() bei Uhr realisieren? Java Basics - Anfänger-Themen 12
N JScrollPane repaint(); geht nicht Java Basics - Anfänger-Themen 4
I repaint bei jpanel Java Basics - Anfänger-Themen 10
T repaint wir nicht mehr geöffnet! Java Basics - Anfänger-Themen 38
T Canvas aktualisierung mit repaint Java Basics - Anfänger-Themen 5
C GUI aktualisieren: repaint, validate, Fenstergröße ändern bringt nichts Java Basics - Anfänger-Themen 13
Antoras Swing repaint und Nullpointer Java Basics - Anfänger-Themen 6
O repaint() wird nicht ausgeführt Java Basics - Anfänger-Themen 3
S problem mit repaint() in Thread Java Basics - Anfänger-Themen 6
Antoras swing und repaint-Ersatz Java Basics - Anfänger-Themen 8
G Automatischer repaint bei Swing so wie bei AWT? Java Basics - Anfänger-Themen 7
M Problem mit repaint Java Basics - Anfänger-Themen 2
R Probleme beim Repaint Java Basics - Anfänger-Themen 3
T repaint einer komponente Java Basics - Anfänger-Themen 2
E repaint() aufrufen Java Basics - Anfänger-Themen 12
F paintComponent mit repaint() aufrufen Java Basics - Anfänger-Themen 27
kulturfenster Probleme mit repaint() Java Basics - Anfänger-Themen 2
S SelectionListener + repaint().Verständnisproblem ;) Java Basics - Anfänger-Themen 7
G Frage zu repaint() Java Basics - Anfänger-Themen 5
D JPanel repaint() wird nicht gemacht! Java Basics - Anfänger-Themen 7
B Problem mit repaint() Java Basics - Anfänger-Themen 8
V Reihenfolge von Befehlen - hier repaint() zu spät Java Basics - Anfänger-Themen 13
G repaint in paint aufrufen? Java Basics - Anfänger-Themen 9
I Erst repaint() dann zeichnen? Java Basics - Anfänger-Themen 6
D von paint() und repaint() im Applet Java Basics - Anfänger-Themen 4
J probleme mit repaint Java Basics - Anfänger-Themen 2
T Rekursive Methode Java Basics - Anfänger-Themen 13
Ü Methode soll Quadrat aus der Summer zurückgeben Java Basics - Anfänger-Themen 10
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
Leyla Spezifischte Methode Java Basics - Anfänger-Themen 16
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
M Methode sperren bis ein Kriterium erfüllt wurde Java Basics - Anfänger-Themen 3
D Switch Case Methode aufrufen Java Basics - Anfänger-Themen 3
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
til237 Iterative Methode in rekursive Methode umschreiben Java Basics - Anfänger-Themen 4
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
D next() Methode mehrfach verwenden Java Basics - Anfänger-Themen 1
Ostkreuz Methoden Von Dezimal zu Hexadezimal Methode toHex Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
N Throw an Main Methode übergeben Java Basics - Anfänger-Themen 7
M Methoden Methode 'wiederhole' nicht gefunden (Uebersetzungsfehler) Java Basics - Anfänger-Themen 1
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
D Methode aus dem Aufrufer aufrufen Java Basics - Anfänger-Themen 1
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben