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)
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.
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?
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.
Ein ähnliches Problem
Bild vor http://img641.imageshack.us/img641/8873/translucentfail.png
ist hier
adressiertBild 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 .
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.
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
Tags und Links java swing transparency repaint paintcomponent