Probleme mit paintComponent

C

Carcharoth

Aktives Mitglied
Hallo

Da ich paintComponent nicht direkt aufrufen will, habe ich mir eine Methode zeichne gebaut die repaint aufruft.
Ich dachte bisher den Aufruf von repaint würde intern zur Folge haben, dass paintComponent aufgerufen wird.
Liege ich damit falsch ?

Jedenfalls muss ich feststellen, dass der Aufruf von zeichne, paintComponent nicht aufruft (habe ich getestet).
Hat jemand ein Tipp?

Java:
public class GrafischeDarstellung extends JLabel {

    public void zeichne() {
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        ...
    }

}

Danke und Gruss
 
mihe7

mihe7

Top Contributor
kneitzel

kneitzel

Top Contributor
Also repaint ruft nicht direkt paintComponent auf. Es wird lediglich ein Event generiert, das die Komponente anweist, bei nächster Gelegenheit neu gemalt zu werden.

Der EDT muss das Event also erst verarbeiten. Wenn Du aber den EDT blockierst, dann wird auch nichts gemalt. (Als kleine Vermutung, dass Du sowas machen könntest...)
 
C

Carcharoth

Aktives Mitglied
In die Richtung habe ich auch gedacht. denn wenn ich vor dem Aufruf ein JOptionPane.Message einbaue, dann geht es.

Ich hatte mal ein ähnliches Problem mit einem MouseListener der das Updaten eines JFrames blockierte. Damals wurde es mit einem separat laufender Thread gelöst. Ich versuche hier die Lösung umzusetzen, wobei mir noch nicht so ganz klar ist, was jetzt in welchem Thread laufen muss... Ich muss noch etwas drüber brüten.
 
kneitzel

kneitzel

Top Contributor
wobei mir noch nicht so ganz klar ist, was jetzt in welchem Thread laufen muss
Alles, was etwas länger läuft, das kommt in einen eigen Thread, damit der EDT nicht blockiert wird.
Dabei aber alle Änderungen an der UI über SwingUtilities invokeLater durchführen, denn Änderungen an der UI sollten immer im EDT erfolgen.

Das ist unter dem Strich auch ähnlich dem repaint: Es wird ein Event in die EventQueue gepackt, das den EDT anweist, das im invokeLater aufzurufen. Es gibt also einen gewissen Zeitversatz,
 
C

Carcharoth

Aktives Mitglied
Meine stark entschlackte Klasse mit der Main-Methode sieht wie folgt aus.
- crossExchange.optimieren() ist eine Methode einer anderen Klasse die umfangreiche Berechnungen anstellt und ein Boolean zurückgibt falls eine Optimierung gemacht werden konnte.
- meineGrafischeDarstellung.updateWegSOE() ist eine Methode der Klasse GrafischeDarstellung in der die Ergebnisse der Berechnungen dargestellt werden und die überschriebene paintComponent Methode aufgerufen wird. Ich habe versucht dieses Update des UI innerhalb des Invokelaters zu platzieren aber ich bin mir nicht sicher mit dem new Thread. Müsste dort die gesamte Berechnungsschleife drin sitzen ?

Java:
import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

public class UF extends JFrame {

    public JPanel panel;
    private JPanel contentPane;
    private GrafischeDarstellung meineGrafischeDarstellung;
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UF frame = new UF();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
    public UF() {
        // UserForm einrichten
        createComponents();
        
        // GrafischeDarstellung erstellen
        meineGrafischeDarstellung  = new GrafischeDarstellung(800,800);
        panel.add(meineGrafischeDarstellung);

        // Berechnung durchführen und GrafischeDarstellung anpassen
        while (crossExchange.optimieren()) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                meineGrafischeDarstellung.updateWegSOE();
                            }
                        });
                    }
                }).start();       
        }
    }
    
    private void createComponents() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(0, 0, 1300, 950);
        setLocationRelativeTo(null);
        setResizable(false);

        contentPane = new JPanel();
        contentPane.setLayout(null);
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);

        panel = new JPanel();
        panel.setBorder(new LineBorder(new Color(0, 0, 0)));
        panel.setBounds(0, 0, 800, 800);
        contentPane.add(panel);
        panel.setLayout(null);
    }

}
 
kneitzel

kneitzel

Top Contributor
Also das sieht extrem dubios aus:

Java:
        while (crossExchange.optimieren()) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                meineGrafischeDarstellung.updateWegSOE();
                            }
                        });
                    }
                }).start();       
        }

Das crossExchange.optimieren() sind die Berechnungen? dann gehört das in einen Thread....

Der Aufruf von invokeLater muss in keinen eigenen Thread - das ist etwas, das ganz schnell geht. Das macht also keinen Sinn.

Also evtl. sollte es etwas sein wie:
Java:
new Thread(new Runnable() {
    @Override
    public void run() {
        while (crossExchange.optimieren()) {
            SwingUtilities.invokeLater(() -> meineGrafischeDarstellung.updateWegSOE());
        }
    }
}).start();

Also es wird ein Thread erzeugt, der so lange optimieren aufruft, bis es false zurück gibt.
Und immer, wenn es true zurück gibt, wird updateWegSOE im EDT ausgeführt.
 
C

Carcharoth

Aktives Mitglied
OK jetzt habe ich es umsetzen können. Es läuft super.

Was ich nicht ganz verstehe, ist warum meine Berechnungen den EDT blockiert haben (und dadurch die GrafischeDarstellung nicht angepasst wurde).

Bei folgendem Code, den ich vor dem Einsatz des separaten Threads hatte, wurde ja der Berechnungsschritt immer fertiggemacht, und dann erst der UI-Update verlangt. Ich verstehe nicht wieso der UI-Update sich durch die Berechnung blockiert fühlt ;-)
Ich habe wohl die Essenz der Threadgeschichte noch nicht ganz geschnallt.

Java:
while (crossExchange.optimieren()) {
            meineGrafischeDarstellung.updateWegSOE();   
}
 
kneitzel

kneitzel

Top Contributor
Das ist ganz einfach. Stell Dir vor, du bist der Zuständige Thread ...

Du hast einen Stapel mit Aufgaben, die Du erledigen sollst. Und was Du nun machst ist:
Du berechnest etwas. Wenn Du mit der Berechnung fertig bist, dann schreibst Du Dir einen Zettel mit einer neuen Aufgabe: "Fenster neu zeichnen" und legst ihn auf den Stapel - aber dann machst Du weiter wo Du aufgehört hast: Bei der Berechnung ...

Somit berechnest du und berechnest und berechnest ... schreibst auch fleissig ganz viele Zettel mit "Fenster neu zeichnen", aber da Du ja non stop am berechnen bist, kommst Du nie zum zeichnen des Fensters ...

Mit dem Thread sagst Du einem anderen: mach die Berechnungen!
Der macht jetzt die Berechnungen und legt Dir dann hin und wieder einen Zettel hin ... Und da Du nichts zu tun hast, nimmst Du den Zettel und machst, was da drauf steht. (Ja, EDT muss man sein ... das ist ein ruhiger Job - man kann in der Regel ganz viel schlafen und auf Zettel warten!)
 
C

Carcharoth

Aktives Mitglied
OK, ich glaube ich habe es verstanden.
und, ja, EDT wäre schon ein cooler Job aber vielleicht auch nicht sooo spannend ;-)
Danke für die Hilfe.
 
C

Carcharoth

Aktives Mitglied
Ich habe eine kleine Nachtragsfrage:
Ich habe herausgefunden, wie ich eine Variable (hier den Zähler i) in das invokeLater reinschmuggeln kann.
Wie könnte ich aber eine Variable wieder herausholen (hier tourID)?

Java:
for(int i=0;i<10;i++) {
    final int iKopie = i;
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            tourID[iKopie]=meineGrafischeDarstellung.updateWegSOE(iKopie);
        }
    });
}
 
C

Carcharoth

Aktives Mitglied
...oder ist das eine unsinnige Frage, weil man nicht sicher sein kann, wann der Inhalt des InvokeLaters ausgeführt werden kann?

Dann muss ich mir was anderes überlegen, denn ich brauch die ID die während dem Updaten der GrafischenDarstellung generiert wird, um sie später gezielt einzeln ansprechen zu können.
 
mihe7

mihe7

Top Contributor
In der Regel sollte die View keine Logik enthalten. Für die Geschäftslogik gibt es einen eigenen Layer, auf den der Presentation Layer zugreift, um eben für den Benutzer eine entsprechende Darstellung anzubieten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G probleme mit paintComponent Java Basics - Anfänger-Themen 14
M Probleme mit JPanel und paintComponent Java Basics - Anfänger-Themen 3
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
E JavaFX Editor Probleme mit der Zwischenablage Java Basics - Anfänger-Themen 0
C Probleme mit dem Erstellen und Importieren von Packages Java Basics - Anfänger-Themen 6
3 OOP erste Versuche, OOP zu verstehen. Probleme mit gettern und settern Java Basics - Anfänger-Themen 4
R Erste Schritte Probleme bei 2D Spielfeld, mit einzufügender "Person" Java Basics - Anfänger-Themen 5
P Probleme bei der Installation von JavaFX Java Basics - Anfänger-Themen 3
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
D Probleme mit JFrame und der Größe Java Basics - Anfänger-Themen 8
Dimax String Probleme Java Basics - Anfänger-Themen 12
N Probleme beim printen von Arrays durch for Schleife Java Basics - Anfänger-Themen 3
S Java Array Probleme Java Basics - Anfänger-Themen 3
J Probleme bei IllegalArgumentException "werfen". Java Basics - Anfänger-Themen 1
K Probleme bei der Ausgabe - komme nicht weiter :/ Java Basics - Anfänger-Themen 15
X Probleme im Umgang mit PriorityQueue Java Basics - Anfänger-Themen 75
D Probleme mit dem Windowbuilder und JComboBox Java Basics - Anfänger-Themen 2
M Regex Probleme (mal wieder) Java Basics - Anfänger-Themen 3
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
X Probleme mit Übungsaufgaben zu Zahlentypen Java Basics - Anfänger-Themen 4
G Probleme bei Aufgabe Java Basics - Anfänger-Themen 12
P Erste Schritte Probleme mit dem Programmieren Java Basics - Anfänger-Themen 12
B Probleme bei einer Aufgabe Java Basics - Anfänger-Themen 19
Franzi1001 Probleme mit Eclipse Java Basics - Anfänger-Themen 7
T Probleme bei Installation von JDK Java Basics - Anfänger-Themen 2
C Probleme mit String-Vergleich Java Basics - Anfänger-Themen 4
C Probleme bei Regex Java Basics - Anfänger-Themen 9
V Probleme mit Arrays Java Basics - Anfänger-Themen 8
D Kleine Probleme mit Split-Befehlen Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
G Probleme bei Frame aufgaben Java Basics - Anfänger-Themen 6
N Probleme mit dem ActionListener Java Basics - Anfänger-Themen 4
D Probleme beim Kompelieren mache ich etwas falsch ? Java Basics - Anfänger-Themen 3
L Probleme mit Java Java Basics - Anfänger-Themen 3
S Probleme mit abspielen einer .wav Datei Java Basics - Anfänger-Themen 2
J Probleme bei der Umwandlung einer Farbe von Hex zu RGB Java Basics - Anfänger-Themen 8
K Probleme beim Programm schreiben - Lesen von Dateiinhalten -zaehlen von Wörtern/ Buchstaben Java Basics - Anfänger-Themen 4
M Probleme beim aktualisieren eines JPanels Java Basics - Anfänger-Themen 7
J Probleme beim Array ausgeben Java Basics - Anfänger-Themen 4
M Probleme bei rekursiver Zuordnung Java Basics - Anfänger-Themen 1
I Probleme mit 2 dimensionale Arrays Java Basics - Anfänger-Themen 3
H Best Practice View probleme Java Basics - Anfänger-Themen 2
B Probleme mit Kreisberechnung Java Basics - Anfänger-Themen 15
E Probleme mit Scanner Java Basics - Anfänger-Themen 4
J Eclipse Export Probleme Java Basics - Anfänger-Themen 25
M Probleme beim verwenden von Packages Java Basics - Anfänger-Themen 6
D Probleme mit der Übergabe einer BorderPane Java Basics - Anfänger-Themen 2
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
BlueFox Tabelle in der Konsole ausgeben - Probleme Java Basics - Anfänger-Themen 1
G Methoden Probleme beim Methodenaufruf Java Basics - Anfänger-Themen 2
V Klassen ObjectInputStream ->ReadObject Probleme Java Basics - Anfänger-Themen 5
P Probleme mit der Do-Schleife Java Basics - Anfänger-Themen 2
F Erste Schritte Compiling Probleme Java Basics - Anfänger-Themen 13
S Neuling und Probleme bei Schulaufgabe Java Basics - Anfänger-Themen 5
J Anfänger: ActionListener und ProcessBuilder machen Probleme Java Basics - Anfänger-Themen 6
S Erste Schritte 2D Grafik Probleme mit KeyListener. Java Basics - Anfänger-Themen 18
M Array mit eigenem Datentyp probleme beim übergeben Java Basics - Anfänger-Themen 6
M Probleme mit Eclipse Java Basics - Anfänger-Themen 20
G Probleme beim casten von double zu int Java Basics - Anfänger-Themen 3
E 2 Probleme - Datum & private finale Variablen Java Basics - Anfänger-Themen 5
S Compiler-Fehler javac hat Probleme mit Paketen unter OSX Java Basics - Anfänger-Themen 2
J Probleme beim schreiben von Dateien Java Basics - Anfänger-Themen 5
B Variablen Probleme mit Eclipse Java Basics - Anfänger-Themen 6
H Mouse- und KeyListener Probleme? Java Basics - Anfänger-Themen 5
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
I Probleme bei Verzeichnissanalyse Java Basics - Anfänger-Themen 12
F Probleme mit privaten Klassen (abstrakten Klassen) Java Basics - Anfänger-Themen 1
H Probleme mit Klassen...oder: Eine Uhr Java Basics - Anfänger-Themen 9
G Probleme mit Konsole Java Basics - Anfänger-Themen 4
S Probleme mit GamGrid Spiel-Erstellung => Actor reagiert nicht auf Tastatur Java Basics - Anfänger-Themen 2
G Probleme mit Eclipse oder der URL Klasse Java Basics - Anfänger-Themen 5
W Verständnis Probleme bei der while-Schleife und continue Java Basics - Anfänger-Themen 21
M Probleme mit Anzeigen von String in GUI und if-Anweisung Java Basics - Anfänger-Themen 9
T Konstruktor Probleme Java Basics - Anfänger-Themen 3
W Methoden Probleme mit der Scanner Methode Java Basics - Anfänger-Themen 2
F Ja Nein Abfrage und andere Probleme Java Basics - Anfänger-Themen 5
L If Anweisung mit ArrayList Probleme Java Basics - Anfänger-Themen 6
littles_de Simbad Simulator probleme mit Sensordaten... Java Basics - Anfänger-Themen 0
M Erste Schritte Probleme beim Verknüpfen von Methoden Java Basics - Anfänger-Themen 15
A Probleme beim Methodenaufruf von Object[] ! Java Basics - Anfänger-Themen 12
A Probleme beim Methodenaufruf von char[] ! Java Basics - Anfänger-Themen 10
N JDK installieren Probleme mit dem Java Editor Java Basics - Anfänger-Themen 3
M Collections Probleme mit Hashmap Java Basics - Anfänger-Themen 4
R Erste Schritte Anfänger Probleme bei AnimationDrawable Java Basics - Anfänger-Themen 0
M Erste Schritte cannot find symbol - Probleme mit Klassen Java Basics - Anfänger-Themen 6
M Wer Wird Millionär - Joker Probleme Java Basics - Anfänger-Themen 25
J OOP Probleme mit UML-Diagramm Java Basics - Anfänger-Themen 6
B Klassen Probleme mit OOP Java Basics - Anfänger-Themen 6
P Probleme bei ActionEvent Java Basics - Anfänger-Themen 8
L Probleme mit Arrays Java Basics - Anfänger-Themen 5
O Probleme mit CSV Daten Java Basics - Anfänger-Themen 10
L Probleme bei Rückgabe eines Arrays in einer Methode Java Basics - Anfänger-Themen 47
C Erste Schritte Probleme bei Aufgaben zu Schleifen Java Basics - Anfänger-Themen 11
W GUI-Probleme Java Basics - Anfänger-Themen 3
F OOP Schleifen und Probleme mit Setter und Getter Java Basics - Anfänger-Themen 1
O Probleme mit Starten Java Basics - Anfänger-Themen 2
V Tastatur initialisieren JFrame Probleme Java Basics - Anfänger-Themen 6
J KeyListener aus anderer Klasse bereitet Probleme Java Basics - Anfänger-Themen 1
P JSON-Konfigurationsdatei verwenden: Probleme mit Pfad Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Anzeige

Neue Themen


Oben