Graphics / repaint

Hdr

Mitglied
Hallo,
ist es möglich eine Graphics-Methode so zu trennen, dass beim Bildaufbau ein statischer und bei repaint nur ein dynamischer Teil gezeichnet wird ?
Beispiel:
Java:
package Str;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

public class Manometer extends JPanel {
   
   static double pifuenfviertel = 3.926990817;
   static double pidreihalbe =    4.71238898;
   
   private int XZeiger=10;
   private int YZeiger=50;
   private int X1,X2,Y1,Y2;
   
   private double p;
   public void setP(double p) {
       this.p = p;
       XZeiger=(int)(50+40*(Math.cos(pifuenfviertel-p*pidreihalbe)));
       YZeiger=(int)(50-40*(Math.sin(pifuenfviertel-p*pidreihalbe)));
       repaint();
   }

   @Override protected void paintComponent(Graphics g){
       Graphics2D g2 = (Graphics2D) g;
       g2.setColor(Color.black);
        BasicStroke stil = new BasicStroke(3.0f);
        g2.setStroke(stil);
         g.drawOval(0,0,100,100);
       g.drawOval(46, 46, 8, 8);
        for (int i=0;i<=10;i++){
           X1=(int)(50+42*(Math.cos(pifuenfviertel-0.1*i*pidreihalbe)));
           Y1=(int)(50-42*(Math.sin(pifuenfviertel-0.1*i*pidreihalbe)));
           X2=(int)(50+38*(Math.cos(pifuenfviertel-0.1*i*pidreihalbe)));
           Y2=(int)(50-38*(Math.sin(pifuenfviertel-0.1*i*pidreihalbe)));
           g.drawLine(X1,Y1,X2,Y2);
        }
        BasicStroke stil1 = new BasicStroke(2.0f);
        g2.setStroke(stil1);
        g.drawLine(XZeiger, YZeiger, 50, 50);
     }
}
Das stellt einen Manometer dar. Bei Änderung der Druckes p müssten nur die 3 letzen Zeilen neu gezeichnet werden. Das übrige sind Rahmen und Skala, also unveränderlich.
Die Bücher schweigen sich dazu aus.
Danke
 

Thallius

Top Contributor
warum zeichnest du den statischen Kram überhaupt in dieser PaintComponent? Mach dir doch ein Zweites Panel in das du entweder ein Image als Hintergrund legst oder meinetwegen auch dort die statischen dinge in PaintComponent zeichnest und da legst du dann dein zeigerpanel drüber.

Gruß

Claus
 

Harry Kane

Top Contributor
warum zeichnest du den statischen Kram überhaupt in dieser PaintComponent?
Warum nicht? Warum sollte man sich mit zwei JPanels rumschlagen, wenn eines völlig ausreicht?
@TE: Du kannst die statischen Dinge auf ein Image zeichnen: ein neues BufferedImage in der gewünschten Größe erstellen, dann mit createGraphics einen Graphics Context, dort den "statischen Kram" draufzeichnen, und in der paintComponenet zuerst das Image zeichnen und dann den "dynamischen Kram".
 

Thallius

Top Contributor
Warum nicht? Warum sollte man sich mit zwei JPanels rumschlagen, wenn eines völlig ausreicht?
@TE: Du kannst die statischen Dinge auf ein Image zeichnen: ein neues BufferedImage in der gewünschten Größe erstellen, dann mit createGraphics einen Graphics Context, dort den "statischen Kram" draufzeichnen, und in der paintComponenet zuerst das Image zeichnen und dann den "dynamischen Kram".

Und das ist jetzt einfacher als zwei Panels zu nehmen?
 

Harry Kane

Top Contributor
Und das ist jetzt einfacher als zwei Panels zu nehmen?
Ja.
Für deinen Ansatz "ein Image in den Hintergrund zu legen" musst du genau dieselben Schritte durchführen (du kannst das Image natürlich auch in Gimp zeichnen und per ImageIO importieren). Dein Ansatz klingt nur kürzer weil du dir die Details gespart hast.
Bei deinem Ansatz mit zwei Panels kommen noch ein paar Fallstricke hinzu:
Beide Panels müssen genau gleich groß sein und denselben Ursprung haben. Wenn sie auch nur ein paar Pixel gegeneinander verschoben sind, wird man das vermutlich sehen. Dafür braucht man erstmal ein Layout, was sowas unterstützt, oder man nimmt das Null-Layout, wovon hier im Forum aus gutem Grund ständig abgeraten wird. Das könnte dan darauf hinauslaufen, dass man am Ende drei JPanels hat: eines mit einem passenden Layout, ein zweites mit dem statischen Hintergrund, und ein drittes mit dem dynamischen Vordergrund.
Ausserdem muss das vordere JPanel einen durchsichtigen Hintergrund haben.
Das ist zwar alles irgendwie lösbar, aber warum sollte man sich das antun?
 

Thallius

Top Contributor
Ja.
Für deinen Ansatz "ein Image in den Hintergrund zu legen" musst du genau dieselben Schritte durchführen (du kannst das Image natürlich auch in Gimp zeichnen und per ImageIO importieren). Dein Ansatz klingt nur kürzer weil du dir die Details gespart hast.

Genauso würde ich es machen. Denn dann kann ich (oder sogar ein Designer) das Drum herum richtig schön in PhotoShop erstellen. Ich würde sogar noch einen Schritt weiter gehen und den Zeiger auch als Image in PS erstellen und dann nur jeweils entsprechend rotiert auf das andere Image legen. Da brauche ich dann überhaupt kein paintComponent mehr.

Bei deinem Ansatz mit zwei Panels kommen noch ein paar Fallstricke hinzu:
Beide Panels müssen genau gleich groß sein und denselben Ursprung haben. Wenn sie auch nur ein paar Pixel gegeneinander verschoben sind, wird man das vermutlich sehen. Dafür braucht man erstmal ein Layout, was sowas unterstützt, oder man nimmt das Null-Layout, wovon hier im Forum aus gutem Grund ständig abgeraten wird. Das könnte dan darauf hinauslaufen, dass man am Ende drei JPanels hat: eines mit einem passenden Layout, ein zweites mit dem statischen Hintergrund, und ein drittes mit dem dynamischen Vordergrund.
Ausserdem muss das vordere JPanel einen durchsichtigen Hintergrund haben.
Das ist zwar alles irgendwie lösbar, aber warum sollte man sich das antun?

Wenn es irgendwo einen Sinn macht NULL Layout zu benutzen, dann bei so etwas. Wenn ich die Images groß genug erstelle kann ich die problemlos in das Panel skalieren und kann somit das Panel sogar resizeable machen. Ob das Sinn macht sei dahin gestellt.

Gruß

Claus
 

Harry Kane

Top Contributor
Genauso würde ich es machen. Denn dann kann ich (oder sogar ein Designer) das Drum herum richtig schön in PhotoShop erstellen. Ich würde sogar noch einen Schritt weiter gehen und den Zeiger auch als Image in PS erstellen und dann nur jeweils entsprechend rotiert auf das andere Image legen.
Angesichts der Komplexität der Zeichenoperationen, die der TE in seinem Eingangspost genannt hat, erscheint mit dieser Schritt als totaler Overkill.
Für eine "richtig schöne" Gui lässt man die JButtons und JLabels dann wohl auch von einem Designer entwerfen?
Da brauche ich dann überhaupt kein paintComponent mehr.
Höchstens zum Zeichnen der Images.
Wenn ich die Images groß genug erstelle kann ich die problemlos in das Panel skalieren und kann somit das Panel sogar resizeable machen.
Also bei der Frage, ob es sinnvoller ist, einen Hintergrund/Szenerie/wasauchimmer in Form einer Bitmap zu malen oder mit Zeichenoperationen zu zeichnen, den Punkt "Skalierung" als ein Argument FÜR Bitmap zu verwenden, ist auss meiner Sicht Blödsinn. Viel Spass mit dem tollen Hintergrund, wenn beim runterskalieren feine Strukturen im Pixelmatsch versinken.
Um die Ursprungsfrage zu beantworten:
ist es möglich eine Graphics-Methode so zu trennen, dass beim Bildaufbau ein statischer und bei repaint nur ein dynamischer Teil gezeichnet wird
Nein, das ist nicht möglich. Beim repaint wird immer neu gezeichnet, nur nicht immer alles. Bei komplexen Szenen, die aus einer Vielzahl von Befehlen aus der Graphics2D Klasse neu gezeichnet werden, dürfte das Zeichnen eines Bitmaps schneller gehen.
 

Hdr

Mitglied
Danke den Diskutanten.
Das zugrunde liegende Projekt ist die Modellierung eines Kraftwerkes. Die Berechnung der Dampfzustände ist dabei sehr aufwändig, so dass amn ungern Rechenzeit verbrät mit dem Auffrischen von Skalen in Anzeigeinstrumenten.
Inzwischen bedaure ich es sehr, mich bei dem Projekt für Java entschieden zu haben. Bei keiner vergleichbaren Programmiersprache sind die grafischen Möglichkeiten so ärmlich wie in Java. Dabei ist die Syntax bist zur Unverständlichkeit aufgeblasen und lieblos zusammengschustert.
Trotzdem noch einmal vielen Dank an alle Teilnehmer.
 

Flown

Administrator
Mitarbeiter
@Hdr ich würd jetzt mal behaupten, dass man mit den richtigen Fertigkeiten/Können schöne responsive UI basteln kann. Ich persönlich kenne jetzt kein UI Framework, dass besser/schneller/einfacher ist (auch in anderen Programmiersprachen).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Umgang mit Graphics unklar : Erstellung u Uebergabe an Funktion Java Basics - Anfänger-Themen 18
M HILFE JPanel - Graphics Java Basics - Anfänger-Themen 1
H Eingabe tätigen bevor Graphics g Fenster öffnet Java Basics - Anfänger-Themen 5
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
CptK Interface Bilder mit Graphics g zeichnen Java Basics - Anfänger-Themen 7
J Erste Schritte drawLine Methode der Graphics Klasse Java Basics - Anfänger-Themen 2
J GUI / Graphics Java Basics - Anfänger-Themen 2
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
R Cast java.awt.Graphics Java Basics - Anfänger-Themen 7
Azazel (Anfängerhilfe) awt.Graphics Schwierigkeiten Java Basics - Anfänger-Themen 6
I Methoden public void paintComponent (Graphics g) Java Basics - Anfänger-Themen 4
B Erste Schritte Anzeige von Graphics Objekten einzeln aktualisieren Java Basics - Anfänger-Themen 1
S Farbige Lebensleiste mit Graphics? Java Basics - Anfänger-Themen 10
S Ein Graphics Obejct mehrmals mit denselben Eigenschaften zeichnen lassen?!?!? Java Basics - Anfänger-Themen 4
S G Graphics Java Basics - Anfänger-Themen 1
thet1983 g.Graphics löschen? Java Basics - Anfänger-Themen 1
M Probleme mit paint() aus java.awt.Graphics Java Basics - Anfänger-Themen 2
A EAN13 Font auf graphics g erzeugt Monospaces Java Basics - Anfänger-Themen 14
N Graphics to png Java Basics - Anfänger-Themen 10
N Methode draw(Graphics g) aufrufen Java Basics - Anfänger-Themen 6
Dogge Problem mit paint(Graphics g) im Applet Java Basics - Anfänger-Themen 13
J Problem mit paint(Graphics g) Java Basics - Anfänger-Themen 4
J Jtable änderung soll graphics aktualisieren Java Basics - Anfänger-Themen 4
J JAVA Graphics Java Basics - Anfänger-Themen 5
A Graphics Objekt verhält sich merkwürdig Java Basics - Anfänger-Themen 2
G DRUCKEN von z.B. eines JFrame über print(Graphics g) Java Basics - Anfänger-Themen 9
Maxim6394 Probleme mit Graphics Java Basics - Anfänger-Themen 7
W von Graphics in BufferedImage Java Basics - Anfänger-Themen 10
M OOP Graphics immer selbstbezihend Java Basics - Anfänger-Themen 12
K Problem mit Parameter von paint(Graphics g) Java Basics - Anfänger-Themen 3
T Transparente Bilder mit Graphics zeichnen Java Basics - Anfänger-Themen 17
H Probleme mit Graphics G Java Basics - Anfänger-Themen 2
M Schiebepuzzle: MouseListener und Graphics? Java Basics - Anfänger-Themen 6
J Graphics g Java Basics - Anfänger-Themen 4
H Probleme mit Graphics Java Basics - Anfänger-Themen 5
B MouseListener & Graphics Java Basics - Anfänger-Themen 10
M Graphics zeichnen Java Basics - Anfänger-Themen 2
F Graphics PDFBox Java Basics - Anfänger-Themen 9
M kurze Frage zu Graphics Java Basics - Anfänger-Themen 5
Luk10 Buch für Swing/Awt/Graphics Java Basics - Anfänger-Themen 4
M Java Graphics etc. Java Basics - Anfänger-Themen 2
M Concurrency und Graphics Java Basics - Anfänger-Themen 9
F Was ist Graphics g wirklich? Java Basics - Anfänger-Themen 5
J Klasse Graphics Nullpointerexception Java Basics - Anfänger-Themen 8
P Frage zu Graphics Java Basics - Anfänger-Themen 2
O graphics methode zeigt mein bild nicht an Java Basics - Anfänger-Themen 7
F Zweite Graphics-Methode wird nicht ausgeführt Java Basics - Anfänger-Themen 4
T rotes herz public void paint(Graphics g) Java Basics - Anfänger-Themen 2
G paintComponent(Graphics g) Java Basics - Anfänger-Themen 2
eQui Oberfläche mit Graphics zeichnen Java Basics - Anfänger-Themen 11
S Dicke bei Graphics Ovject einstellen Java Basics - Anfänger-Themen 2
V KSKB zum Verständnis von Graphics und paintComponent Java Basics - Anfänger-Themen 6
G mit Graphics erzeugte Strings verschwinden sofort wieder Java Basics - Anfänger-Themen 7
T Graphics von java.awt.Frame soll sich inhalt merken Java Basics - Anfänger-Themen 3
G Graphics-Object skalieren Java Basics - Anfänger-Themen 9
G Constructor & Graphics g Java Basics - Anfänger-Themen 5
F Frage zum Graphics Objekt Java Basics - Anfänger-Themen 3
D Instanz von Graphics in run() Java Basics - Anfänger-Themen 8
B Mouseevents und Graphics Java Basics - Anfänger-Themen 11
D Abstrakte Klasse Graphics Java Basics - Anfänger-Themen 3
W Verständisfrage zu Graphics Objekt Java Basics - Anfänger-Themen 3
P umwandeln von graphics nach image Java Basics - Anfänger-Themen 4
A Graphics g, AdjustmentEvent e Java Basics - Anfänger-Themen 5
Dilandau paint(Graphics g) { unbekannt in try{} / catch{} }? Java Basics - Anfänger-Themen 5
S Graphics Java Basics - Anfänger-Themen 11
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
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
M repaint() in run-Methode funktioniert nicht Java Basics - Anfänger-Themen 9
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

Ähnliche Java Themen

Neue Themen


Oben