Java-Transparenz-Rendering-Fehler

8

Ich entwickle gerade ein Java-Programm im Kiosk-Stil, um Wetter, Zeit, Vorhersage usw. anzuzeigen. Hier ist eine Aufnahme von dem, wie das Programm aussehen sollte (Screenshot vor der aktualisierten Zeit)

Die verschiedenen Abschnitte werden als JPanels erstellt, wobei die paintComponent() -Methode überschrieben wird. Sie zeichnen einen Gradientenkopf und einen halbtransparenten Hintergrund. Wenn ich jedoch den Inhalt eines dieser Panels ändere, wird der vorherige Inhalt zurückgelassen und nicht entfernt. Ein Beispiel ist unten gezeigt:

Wie Sie sehen können, überlappten sich die Zahlen, als die Zeit von 11:51 auf 11:52 wechselte, und der Hintergrund wurde heller (weil der halbtransparente Hintergrund darüber neu gezeichnet wurde)

Der grafische Fehler

Was soll ich tun, um diese Überschneidung zu vermeiden? Letztendlich würde ich es vorziehen, nicht den gesamten Bildschirm neu zeichnen zu müssen, wenn ein einzelnes Panel seinen Inhalt aktualisiert. Ich würde es vorziehen, nur diesen bestimmten Abschnitt neu zu zeichnen. Es wäre einfach, den Hintergrund und dann alle darin enthaltenen Komponenten neu zu streichen.

Aktualisieren

Mehrere Antworten beinhalten das Löschen des zu zeichnenden Bereichs. Ob ich g.clear() oder AlphaComposite.CLEAR verwende löscht das Hintergrundbild. Dies kann in der folgenden Abbildung gesehen werden. Vielleicht könnte ich, wenn ich den Hintergrund kopieren könnte, bevor ich den Bereich lösche, diesen Teil des Hintergrunds neu streichen und dann die anderen Bilder entsprechend schichten. Gedanken?

Update 2

Es wurde eine Antwort gesendet, die ein vollständiges Arbeitsbeispiel eines Timers zeigt, der über eine transparente Fläche und einen Hintergrund gelegt wurde. Dies ist sehr nützlich, aber ich male meine Subkomponenten nicht manuell. Die Zeit, Wettersymbole und Temperaturen sind alle JLabels, die über dem halbtransparenten Panel verteilt sind. Ich würde es vorziehen, die einzelnen Komponenten nicht manuell malen zu müssen.

    
Peaches491 27.07.2012, 16:00
quelle

3 Antworten

4

Ein ähnliches Problem

Bild vor http://img641.imageshack.us/img641/8873/translucentfail.png

ist hier

adressiert

Bild nach http://i46.tinypic.com/6gj1gk.png

Beachten Sie auch, "Swing-Programme sollten paintComponent() überschreiben, anstatt paint() zu überschreiben." - Malen in AWT und Swing: Die Paint-Methoden .

    
trashgod 27.07.2012 17:27
quelle
3

Bevor Sie malen, erstellen Sie eine g.clearRect (0,0, w, h) Anruf. Dadurch wird alles im angegebenen Bereich entfernt und Sie werden nicht über den vorherigen Rahmen zeichnen.

Vielleicht möchten Sie einige Double-Buffering-Techniken anwenden, da Ihr Bildschirm aufgrund des Löschens leicht blinkt.

    
xthexder 27.07.2012 16:03
quelle
3

Ich stelle das wirklich schnell zusammen, es ist nichts besonderes ...

Das gesamte Projekt besteht aus einem JFrame, einem BackgroundImagePane und dem ClockPane

Der ClockPane sieht so aus (wie Sie den Rest erstellen können;))

%Vor%

Damit wird die Uhr jede halbe Sekunde aktualisiert und ich habe keine Probleme mit dem Repaint

Das Einzige, woran ich denken kann, ist setOpaque(false);

AKTUALISIERT

Dieses Beispiel wurde komplett mit nichts als Beschriftungen und Panels erstellt (der Hintergrundbereich ist ein benutzerdefinierter Farbauftrag und das Datumslabel hat auch seinen Hintergrund, aber ansonsten)

Nun, ich habe meine zusammengehackt, also ist es nicht so nett wie deine, aber andererseits werde ich nicht bezahlt;)

%Vor%

Nur um das Leben einfacher zu machen, das Hintergrundfenster

%Vor%

Wenn Sie es immer noch nicht zum Laufen bringen können, könnte das einzige andere Problem, das ich mir vorstellen kann, etwas mit Vollbild, exklusivem Modus zu tun haben, das habe ich nicht getestet: P

    
MadProgrammer 27.07.2012 23:33
quelle