Methode die (Graphics g) benötigt von Thread ausführen lass

Status
Nicht offen für weitere Antworten.

Joetempes

Mitglied
Folgendes Problem hab ich, wo ich nicht weiter komm:

Ich hab ein Programm wo auf einem JPanel etwas gezeichnet wird.
Das funktioniert auch (public void paintComponent(Graphics g){...}.

Teile davon hab ich in extra Methoden ausgelagert, welche dann immer das Graphics g übergeben bekommen.
Das funktioniert auch (public void drawLeitung(Graphics g){...}

Nun will ich aber das eine dieser ausgelagerten Methoden (die ein Graphics g als Parameter benötigen)von einem extra Thread ausgeführt werden, weil diese in einer Endloschleife laufen soll bis zum Abbruch...

Also initialisiere ich den Thread, starte ihn, der Thread ruft seine run()-Methode auf, und da beginnt mein Problem:

Ich hab ja in der run()-Methode kein Zugriff auf mein Graphic g aus der painComponent()-Methode um zum Beispiel die Methode: public void drawLeitung(Graphics g){...} aufzurufen, da ich die run()-Methode ja nicht überschreiben kann mit einem Parameter.

???
Hab ich ein Denkfehler ?
Kann man das Graphics g global initialisieren ?
Ist das überhaupt lösbar, jemand ne Idee ?


Vorab vielen Dank!

Joetempes
 

Wildcard

Top Contributor
Du hast die paintComponent in mehrere Methoden aufgeteilt (was ich übrigens nicht machen würde)
und willst jetzt das ein Teil davon in einem anderern Thread ausgeführt wird???????
Vergiss es!
Ich glaub du machst einen großen Denkfehler!
Erklär lieber mal wie das Endergebniss aussehen soll(das hab ich nämlich nicht ganz verstanden), dann finden
wir eine vernünftige Lösung :wink:
 

Joetempes

Mitglied
Ja ich habe wie gesagt Teile ausgelagert, in extra Methoden, diese werden dann aus paintComponent() herraus aufgerufen. Ganz normal denk ich. So brauch ich zeug davon nicht doppelt schreiben, wenn ich die gleiche Sache zeichnen lassen will, aber nur die Farbe anders sein soll. Dann übergeb ich der Methode einfach noch die entsprechende Farbe mit... Aber das ist nicht das Problem.
Und ein Teil würde ich gern extra von einem Thread ausführen lassen.
Das Ergebniss soll sein, das ein Teil permanent in einer endlosschleife ge- repaint()tet wird und der Rest
ganz normal läuft.

CodeSchnipsel:

Code:
 public void paintComponent(Graphics g){
		
		super.paintComponent(g);
		
		drawLeitungsRamenWeiss(g); //ausgelagert 

		if(strom == false){
		
		    drawLeiterInsAquarium(g,Color.RED); // ausgelagert
		    
		    stromThread = new Thread(this);
		    stromThread.start();    // ruft run() auf

		 }
} //paintC. zu

public void run(){

	    drawStromSchlag(g); // funktioniert so nicht
	}

Und das funktioniert so natürlich nicht, weil run() nicht auf 'g' zu greifen kann.

Hoffe mein Problem wird jetzt etwas deutlicher.

Meinst Du echt das geht gar nicht ???
 

Wildcard

Top Contributor
Joetempes hat gesagt.:
@Roar

Weil mit repaint() wieder die ganze paintComponent()-Methode ausgeführt wird !
Und was passt dir daran nicht?
Ich bin gegen das auslagern aus paint-Methoden weil sie sehr oft aufgerufen werden, und deshalb so
minimalistisch wie irgend möglich sein sollten.
Ausserdem einen anderen Thread nicht IN der paintComponent aufrufen :roll:
stromThread = new Thread(this);
stromThread.start(); // ruft run() auf
Ist etwa die Klasse in der du zeichnest selbst das Runnable???
 

Kian

Aktives Mitglied
Code:
public void run(){

       drawStromSchlag(g);

   }

Von wo kommt das 'g' her, hast du eine Graphics-Var(g) extern deklariert?
 

Joetempes

Mitglied
@WildCard
1. Also den Thread muss ich nicht in der paintComponent()-Methode erstellen, das würde auch woanders gehen.
2. Ja.Die Klasse die ich zeichne implementerit das Runnable-Interface!
3. Ich will nicht repaint machen, weill ich nur einen ganz bestimmten Abschnitt repainten will.

Also ich meine, es kann jeder alles finden was er möchte und jeder hat seine Vorlieben aus Erfahrung und anderen Gründen herraus.
Aber das ist nicht meine Frage !

Es funtieniert ja alles, bis an die Stelle wo ich mein Problem beschreibe, Ihr habt ja mein Problem verstanden denk ich, meine Frage ist ob es möglich ist es zu lösen oder zu umgehen ???
 

Joetempes

Mitglied
@KIAN

Genau das ist ja das Problem !!!
Das geht so nicht, weil ich das 'g' ja von nirgens her bekomme, da ich ja run() nicht überschreiben darf um es als Parameter mit zu geben !

Kann man eine Graphics g - Variable global definieren ?
Oder:
Hat man AWT vieleicht extra so konstruiert, das man das nicht machen darf was ich will ???
 

Wildcard

Top Contributor
Wenn du nur einen ganz bestimmten Abschnitt zeichnen willst, dann benutz dafür JComponents...
Erstell eine Klasse die Runnable implementiert, der gibst du eine Referenz auf die Component mit.
In der run methode dieser Klasse rufst du dann auf der Component repaint auf...
 
R

Roar

Gast
Joetempes hat gesagt.:
@Roar

Weil mit repaint() wieder die ganze paintComponent()-Methode ausgeführt wird !
jo ich dacht das soll so, wenn nicht setz doch einfach flags in der klasse oder so...
 

Wildcard

Top Contributor
Code:
class Foobar extends Thread
{
    private MyFooBarComponent component;

    public Foobar(MyFooBarComponent component)
    {
        this.component=component;
    }
    run() 
    {
        while(true)
        {
            component.repaint();
        }
    }

}
 

Kian

Aktives Mitglied
Joetempes hat gesagt.:
@KIAN

Genau das ist ja das Problem !!!
Das geht so nicht, weil ich das 'g' ja von nirgens her bekomme, da ich ja run() nicht überschreiben darf um es als Parameter mit zu geben !

Kann man eine Graphics g - Variable global definieren ?
Oder:
Hat man AWT vieleicht extra so konstruiert, das man das nicht machen darf was ich will ???

Bin mir nicht sicher ob das klappt, theorethisch eigentlich schon:

Code:
Graphics d = null;

public void paintComponent(Graphics g){
      
      super.paintComponent(g);
      
      drawLeitungsRamenWeiss(g); //ausgelagert

      if(strom == false){
      
          drawLeiterInsAquarium(g,Color.RED); // ausgelagert

          d = g;
         
          stromThread = new Thread(this);
          stromThread.start();    // ruft run() auf

       }
} //paintC. zu

public void run(){

       drawStromSchlag(d); // funktioniert so vielleicht
   }

Damit das klappt muss paintCom...(...) die run() starten, was vermutlich bei dir der fFall ist.
 
G

Guest

Gast
entweder habe ich etwas nicht verstanden, oder du übergibst das Graphics g eifach dem Konstruktor vom Thread...
Code:
 stromThread = new Thread(this,g); //<- dann hast du's im Thread zur verfügung...
 
B

Beni

Gast
@gast Du hast was nicht verstanden :wink:

1. Kannst du dem Konstruktor von Thread nicht einfach was zusätzliches übergeben, da musst du sonstwo eine Variable machen.

2. Ist das Speichern von "Graphics" keine gute Idee: nach einer gewissen Zeit (nur ein paar Sekunden oder Millisekunden) verliert ein Graphics seine Eigenschaft, den Bildschirm zu beeinflussen.

Das beste ist und bleibt in einer Methode, welche von "paint( Graphics g)" aufgerufen wird, zu zeichnen.
Du kannst mit repaint( x, y, w, h) dafür sorgen, dass nur ein Teil der Oberfläche wirklich neu gezeichnet wird.
 
G

Guest

Gast
Also an ALLE erstmal ein fettes Dankeschön für Eure Hilfe !

Ich hab jetzt folgendes gemacht:
Hab eigene Klasse geschrieben die von Thread erbt, und da den Konstruktor so gebaut das sie das Graphics g über- geben bekommt:
Code:
import java.awt.Graphics;

public class MyStromThread extends Thread {

    private Graphics g;
    private ActionPanel al;
    
    public MyStromThread(Graphics g,ActionPanel al) {
        
        this.g  = g;
        this.al = al;
    }
    
    public void run(){
        al.drawStromSchlag(g);
    }
}
Und in meiner ActionPanel-Klasse, wo die paintComponent- Methode() drin steckt wird dieser Thread instanziert:
Code:
public void paintComponent(Graphics g){
     
      super.paintComponent(g);
     
      drawLeitungsRamenWeiss(g); //ausgelagert

      if(strom == false){
     
          drawLeiterInsAquarium(g,Color.RED); // ausgelagert

          d = g;
         
          stromThread = new Thread(this);
          stromThread.start();    // ruft run() auf (extra Thread)

       }
} //paintC. zu

Die Methode drawStromSchlag(g) sieht so aus:
Code:
public void drawStromSchlag(Graphics g){
	        
	    while(strom == true){
	        
	        System.out.println("Test");

		    g.setColor(Color.BLACK);
		    g.drawLine(255,155,280,120);
		    g.drawLine(280,120,283,180);
		    g.drawLine(283,180,286,130);
                     repaint();
                    g.setColor(Color.RED);
		    g.drawLine(255,155,280,120);
		    g.drawLine(280,120,283,180);
		    g.drawLine(283,180,286,130);
                     repaint()
		  
           }
}

Ihr werdets nicht glauben, technisch siehts wunderbar aus, der "Test" -Ausdruck auf der Konsole funtioniert auch
bestens --> EXTRA THREAD ! Aber er macht kein repaint() und zeichnet diese Linien damit nicht.
Langsam glaub ich Wildcard hat von Anfang an Recht gehabt, das funtioniert einfach nicht!

[/quote]
 

Joetempes

Mitglied
Sorry, das hat kein GAST geschrieben sondern ich --> Joetempes!
Man muss sich ja einloggen, hab nicht beachtet, das man als Gast Beiträge schreiben kann.

Und der Thread wird natürlich so aufgerufen:

Code:
stromThread = new MyStromThread(g,this);
stromThread.start();
 

Wildcard

Top Contributor
Joetempes hat gesagt.:
Langsam glaub ich Wildcard hat von Anfang an Recht gehabt, das funtioniert einfach nicht!
Es funktioniert schon, du machst es nur nicht richtig. Grundsätzlich nicht aus nebenläufigen Threads zeichnen sondern
nur repaint verwenden. Punkt.
 

Bleiglanz

Gesperrter Benutzer
AWT und SWING sind singlethreaded, du darft auf die Komponenten NUR vom Event-Despatching-Thread zugreifen...

lies mal nach, Threads und Swing sind eine etwas komplizierte Materie (ggf. mal invokeAndWait und invokeLater anschauen)
 

Joetempes

Mitglied
Die paintComponent()- Methode von mehreren Threads ausführen zu lassen, da heißt das mindestens 2 Thread auf ein Graphics g - Object zugreifen, und diese nebenläufig von einander etwas repainten funktioniert nicht.

Ich gebs auf.

Bis zum nächsten mal... :meld: :autsch: :applaus: :lol:
 

Wildcard

Top Contributor
Joetempes hat gesagt.:
Die paintComponent()- Methode von mehreren Threads ausführen zu lassen, da heißt das mindestens 2 Thread auf ein Graphics g - Object zugreifen, und diese nebenläufig von einander etwas repainten funktioniert nicht.

Ich gebs auf.
Wie oft denn noch? REPAINT benutzen :roll:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
F Methode drawOval(int,int,int,int) von graphics AWT, Swing, JavaFX & SWT 4
D Methode Graphics g klassenübergreifend nutzen. AWT, Swing, JavaFX & SWT 3
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
M passende Reflexion-Methode?? AWT, Swing, JavaFX & SWT 1
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
M Swing Methode datenLesen() greift auf catchBlock zu? AWT, Swing, JavaFX & SWT 25
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
Z Methode bei Boolean change neu Ausführen AWT, Swing, JavaFX & SWT 9
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
L JFrame Gui in anderer Methode aufrufen AWT, Swing, JavaFX & SWT 0
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
A Methode pausieren bis anderes Ereignis ausgeführt AWT, Swing, JavaFX & SWT 2
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Brauche Erklärung von Methode AWT, Swing, JavaFX & SWT 1
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
I Methode Draw3DRect und DrawRect AWT, Swing, JavaFX & SWT 2
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
K Methode repaint() AWT, Swing, JavaFX & SWT 1
A Methode in bestimmten Intervall ausführen AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
Q AWT Methodenaufruf aus actionPerformed-Methode AWT, Swing, JavaFX & SWT 4
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
T Swing Methode in Listener aufrufen AWT, Swing, JavaFX & SWT 3
P keyTyped-Methode AWT, Swing, JavaFX & SWT 1
D JavaFX Java Methoden mit JavaFX Methode kommunizieren lassen? AWT, Swing, JavaFX & SWT 3
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
F JavaFX Mit einer Methode auf Stage zugreifen. AWT, Swing, JavaFX & SWT 8
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
C JavaFX Auf Nodes einer FXML-Datei in start Methode zugreifen AWT, Swing, JavaFX & SWT 5
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
K Swing Durch Methode erzeugte Buttons ansteuern AWT, Swing, JavaFX & SWT 5
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
S PaintIn - Methode AWT, Swing, JavaFX & SWT 1
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
D JavaFX Interface Initializable - Was machen die Parameter in der Methode inizializeable() ? AWT, Swing, JavaFX & SWT 4
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
T Swing Label aus anderer Methode bearbeiten AWT, Swing, JavaFX & SWT 2
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
C Methode über Buttonklick starten AWT, Swing, JavaFX & SWT 8
S Swing Mit einem Link eine Methode aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Auf Methode zugreifen (am Schlauch steh) AWT, Swing, JavaFX & SWT 5
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
D Swing DefaultTableModel setValueAt Methode AWT, Swing, JavaFX & SWT 7
J valueChanged()-Methode liefert unbrauchbare Daten AWT, Swing, JavaFX & SWT 4
T Swing JPanel - "Open" Methode? AWT, Swing, JavaFX & SWT 6
P Swing actionPerformed()-Methode funktioniert nicht AWT, Swing, JavaFX & SWT 3
M Applet Bricht Methode zwischendruch ab AWT, Swing, JavaFX & SWT 11
K Per Textfield Methode ausführen AWT, Swing, JavaFX & SWT 6
J Swing JTable - nach Sortieren andere Methode aufrufen AWT, Swing, JavaFX & SWT 2
C Swing Was macht die Methode "setDataProviderCreditShown(boolean b)" AWT, Swing, JavaFX & SWT 4
R Swing Mit Swing eine throws Exception Methode öffnen AWT, Swing, JavaFX & SWT 3
GianaSisters Swing jTable's valueChanged Methode überschreiben AWT, Swing, JavaFX & SWT 2
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
N Methode zum Prüfen ob Jtextfield verändert worden ist AWT, Swing, JavaFX & SWT 2
K beim Schließen des JFrames, Methode aufrufen AWT, Swing, JavaFX & SWT 3
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
E Umgang mit der Update Methode AWT, Swing, JavaFX & SWT 38
D Applet Methode in Timer einbinden AWT, Swing, JavaFX & SWT 6
Screen Fehler bei Get-Methode für ArrayList AWT, Swing, JavaFX & SWT 8
P Swing JPanel über Methode setzen AWT, Swing, JavaFX & SWT 2
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
eskimo328 Java6 Methode in Java5 verwenden (memory leak JInternalFrame) AWT, Swing, JavaFX & SWT 4
T Swing setText()-Methode Funktioniert nicht AWT, Swing, JavaFX & SWT 7
L JLabel Methode setText funktioniert nicht AWT, Swing, JavaFX & SWT 5
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
S Visual Editor mit main Methode AWT, Swing, JavaFX & SWT 3
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
F Swing JFrame Methode beim Schließen aufrufen AWT, Swing, JavaFX & SWT 5
D Zwei String Attribute über eine Methode als Zeilen in einer Tabelle darstellen AWT, Swing, JavaFX & SWT 9
H applet Methode aus abstrakter Klasse aufrufen AWT, Swing, JavaFX & SWT 12
S Methode fireTableDataChanged() AWT, Swing, JavaFX & SWT 2
Y Swing Problem mit Main Methode AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen


Oben