optimiertes Zeichnen

Status
Nicht offen für weitere Antworten.

Torlan

Mitglied
Hey Java Forum!

Also erstmal ein bischen code..

Code:
 private void drawSequenzeAndScaleAndScores(Graphics g) {
        if(analysedSequence!=null){
            Dimension d = getActualComSize();
            int widthPlus = 0;
            // draws the base sequence and positions

                for(int i=0,n=analysedSequence.length();i<n;++i){
                    g.setFont(fontBase);
                    //base sequence
                    g.drawString(getBase(analysedSequence.charAt(i)),
                        ((int) (d.width-(d.width-30)))+widthPlus,((int) (d.height-(d.height-d.height/1.1f))));
                    Integer tmp = i+1;
                    int shiftY = ((getBaseWidth(analysedSequence.charAt(i)))-getPosWidth(tmp.toString()))/2;
                    g.setFont(fontPosition);
                    //positions
                    g.drawString(tmp.toString(),
                        ((int) (d.width-(d.width-30)))+widthPlus+shiftY,((int) (d.height-(d.height-d.height/1.06f))));
                    widthPlus+= getBaseWidth(analysedSequence.charAt(i));
                }

                // draws the percent axis
            g.drawLine((int) (d.width-(d.width-20)),  // x
                           d.height-(d.height-5),     // y
                    (int)  (d.width-(d.width-20)),    // x
                    ((int) (d.height-(d.height-d.height/1.12f)))-fontBaseHigh); // y
            float scaleLength = ((d.height-(d.height-5))-(((int) (d.height-(d.height-d.height/1.12f)))-fontBaseHigh))*-1.0f;
            float tenPercent = scaleLength/10.0f;
            float oneUp= 0.0f;
            int unit = 0;
            // draws the percent scale units
            for(int i=0;i<10;++i){
                Integer tennerUnits = new Integer(unit);
                g.drawString(tennerUnits.toString(),(int) (d.width-d.width),
                        (((int) (d.height-(d.height-d.height/1.12f)))-fontBaseHigh)-(int)oneUp);
                unit+=10;
                oneUp+=tenPercent;
            }
            preferedXsize = widthPlus+100;
            preferedYsize = (int) (scaleLength+fontBaseHigh+fontPosHigh+30);
            // draws the scores
            float onePercent = scaleLength/100.0f;

                for(int i=0, n=allScores.size();i<n;++i){
                    WindowScore tmp = (WindowScore) allScores.get(i);
                    int shiftYleft = getBaseWidth(analysedSequence.charAt(tmp.getLeftPosition()))/2;
                    g.setColor(Color.red);
                    g.fillRect((int) ((d.width-(d.width-30))+getXforBar(tmp.getLeftPosition()))+shiftYleft,
                            (int) ((int) (d.height-(d.height-d.height/1.12f))-fontBaseHigh-(tmp.getScore()*onePercent)),
                            (int) getXforBar(matrixLength-1),
                            (int) (tmp.getScore()*onePercent));
                    g.setColor(Color.black);
                    g.drawRect((int) ((d.width-(d.width-30)+getXforBar(tmp.getLeftPosition()))+shiftYleft),
                            (int) ((int) (d.height-(d.height-d.height/1.12f))-fontBaseHigh-(tmp.getScore()*onePercent)),
                            (int) getXforBar(matrixLength-1),
                            (int) (tmp.getScore()*onePercent));

                }
        }

Also obrige Methode wird von paintComponent() meiner Visualisierungsklasse aufgerufen. Sie zeichnet im Prinzip einen Graphen. Auf der X-Achse wird eine numerierte Basensequenz (DNA) gezeichnet und die Y-Achse gibt Scores von 0-100% an. Funktioniert an sich auch wunderbar. Der Haken liegt jetzt in der Größe.
Für kurze Sequenzen läuft es flüssig, wenn nun aber Sequenzen die millionen und mehr Basenpaare lang sind dargestellt werden sollen so kann man ja nicht mehr alles zeichnen - mist und jetzt?
Also klar ist das ich die for schleifen irgendwie abändern muss - leider verstehe ich aber grundsätzlich diese Sache mit dem parameterisierten repaint(Rectangle r) nicht.
Ich hab mir auch überlegt das ich vielleicht jedem WindowScore Object ( jedes ist ein treffer und enthält infos über position und score und teilsequence) eine paint methode verpassen sollte und sie somit quasie intelligent Gestalte indem sie eigenständig entscheiden können ob sie gezeichnet werden müssen. Nicht desto trotz ist mir das mit dem parameterisierten repaint() irgendwie unklar...

Bitte um Vorschläge wie ich solche extrem großen Komponenten noch flüssig teilzeichnen kann.
Die Komponente ist in eine JScrollPane eingepackt und von dort sollte ja dann auch der sichtbare Bereich übergeben werden - aber wie?
 

Ark

Top Contributor
Mit
Code:
repaint(Rectangle)
und
Code:
repaint(int, int, int, int)
kannst du dafür sorgen, dass nur das übergebene Rechteck neu gezeichnet wird.

Nehmen wir an, du arbeitest auf einer Fläche von 100x100, dann würde jeder Aufruf von
Code:
repaint();
die gesamte Fläche zum Neuzeichnen nehmen. Rufst du stattdessen
Code:
repaint(0, 0, 100, 50);
auf, so wird nur die obere Hälfte neu gezeichnet werden.

Welche Teile neu gezeichnet werden müssen, musst du dazu natürlich wissen oder berechnen. ;)

Wenn Komponenten mehrmals in ihrem Aussehen geändert werden (also in einem Zug mehrere Veränderungen vorgenommen werden), empfiehlt es sich, vor der ersten Änderung
Code:
setIgnoreRepaint(true);
und nach allen Änderungen
Code:
setIgnoreRepaint(false);
aufzurufen. (So mache ich das jedenfalls.) Außerdem ist es meistens von Vorteil, Aufrufe von repaint-Methoden einem extra dafür angelegten Thread zu überlassen.

Ich hoffe, das hilft. :)

MfG
Ark
 

Lim_Dul

Top Contributor
Alternativ eine Art von Doublebuffering anwenden.

Anstelle deinen Graphen direkt zu zeichnen, zeichnest du ihn auf ein BufferedImage. Wenn du fertig bist, dann wird das BufferedImage zum "aktiven" bild erklärt und gezeichnet und der nächste Graph wird in neues Bild gemalt. Ist der neue Graph fertig, vertauschen die beiden Bilder ihre Aufgabe usw.
 

Ark

Top Contributor
Ergänzend zu Lim_Duls Antwort: Wenn du ein BufferedImage verwendest, solltest du per getRaster() das WritableRaster ziehen, in einer Variablen speichern und anschließend mit den Methoden des WritableRasters arbeiten, zum Beispiel:
Code:
setSample(int x, int y, int b, int s)
;)
 

Torlan

Mitglied
Sorry das ich mich erst jetzt melde...

Also so erstmal danke an euch für euer bemühen. Aber so ganz hat mir das noch nicht geholfen....
So wie es aussieht habe ich 2 alternative Grundvorschläge. Aber zunächst ist mir eine Kette von Ereignissen nicht so ganz klar. 1. Schickt meine JScrollPane, in welcher meine Komponente eingebettet ist auch die entsprechenden Aufrufe von der parameterisierten Version von repaint oder muss man das irgendwie mit einer Variablen setzten. 2. Da es sich ja um eine eigene Komponenete handelt die von JComponet abgeleitet wurde muss ich mich ja dann auch selber um die Implementierung kümmern? - also for schleifen ändern?.

Nun zu meinen beiden Möglichkeiten: 1. Ich zeichne auf eine Image vor und zeichne dann drawImage - wie ist das hier mit dem optimiertem zeichnen; ich meine wird das automatisch Erledigt oder muss man sich selber darum kümmern?
2. Ich lege mir ein array an das so groß ist wie die Komponente in Pixeln (X-Achse). Dann berechne ich für jedes Pixel den entprechenden Wert für "i" in den for-Schleifen und speichere ihn, in dem Array, an entsprechender Position --> so erpare ich mir das Berechnen beim anzeigen, was beim entsprechendem Aufwand zu Verzögerungen führen könnte.
Das Array wird nun über den übergebenen Wert aus repaint(Rectangle r) >>(r.x)<< angeprochen und liefert mir so den Startpunkt für die for-Schleife - Enpunkt wird äquivalent gesetzt.

Haltet ihr das das so für umsetzbar oder gibt es bessere Möglicheiten? Wenn ja welches ist die effizientere Lösung?
 

Ark

Top Contributor
Ich habe mir mal deine Implementierung vorgenommen und erst einmal aufgeräumt. Dein Geschreibsel war (wenn ich das so sagen darf) absoluter Müll. Hier ist nun meine Version, bitte beachte meine Kommentare.
Code:
private void drawSequenzeAndScaleAndScores(Graphics g){
	if(analysedSequence==null) return;
	final int dheight = getActualComSize().height;
	final int dwidth = getActualComSize().width;
	int widthPlus = 0;
	int bwidth;// Ergebnis von getBaseWidth(char)
	// draws the base sequence and positions
	for(int i=0,n=analysedSequence.length();i<n;++i){
		g.setFont(fontBase);
		//base sequence
		g.drawString(getBase(analysedSequence.charAt(i)),
			30+widthPlus,(int) (dheight/1.1f)
		);
		g.setFont(fontPosition);
		//positions
		g.drawString(Integer.toString(i+1),
			30+widthPlus+(((bwidth=getBaseWidth(analysedSequence.charAt(i)))-getPosWidth(Integer.toString(i+1)))>>1),// einfacher, wenn getPosWidth(int) vorhanden
			(int) (dheight/1.06f)
		);
		widthPlus+= bwidth;
	}
	// draws the percent axis
	g.drawLine(20, 5, 20, (int) (dheight/1.12f)-fontBaseHigh);
	final float scaleLength = (5-(int) (dheight/1.12f)+fontBaseHigh)*-1.0f;
	final float tenPercent = scaleLength/10.0f;
	final float onePercent = scaleLength/100.0f;
	float oneUp = 0.0f;
	int unit = 0;
	// draws the percent scale units
	for(int i=0;i<10;++i){
		g.drawString(Integer.toString(unit), 0, (int) (dheight/1.12f)-fontBaseHigh-(int)oneUp);
		unit+=10;
		oneUp+=tenPercent;
	}
	preferedXsize = widthPlus+100;
	preferedYsize = (int) (scaleLength+fontBaseHigh+fontPosHigh+30);
	// draws the scores
	int shiftYleft;
	WindowScore tmp;
	int tmpleft;
	float tmpscore;// Datentyp so OK?
	int x1;
	int y1;
	int x2;
	int y2;
	for(int i=0, n=allScores.size();i<n;++i){
		tmp = (WindowScore) allScores.get(i);// typsicher? (s. u.)
		tmpleft = tmp.getLeftPosition();
		tmpscore = tmp.getScore()*onePercent;
		shiftYleft = getBaseWidth(analysedSequence.charAt(tmpleft))>>1;
		g.setColor(Color.RED);
		g.fillRect((x1=30+(int) getXforBar(tmpleft)+shiftYleft),// welchen Datentyp gibt getXforBar(...) zurück?
			(y1=(int) (dheight/1.12f-tmpscore)-fontBaseHigh),
			(x2=(int) getXforBar(matrixLength-1)),
			(y2=(int) tmpscore)
		);
		g.setColor(Color.BLACK);
		g.drawRect(x1, y1, x2, y2);
	}
}

// ÜBERLEGE BITTE, OB getPosWidth(String) AUCH ALS getPosWidth(int) MÖGLICH IST!!
// IST allScores TYPSICHER? JDK 1.5? WELCHE DATENSTRUKTUR?
// LIEFERT tmp.getScore() EIN float?

Bitte teste diesen Code, er sollte genau Gleiches erledigen. ;) Wenn er das nicht tut: Asche auf mein Haupt! *g*

MfG
Ark
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
L Swing zeichnen AWT, Swing, JavaFX & SWT 14
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
E Transparent zeichnen AWT, Swing, JavaFX & SWT 2
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T Tic Tac Toe - GUI Linien zeichnen AWT, Swing, JavaFX & SWT 14
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
S Parallele Linien zeichnen AWT, Swing, JavaFX & SWT 5
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
L JavaFX JavafX Timelime zeichnen und schön stylen? AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
I Spielsteine zeichnen und entfernen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
S 2D-Grafik MouseDragged Linien zeichnen AWT, Swing, JavaFX & SWT 4
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
F Zeichnen des Button AWT, Swing, JavaFX & SWT 4
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
P SWT Nebula Gallery - Bildbereiche zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur AWT, Swing, JavaFX & SWT 2
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
Helgon Swing Mit Swing zeichnen / NetBeans GUI AWT, Swing, JavaFX & SWT 11
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
J JApplet und Zeichnen AWT, Swing, JavaFX & SWT 8
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
4 Swing Graphen selber zeichnen AWT, Swing, JavaFX & SWT 2
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
T Zeichnen von getSubimage funktioniert nicht AWT, Swing, JavaFX & SWT 7
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
D Zeichnen eines Barplots AWT, Swing, JavaFX & SWT 2
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3
M Suche Javabibliothek zum Zeichnen mathematischer Funktionen AWT, Swing, JavaFX & SWT 11
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
M Swing In GUI-Builder-JFrame mit Menü Schreiben und Zeichnen AWT, Swing, JavaFX & SWT 4
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
C Funktionen zeichnen AWT, Swing, JavaFX & SWT 16
P JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
M Auf einem Hintergrundbild zeichnen AWT, Swing, JavaFX & SWT 2
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
T Oval auf ein JPanel zeichnen AWT, Swing, JavaFX & SWT 3
L Zeichnen in zwei Fenstern AWT, Swing, JavaFX & SWT 8
S Font laden, Wort zeichnen und animieren..? AWT, Swing, JavaFX & SWT 2
S Bild von Punkt zu Punkt zeichnen AWT, Swing, JavaFX & SWT 8
U Pixel zeichnen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben