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
 
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
 
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".
 
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?
 
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?
 
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
 
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.
 
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.
 
@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).
 

Zurück
Oben