Java Swing - Optimierungsfrage

Hallo Swing-Experten,

ich möchte eine Komponente mit einem „Schleier“ überzogen und einer Uhr links oben in der Ecke anzeigen lassen. Bei langen Rechenarbeiten sollen so mittels SwingWorker Komponenten deaktiviert werden.

Ich habe es auch realisiert, meine Frage ist aber: Lässt sich das noch effektiver implementieren? Mir kommt es so vor, als würde meine Methode ziemlich viel CPU-Last erzeugen (oder bilde ich mir das nur ein).

protected void paintComponent(Graphics g) {
super.paintComponent(g);

// Fläche mit „Gitternetz“ überziehen
g.setColor(new Color(200, 200, 200));
Dimension d = getSize();
for (int x = 0; x

Moin

Ich habe es auch realisiert, meine Frage ist aber: Lässt sich
das noch effektiver implementieren? Mir kommt es so vor, als
würde meine Methode ziemlich viel CPU-Last erzeugen (oder
bilde ich mir das nur ein).

Swing ist schon schneller als das alte AWT, aber eine Ausgeburt der Geschwindigkeit ist es beleibe nicht.

> protected void paintComponent(Graphics g) {  
> super.paintComponent(g);  
>   
> // Fläche mit "Gitternetz" überziehen  
> g.setColor(new Color(200, 200, 200));  
> Dimension d = getSize();  
> for (int x = 0; x


Wenn ich das richtig sehe übermalst du die Rechtecke aus der Schleife mit dem letzten g.drawImage ?? Wenn es sich vermeiden lässt sollte man keine Elemente malen die nachher eh übermalt werden.

Nochwas: Man kann durchsichtige Bilder erzeugen (BufferImage) und in diesen häufig gebrauchte Elemente "speichern". Man erzeugt das BufferImage in der richtigen Grösse, mit Alpha, malt das Gitter einmal rein und verwendet danach nur noch das Bufferimage (unskaliert und per Mediatracker vorbereitet !!). Müsste schneller gehen.

cu

Hallo Marcel,

ich möchte eine Komponente mit einem „Schleier“ überzogen und

Ich vermute, dass der Schleier das Problem ist, da dafür sehr viele Linien zu zeichen sind. Eine viel schnellere aber speicherfressende Alternative wäre, den Schleier und seiner endgültigen Größe einmal in ein Offscreen-Buffered-Image (Farbmodell: INT_ARGB) zu zeichnen, und dann im Deinem paint immer nur noch das BufferedImage statt der Linien ausgeben.

Grüße Ralf