"Graphics" wird nicht angezeigt

powerpaar

Mitglied
Hallo,

Ich habe mal wieder ein Problem mit meinen Graphics-Komponenten:

Java:
public void zeichne(int x1, int y1, int xS, int yS, int x2, int y2, int xZ, int yZ){
   
   g=frame.getGraphics();
   
   frame.paint(g);
   g.drawString("", 0, 0); // wenn ich dieses hier nicht mache, wird drawOval und draw3DRect nicht angezeigt
   g.drawOval(x1, y1, xS, yS);
   g.draw3DRect(x2, y2, xZ, yZ, true);

  }


Schön und gut, wenn ich jetzt die Methode mit Daten füttere, so wird für gewöhnlich ein Oval und ein Quadrat gezeichnet (und die "alten beiden" sind verschwunden).

Aber: Wenn ich den Rahmen neu befüllen lasse (also z.B. ein paar Panels neu einfüge oder die Hintergrundfarbe ändere) und dann die Methode neu mit den alten Daten aufrufe passiert erst mal.... gar nichts. Erst wenn ich die Daten verändere und die Methode dann aufrufe wird wieder gezeichnet.

Kann mir das jemand erklären und eventuell Abhilfe schaffen?
 
Zuletzt bearbeitet:

powerpaar

Mitglied
Ok, danke, dem habe ich nun entnommen, dass getGraphics() ganz doll böse ist und ich es nicht verwenden darf etc. .

Der aufmerksame API Leser wird über eine getGraphics() Methode in jeder von JComponent abgeleiteten Klasse stolpern die uns ein Graphics Objekt liefert.
Zu beachten ist allerdings das diese Methode durch die Lightweight Architektur nur dann ein Objekt zurückliefern kann wenn die Komponente bereits in einem Heavyweight Container liegt der eine solche Resource erhalten hat.
Wenn wir uns die Klasse Graphics ansehen entdecken wir einige hilfreiche Methoden drawRect, drawOval, ... entdecken.
Für dieses Beispiel wurde allerdings mit den Shapes ein stärker Objekt orientierter Ansatz gewählt, daher nützen uns diese Methoden nicht viel.
Der Trick ist, das getGraphics in Swing Anwendungen eigentlich ein Graphics2D Objekt liefert (das deutlich mehr Möglichkeiten als ein einfaches Graphics Objekt bietet) welches Graphics erweitert.

Ich bin allerdings gezwungen, im JFrame frei zu zeichnen. Deswegen brauche ich dessen Graphics, die ich im Prinzip dann mit
Java:
Graphics2D g = (Graphics2D) frame.getGraphics();
hole. Außerdem habe ich nicht ganz verstanden, wie mir das überschreiben der Methode "paintComponent()" wirklich weiterhelfen soll.


PS: Es tut mir leid, wenn ich Fragen stelle, die darauf zurückführen, dass ich die Links nicht tiefgreifend durchleuchtet habe, ich stehe leider unter enormen Zeitdruck, Abgabe war eigentlich vor 3 Stunden und jede Minute zählt.
 
S

SlaterB

Gast
Zeitdruck ist hier irrelevant und mit getGraphics() solltest du nichts abgeben, das gibt eher Minuspunkte als gar keine Punkte


Zeichnen in Swing kann man in wenigen Stunden kaum lernen, jede hektische Stunde vor konzentrierten richtigen Lernen ist aber noch mehr verschenkt,

egal was du an den Links nicht verstehst, letztlich ist zumindest im ersten bald ein erster Beispiel-Code,
was dort gemalt wird ist ja egal, kannst du alles entfernen,
entscheidend ist, dass die Mal-Befehle in paintComponent() stehen müssen, den Rest (JPanel in JFrame einfügen) kannst du ja mehr oder weniger übernehmen,
soweit eigentlich ein machbarer Schritt, wenn du den Rest mit g.drawString() schon hast oder schnell hinbekommst, dann ja doch in absehbarer Zeit möglich

> und dann die Methode neu mit den alten Daten aufrufe passiert erst mal.... gar nichts.

was meinst du eigentlich, ist der Bildschirm leer oder ist das alte noch zu sehen?
wenn du zweimal dasselbe malst und das vom ersten Malen nicht zu unterscheiden ist, wäre es eigentlich keine Überraschung,
was soll sonst passieren als wieder dasselbe Ergebnis?
 

powerpaar

Mitglied
"Es passiert nichts" bedeutet in dem Zusammenhang, dass zwar der JFrame neu gezeichnet wurde und auch soweit aktualisiert wurde, aber das Oval und das Viereck eben (trotz dass die Methode "zeichne" danach neu aufgerufen wurde) nicht auf dem Frame zu sehen sind.

Der Beispielcode ist nicht ganz so einfach auf meinen zu übertragen, denn er bezieht sich ja auf die Superklasse von JFrame und JPanel, die wiederum im Beispielcode erweitert werden, ich aber erzeuge einfach neue Objekte von diesen Typen und bearbeite sie mit ihren Methoden.
Ich müsste also die gesamte Klasse, in der die Graphics bearbeitet werden, und noch dazu alle, die irgendwie darauf zugriff nehmen, neu schreiben, und dass ist leider nicht gerade wenig.

Der "Zeitdruck" ist leider doch entscheidender als die Sauberkeit. Korrekturen können noch Nachgereicht werden, nur sollte das Programm in allen wesentlichen Zügen funktionieren.
Das "nicht-Erscheinen" der Graphics-Komponenten ist ein mittlerer Patzer denke ich und sollte behoben werden. Das ist bisher nur eine der Fragen, die ich noch zu klären habe.

Wer jetzt sagt "dann setz dich halt früher dran": sei nicht herzlos, ich habe schwere "Hardwareprobleme", rechtzeitig angefangen habe ich, kann aber nicht auf einen eigenen Computer zurückgreifen, weswegen der Zeitrahmen, in dem ich täglich arbeiten kann, recht begrenzt ist.
 
S

SlaterB

Gast
oh oh, Komponenten auch noch dabei, Vermischung, weitere böse Regel,
wobei kaum zu vermeiden wenn du direkt auf den JFrame eigene Zeichenbefehle hast

zu deinem Problem fällt mir nichts ein, vielleicht mit geposteten Code,
hier ein Testprogramm mit deiner Methode und einer Schleife die jede Sekunde ein JLabel einfügt und mal das gleiche,
mal was anderes zeichnet,
geht alles wunderbar, schwer vorzustellen dass Swing nach den int-Parametern unterscheiden sollte

Java:
public class TestGUI {
    JFrame frame;

    public TestGUI()    throws Exception  {
        frame = new JFrame();
        frame.setLayout(new FlowLayout());

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 300);
        frame.setVisible(true);

        zeichne(100, 250, 30, 30, 200, 250, 40, 40);

        for (int i = 0; i < 12; i++)   {
            Thread.sleep(1000);
            frame.add(new JLabel("hi"));
            frame.validate();

            if (i % 3 == 0)     {
                zeichne(150, 250, 30, 30, 250, 250, 40, 40);
            }  else   {
                zeichne(100, 250, 30, 30, 200, 250, 40, 40);
            }
        }
    }

    public void zeichne(int x1, int y1, int xS, int yS, int x2, int y2, int xZ, int yZ)  {
        Graphics g = frame.getGraphics();

        frame.paint(g);
        // g.drawString("", 0, 0);
        g.drawOval(x1, y1, xS, yS);
        g.draw3DRect(x2, y2, xZ, yZ, true);
    }

    public static void main(String[] args)    throws Exception  {
        TestGUI t = new TestGUI();
    }

}


falls die saubere Variante:
JFrame kannst du ja bei dir so lassen wie du willst,
JPanel muss zwingend überschrieben werden, kann als anonyme Klasse geschehen, das einzige was man an diesem JPanel aufrufen müsste wäre repaint() für neues Zeichnen, alle Informationen wie x und y könnten irgendwo in Attributen abgelegt werden, worauf die innere Klasse zugreifen kann,
aber das klingt jetzt sicher kompliziert, kann ich verstehen
 

powerpaar

Mitglied
Es hat leider alles nichts geholfen, nur noch mehr "kaputt" gemacht, weil ich halt Zeit dadurch verloren habe. Schade, aber vielen Dank für die Hilfe. Ich werde anderweitig fragen, woran das liegen könnte.

Schade, schade, schade.....


Jetzt kommen noch ein paar Details am Programm, dann muss ich es so abgeben.

Ich lasse das Thema weiterhin offen, weil ich mich noch damit auseinander setzen will und ein wenig darauf hoffe, dass andere vielleicht ähnliche Probleme mit eventuell ähnlichen Lösungen haben.

;)
 

Michael...

Top Contributor
Ich werde anderweitig fragen, woran das liegen könnte.
Woran es liegt wurde ja bereits erläutert:
Die Vorgehensweise sich das Graphics Objekt einer Komponente über getGraphics() zu holen ist schlichtweg falsch. Zum einen weil man nicht davon ausgehen kann das richtige bzw. überhaupt eines zu bekommen und zum anderen weil man damit keine Kontrolle darüber hat, ob das damit Gezeichnete überhaupt angezeigt wird und wie lange. Spätestens wenn die Komponente das nächste Mal neu gezeichnet wird ist es wieder weg - und das geht manchmal schnell als man denkt bzw. schauen kann.
 
G

Gast2

Gast
Ich werde anderweitig fragen, woran das liegen könnte.
Warum liest du dir denn nicht die 2 3 Links durch die dir gepostet wurden. Da steht das alles sehr gut erklärt. Man muss sich halt nur mal in Ruhe da ransetzen und das durcharbeiten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
M Warum wird Graphics-Object zerstört? AWT, Swing, JavaFX & SWT 8
N Graphics Objekte scalen mit Veränderung des Bildschirms AWT, Swing, JavaFX & SWT 19
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
R AWT Graphics initialisieren AWT, Swing, JavaFX & SWT 15
P JPanle, JFrame und Graphics AWT, Swing, JavaFX & SWT 2
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
B Graphics to Image AWT, Swing, JavaFX & SWT 3
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Graphics -> Graphics2D etwas zu beachten? AWT, Swing, JavaFX & SWT 8
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
V Netbeans: TabbedPane, ScrollPane und Graphics AWT, Swing, JavaFX & SWT 4
V Graphics g - drawOval problem mit background AWT, Swing, JavaFX & SWT 1
M Graphics.fillOval AWT, Swing, JavaFX & SWT 1
javampir Sauberes Faden mit awt Graphics AWT, Swing, JavaFX & SWT 6
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
C Zwei Ebenen in Graphics ? AWT, Swing, JavaFX & SWT 0
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
I JavaFX Graphics Performance AWT, Swing, JavaFX & SWT 2
vodkaz Graphics aufrufen AWT, Swing, JavaFX & SWT 4
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
M Graphics.drawImage von unten nach oben abbilden lassen AWT, Swing, JavaFX & SWT 6
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
M JFrame Graphics.drawString Problem AWT, Swing, JavaFX & SWT 11
I Rechteck eines Graphics eines JPanels in einem anderen JPanel anzeigen AWT, Swing, JavaFX & SWT 7
antonbracke Multiplayer Shooter- Wie geht das mit Canvas & Graphics AWT, Swing, JavaFX & SWT 6
R Ankerpunkt bei Graphics AWT, Swing, JavaFX & SWT 3
R Fließende Bewegung von Graphics AWT, Swing, JavaFX & SWT 6
T AWT Graphics G Kein Text erscheint warum? AWT, Swing, JavaFX & SWT 12
L Graphics.drawImage() - Output-Größe entspricht nicht Parametern AWT, Swing, JavaFX & SWT 10
L Border verschwindet durch Graphics.drawImage() AWT, Swing, JavaFX & SWT 4
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
L Graphics Objekt - aus anderer Klasse aufrufen / übergeben AWT, Swing, JavaFX & SWT 5
B Swing Zeilenumbruch in Graphics AWT, Swing, JavaFX & SWT 20
T Graphics zeichnet nicht AWT, Swing, JavaFX & SWT 2
T Applet graphics - zeichnen funktioniert nicht AWT, Swing, JavaFX & SWT 14
R Graphics-Object speichern AWT, Swing, JavaFX & SWT 4
S Zeichnen mit java.awt.Graphics AWT, Swing, JavaFX & SWT 6
D Graphics zeichnen AWT, Swing, JavaFX & SWT 6
M Graphics auf JFrame Koordinatensystem AWT, Swing, JavaFX & SWT 3
T Graphics Ersetzend Zeichnen AWT, Swing, JavaFX & SWT 6
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
D Erzeugen eines leeren Graphics-Objektes AWT, Swing, JavaFX & SWT 7
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
A AWT AWT Panelfenster mit Graphics kombinieren AWT, Swing, JavaFX & SWT 7
T Graphics Parameterübergabe AWT, Swing, JavaFX & SWT 3
K Graphics.drawImage() sehr schnell AWT, Swing, JavaFX & SWT 5
M Graphics-Objekt aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
M Graphics.drawImage verlangsamt sich plötzlich AWT, Swing, JavaFX & SWT 15
S Swing AWT (graphics (g)) AWT, Swing, JavaFX & SWT 27
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
B Swing Tooltips auf Graphics AWT, Swing, JavaFX & SWT 8
S Applet mit Graphics dynamisch vergrößern AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
T Swing Component in Graphics zeichnen AWT, Swing, JavaFX & SWT 4
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
E Problem bzw. Sinn von Graphics / Graphics Context AWT, Swing, JavaFX & SWT 21
S Weder ActionListener noch Graphics wollen so recht AWT, Swing, JavaFX & SWT 3
F Methode drawOval(int,int,int,int) von graphics AWT, Swing, JavaFX & SWT 4
G Graphics Objekte in AWT Container einfügen AWT, Swing, JavaFX & SWT 2
S Mit Graphics g ins Fenster zeichnen AWT, Swing, JavaFX & SWT 4
G Graphics - Raute AWT, Swing, JavaFX & SWT 3
G "pinseldicke" bei Graphics? AWT, Swing, JavaFX & SWT 2
G Graphics.drawImage() AWT, Swing, JavaFX & SWT 6
D Methode Graphics g klassenübergreifend nutzen. AWT, Swing, JavaFX & SWT 3
W java.lang.NoClassDefFoundError: org/eclipse/swt/graphics/Dev AWT, Swing, JavaFX & SWT 1
B Graphics und Canvas - Problem AWT, Swing, JavaFX & SWT 2
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
T Transparenz bei Graphics AWT, Swing, JavaFX & SWT 9
L Graphics AWT, Swing, JavaFX & SWT 37
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
Y Problem mit der Referenz eines Graphics-Objekts AWT, Swing, JavaFX & SWT 5
O Graphics erstellt Componente scheinbar nicht richtig AWT, Swing, JavaFX & SWT 23
G 2x Graphics in einer paint() miteinander verbinden AWT, Swing, JavaFX & SWT 11
K Gutes Buch gesucht (Graphics Only) Kennt jemand eins? AWT, Swing, JavaFX & SWT 5
K Graphics-Objekt zeichnet nicht alle Bilder AWT, Swing, JavaFX & SWT 3
J Einmal gleichzeitig auf zwei Graphics malen? AWT, Swing, JavaFX & SWT 5
E Image, Graphics, verzögert zeichnen AWT, Swing, JavaFX & SWT 2
N Graphics Objekt "puffern" AWT, Swing, JavaFX & SWT 7
H neuzeichnen von graphics nach minimierung oder ähnlichem AWT, Swing, JavaFX & SWT 10
G SWT Graphics Zeichnung neu laden AWT, Swing, JavaFX & SWT 13
G SWT Graphics GC Problem AWT, Swing, JavaFX & SWT 6
M Abstrakte Graphics Klasse erzeugen AWT, Swing, JavaFX & SWT 2
H awt Graphics und Image selbermachen ? AWT, Swing, JavaFX & SWT 12
D Image aus Graphics erstellen? AWT, Swing, JavaFX & SWT 2
R Graphics Objekt ändern AWT, Swing, JavaFX & SWT 11
raptorrs J2D graphics, sind 500px immer 500 px AWT, Swing, JavaFX & SWT 2
G Graphics AWT, Swing, JavaFX & SWT 2
H Graphics: Schriftgröße ändern AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben