Swing Fading mit einem jPanel

vandread

Aktives Mitglied
Hallo Leute,

also mein Ziel ist folgendes... Ich möchte gerne ein jPanel habe in dem ich andere Komponenten plazieren kann wie z.B. jButtons, dieses Panel möchte ich dann später "ein faden" können...

Nach suchen im Internet habe ich eine tolle Anleitung gefunden die erklärt wie man einen jButton zum faden bringen kann. Ich habe das dann einfach übernommen und daras ein Panel gemacht.

Das funktioniert auch ohne Probleme, das Panel fadet schön vor sich hin...
Auch wenn ich Komponenten hinzufüge (also ins Panel) faden diese schön mit...

Doch ich habe jetzt ein kleines Problem, das Panel hat einen schwarzen hintergrund und diesen möchte ich eigentlich gar nicht haben...
Ich möchte eigentlich dass das Panel an sich unsichtbar ist und nur die Komponenten im Panel sichtbar sind und diese eben faden...

Hat Jemand eine Idee?

Meine Klasse sieht wie folgt aus:

Java:
import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
import org.jdesktop.animation.timing.Animator;
import org.jdesktop.animation.timing.TimingTarget;

public class FadingPanel extends JPanel implements TimingTarget {

    float alpha = 1.0f;                 // current opacity of button
    Animator animator;                  // for later start/stop actions
    int animationDuration = 2000;   // each cycle will take 2 seconds
    BufferedImage panelImage = null;

    public FadingPanel() {
        setOpaque(false);

        animator = new Animator(animationDuration / 2, Animator.INFINITE, Animator.RepeatBehavior.REVERSE, this);
        animator.setStartFraction(1.0f);
        animator.setStartDirection(Animator.Direction.BACKWARD);
    }

    @Override
    public void paint(Graphics g) {
        // Create an image for the panel graphics if necessary
        if (panelImage == null || panelImage.getWidth() != getWidth() || panelImage.getHeight() != getHeight()) {
            panelImage = getGraphicsConfiguration().createCompatibleImage(getWidth(), getHeight());
        }
        Graphics gPanel = panelImage.getGraphics();
        gPanel.setClip(g.getClip());

        //  Have the superclass render the button for us
        super.paint(gPanel);

        // Make the graphics object sent to this paint() method translucent
        Graphics2D g2d = (Graphics2D) g;
        AlphaComposite newComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
        g2d.setComposite(newComposite);

        // Copy the button's image to the destination graphics, translucently
        g2d.drawImage(panelImage, 0, 0, null);
    }

    @Override
    public void begin() {
    }

    @Override
    public void end() {
    }

    @Override
    public void repeat() {
    }

    /**
     * TimingTarget implementation: this method sets the alpha of our button to
     * be equal to the current elapsed fraction of the animation
     */
    @Override
    public void timingEvent(float fraction) {
        alpha = fraction;
        // redisplay our cbutton
        repaint();
    }

    public void startStopFading() {
        if (!animator.isRunning()) {
            animator.start();
        } else {
            animator.stop();
            // reset alpha to opaque
            alpha = 1.0f;
        }
    }
}
 

Marco13

Top Contributor
Beim Drüberschauen... vielleicht mal statt
panelImage = getGraphicsConfiguration().createCompatibleImage(getWidth(), getHeight());
sowas wie
panelImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
oder so..?

KSKB wär nicht verkehrt.
 

bERt0r

Top Contributor
Ich glaube der Fehler ist der: Wenn du ein neues BufferedImage erstellst ist das erstmal komplett schwarz. Normalerweise ist das in dem Fall nicht wichtig, weil super.paintComponent den kompletten Bereich mit der Hintergrundfarbe füllt. Du hast das Panel aber auf nicht opaque gesetzt, was bedeutet dass die Hintergrundfarbe nicht gezeichnet wird und die schwarze Farbe durchscheint.
 

vandread

Aktives Mitglied
@Marco13
Danke für deinen Tipp, damit funktioniert es!
Jetzt ist der schwarze Hintergrund von dem Panel unsichtbar...
Allerdings habe ich durch probieren auch rausgefunden das es mit dieser Zeile auch geht:

panelImage = getGraphicsConfiguration().createCompatibleImage(getWidth(), getHeight(), 2);

Mit der "2" am Ende kann man sagen das man eine Transparenz haben möchte...

Doch jetzt stehe ich vor einem neuen Problem... ):

Alle Komponenten die im Panel sind (in meinem Fall sind es jetzt mal Labels die Bilder beinhalten) werden irgendwie komisch gezeichnet... also "hässlich" die Ränder sind verpixelt, man könnte meinen das kein anti aliasing aktiviert wäre...
Wenn ich allerdings die Transparenz weg lasse sehen die Bilder normal aus...

@bERt0r
Ich verstehe auf was du hinaus möchtest, doch wenn ich opaque auf true setzen würde, dann ist der Hintergrund ja erst recht nicht mehr unsichtbar, oder etwa nicht?

*edit
Nein mein Fehler, selbst wenn der Hintergrund nicht transparent ist sehen die Bilder total komisch aus...
Als würden sie irgendwie auf eine schlechte (sehr schlechte) Qualität runter komprimiert...
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Diese 2 sollte aber nicht eine 2 sein, sondern die entsprechende Transparency-Konstante - es gibt
Transparency.OPAQUE, Transparency.BITMASK, Transparency.TRANSLUCENT
Du hast im Moment 2=Transparency.BITMASK, hab' gerade nicht im Kopf was das bedeutet, aber probier' mal statt der 2 ein "Transparency.TRANSLUCENT"
 

vandread

Aktives Mitglied
Oh vielen Dank!

Ich habe jetzt alle drei Optionen getestet...

OPAQUE: Hintergrund bleibt schwarz und Bilder sehen komisch aus
BITMASK: Hintergrund ist transparent aber Bilder sehen komisch aus
TRANSLUCENT: Hintergrund ist transparent aber Bilder sehen komisch aus

Hatte also leider keinen Erfolg... ):
 

vandread

Aktives Mitglied
Ich habe ein kurzes KSKB geschrieben...
Es ist ein NetBeans Projekt, aber man kann es natürlich auch in Eclipse laufen lassen...
Alle Dateien befinden sich im src Ordner und im Projekt Ordner ist auch das Timinframework!

Wie man am Beispiel erkennen kann ist zb der Schatten des Balls sehr verpixelt aber auch der der ganze Rand um das zu verdeutlichen kann man ja einfach mal in Zeile 32 (in der Main Klasse) fip durch img ersetzen dann sieht man wie das Bild eigentlich aussehen sollte...
 

Anhänge

  • KSKB.zip
    71,4 KB · Aufrufe: 10

vandread

Aktives Mitglied
Liegt es etwa an meinen Computer, kann doch nicht sein oder?

Hier ein Screenshot...
Links wenn ein eingeblendet wird und rechts wie es aussehen sollte...

ev6tnkvu.png


Der Schatten ist viel "smoother" und auch der Rand um den Ball ist glatter und nicht so verpixelt...
 

Marco13

Top Contributor
Ohja, jetzt seh' ich's auch :D

Das Bild wird immer wieder neu überzeichnet, die halbtransparenten Teile sammeln sich an. Bei den verschiedenen AlphaComposites muss ich (obwohl man's irgendwann eigentlich wissen sollte) doch immer mit Trial&Error durchprobieren :oops: , aber GROB so sollte man das Bild passend löschen können
Java:
        Graphics2D gPanel = (Graphics2D)panelImage.getGraphics();
        gPanel.setComposite(AlphaComposite.SrcOut);
        gPanel.setColor(new Color(0,0,0,0));
        gPanel.fillRect(0, 0, getWidth(), getHeight());
        gPanel.setClip(g.getClip());
 

mirisbowring

Bekanntes Mitglied
Ohja, jetzt seh' ich's auch :D

Das Bild wird immer wieder neu überzeichnet, die halbtransparenten Teile sammeln sich an. Bei den verschiedenen AlphaComposites muss ich (obwohl man's irgendwann eigentlich wissen sollte) doch immer mit Trial&Error durchprobieren :oops: , aber GROB so sollte man das Bild passend löschen können
Java:
        Graphics2D gPanel = (Graphics2D)panelImage.getGraphics();
        gPanel.setComposite(AlphaComposite.SrcOut);
        gPanel.setColor(new Color(0,0,0,0));
        gPanel.fillRect(0, 0, getWidth(), getHeight());
        gPanel.setClip(g.getClip());


Ich weiß, der Thread ist schon sehr alt (fast 3 Jahre), aber ich habe eine problem, mit deinem Code, denn Netbeans markert mir das setComposit an... Es wird mir auch nicht vorgeschlagen.
Wurde die Funktion in Java 8 verschoben bzw. gelöscht?

Ein Fadeübergang wäre in meinem Programm genau das richtige :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J "Fading" JDialog möglich? AWT, Swing, JavaFX & SWT 14
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
S Swing zu einem Datum Tage addieren/subtrahieren AWT, Swing, JavaFX & SWT 6
E Swing Mausposition auf einem JFrame erkennen AWT, Swing, JavaFX & SWT 5
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
2 JavaFX die ChoiceBox leitet den String nicht weiter oder es komm zu einem NullPointer AWT, Swing, JavaFX & SWT 8
L JavaFX javafx.fxml.LoadException bei einem Taschenrechner AWT, Swing, JavaFX & SWT 5
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
N Nur bei einem Textfiled Nullpointerexception bei getText() AWT, Swing, JavaFX & SWT 1
H JComobox in einem JPopupNeu AWT, Swing, JavaFX & SWT 7
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
Z Mit einem Button einen anderen Button Triggern AWT, Swing, JavaFX & SWT 3
D AWT Wie kann ich ein Frame von einem anderen aus beeinflussen? AWT, Swing, JavaFX & SWT 7
T Setzen von der Schriftgröße bei einem Shell AWT, Swing, JavaFX & SWT 15
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
J Fenster mit Inhalten aus einem Array Füllen AWT, Swing, JavaFX & SWT 4
D JavaFX Ein Parameter von einem Stage(GUI) zu einem anderen übergeben AWT, Swing, JavaFX & SWT 6
T Bilder bei einem JFrame einfügen AWT, Swing, JavaFX & SWT 4
S JavaFX Variablen in einem FXML File verwenden AWT, Swing, JavaFX & SWT 8
A Objekt von einem Window erstellen? AWT, Swing, JavaFX & SWT 8
Drachenbauer Swing Wie ändere ich die helle geklickt-Farbe von einem JButton? AWT, Swing, JavaFX & SWT 4
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
F JavaFX Aktuelle Zeit in einem TextField anzeigen AWT, Swing, JavaFX & SWT 7
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
F JavaFX PNG aus einem resource Ordner laden AWT, Swing, JavaFX & SWT 8
F JavaFX Checken ob der Input einem festgelegten Format gleicht AWT, Swing, JavaFX & SWT 7
B JavaFX Bilder in einem Gewissen bereich halten AWT, Swing, JavaFX & SWT 1
cool_brivk24 BufferedImage einem ClickEvent hinzufügen AWT, Swing, JavaFX & SWT 13
Q-bert Doppelclick auf einem List item AWT, Swing, JavaFX & SWT 9
J JavaFX von einem Array aus Buttons herausfinden auf welcher geklickt wurde aus dem Array. AWT, Swing, JavaFX & SWT 1
C SWT autosize bei gc.drawString() auf einem Label AWT, Swing, JavaFX & SWT 7
R Farbe zu einem Eckpunkt generieren AWT, Swing, JavaFX & SWT 2
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
F abgeleitete Panels von einem ContentPanel AWT, Swing, JavaFX & SWT 4
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
H Hintergrundbild in einem Programm AWT, Swing, JavaFX & SWT 4
F RGB-Werte aus einem String einlesen AWT, Swing, JavaFX & SWT 26
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
W Swing Hilfe beim Einbinden von Bildern in einem JFrame AWT, Swing, JavaFX & SWT 8
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
L JavaFX Mehrere JavaFX Szenen mit einem Menü AWT, Swing, JavaFX & SWT 1
L JavaFX Klickverhalten bei einem Panel AWT, Swing, JavaFX & SWT 1
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
Y Darstellung und MouseHover bei bestimmten Wörtern in einem String AWT, Swing, JavaFX & SWT 2
GreenTeaYT Wie vergebe Ich den Jframe Title den Namen aus einem Element von der Arraylist ? AWT, Swing, JavaFX & SWT 4
H Geld pro Sekunde in einem Clickerspiel AWT, Swing, JavaFX & SWT 4
Java_RY wie kann ich auf JButtons in einem JPanel zugreifen AWT, Swing, JavaFX & SWT 3
F Zeichnung einem JPanel im Layoutmanager zuweisen AWT, Swing, JavaFX & SWT 3
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
T AWT Farben in einem Bild ändern AWT, Swing, JavaFX & SWT 8
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
K JavaFX Mehrere Cell Editors in einem TreeView Item AWT, Swing, JavaFX & SWT 2
F JavaFX JavaFX - Hintergrundmusik in einem seperatem Task/Service AWT, Swing, JavaFX & SWT 6
D JavaFX Gesetzte Variable in einem Controller im Controller laden AWT, Swing, JavaFX & SWT 1
D Swing JCombobox in einem JTable vorbelegen AWT, Swing, JavaFX & SWT 4
T Swing JTable Zeile mit ausgelesenen Werten mit Hilfe von einem Button hinzufügen AWT, Swing, JavaFX & SWT 1
E JavaFX MenuBar und ToolBar zu einem Bereich AWT, Swing, JavaFX & SWT 3
Y Kann man Buttons in einem JFrame rund machen ? AWT, Swing, JavaFX & SWT 2
D Timer für Bildfolge in einem jLabel AWT, Swing, JavaFX & SWT 5
C (JavaFX 8) SQLite Datenbank in einem TableView darstellen AWT, Swing, JavaFX & SWT 2
M JavaFX wie kann mann sein frame mit einem Icon fersehen? AWT, Swing, JavaFX & SWT 2
L 2D-Grafik Dreieck in einem Kreis??? AWT, Swing, JavaFX & SWT 1
F Swing Image einem Button hinzufügen AWT, Swing, JavaFX & SWT 5
J Swing unterschiedliche Inhalte in einem JFrame AWT, Swing, JavaFX & SWT 3
R Swing Mehrere JTextFields mit einem Document Listener AWT, Swing, JavaFX & SWT 2
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
S Punkt finden der in einem Shape liegt..? AWT, Swing, JavaFX & SWT 11
A Swing Externe Klassen aufrufen und in einem bereits vorhandenen Container einfügen AWT, Swing, JavaFX & SWT 0
P LayoutManager TextField.setSize(); in einem FlowLayout AWT, Swing, JavaFX & SWT 3
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Java FX Innerhalb einem FXML-Dialog weiteren FXML-Dialog einblenden AWT, Swing, JavaFX & SWT 3
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
D Swing &MouseListener in einem JFrame, sinnig? AWT, Swing, JavaFX & SWT 11
J RadioButton-Gruppe in Kombination mit einem Button AWT, Swing, JavaFX & SWT 6
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
G Text im textfeld in einem Editor anzeigen AWT, Swing, JavaFX & SWT 18
V Fenster in einem Fenster anordnen AWT, Swing, JavaFX & SWT 7
E Alles in einem Fenster AWT, Swing, JavaFX & SWT 5
F SWT Problem mit Tabelle und Combobox in einem Wizard AWT, Swing, JavaFX & SWT 5
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7
R Array aus einem Objekt auslesen AWT, Swing, JavaFX & SWT 4
S ComboBox-Werte aus einem Array an Textfields übergeben AWT, Swing, JavaFX & SWT 3
A Swing 2 JSlider verknüpfen und mit einem JTextField vergleichen, dann Ausgabe AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben