# Button verblassen lassen



## Dagobert (2. Jul 2008)

Einen wunder schönen guten Abend zusammen,
Ich habe gerade mal wieder ein kleines Problem.
Ich möchte gernen einen Button langsam verblassen/ausgraunen lassen, aber ich habe keine Ahnung wie ich das anstellen soll. Das einfache "disablen" kommt dehn schon nahe, nur möchte ich, das dies langsamer geschiht.
Wie kann ich das bewerkstelligen? ???:L 

Die einzige möglichkeit die mir gerade einfält ist ein Haufen Images die nach und nach dunkler werden bis zum erwünschten Ergebniss. Aber das muss doch auch irgendwie anders gehen (einfacher).


mfg. Dagobert


----------



## Campino (2. Jul 2008)

Du könntest "setBackground" und "setForeground" verwenden um die Buttonfarbe zu ändern, dazu jeweils ein repaint. Allerdings ist AWT/Swing glaube ich nicht für solche Effekte gedacht...


----------



## Marco13 (2. Jul 2008)

NICHTS ist für solche Effekte gedacht. Ist zwar blöd, die Frage "Wie geht das?" zu beantworten mit "Wofür brauchst du das?", aber ... manchmal werden shcon absurde Fragen gestellt :?


----------



## lhein (2. Jul 2008)

Schau Dir mal die Examples unter www.filthyrichclients.com an.
Das Buch ist so ganz nebenbei bemerkt sein Geld absolut wert.


----------



## Illuvatar (2. Jul 2008)

Marco13 hat gesagt.:
			
		

> NICHTS ist für solche Effekte gedacht. Ist zwar blöd, die Frage "Wie geht das?" zu beantworten mit "Wofür brauchst du das?", aber ... manchmal werden shcon absurde Fragen gestellt :?



Und überhaupt... dieser ganze grafische Schnickschnack. Die Benutzeroberfläche hätte man einfach so wie damals in Win 3.0 belassen sollen, alles nur unnötige Zeitverschwendung...

(wer Ironie findet darfs sie behalten)


----------



## Wildcard (2. Jul 2008)

Anders ist definitiv nicht immer besser (bei GUIs). Daher grundsätzlich das System Look and Feel nehmen, denn es ist genau das was der User haben wollte.
Wenn der User einen tollen Composition Fenster Manager mit 3D Effekten und Buttoneffekten hat, schön. Dann kümmert sich aber der Fenstermanager und nicht das Anwendungsprogramm.


----------



## Marco13 (2. Jul 2008)

@Illuvatar: Nicht, dass ich mit so was gerechenet hätte.... :wink: 

Es kommt nunmal oft vor, dass Leute (Anfänger) irgendwelchen (und der Threadersteller möge mir dieses Wort verzeihen) Firlefanz implementieren wollen (Tooltip-Hintergundfarbe ändern, ActionListener an den Button einer Scrollbar hängen, und was man hier nicht alles liest).

Ganz objektiv: Wozu soll ein Button langsam ausgegraut werden? Um ihn "langsam zu disablen"? Ab welchem Grauwert soll der Button disabled sein? Wenn er schon zu 49% grau ist, kann man ihn dann noch anklicken? 

Die verschwendete Rechenleistung sei jetzt mal außen vor gelassen - aber die Arbeitszeit, die manche investieren, um in ihr GUI so einen Hauch von Individualität reinzustümpern ist schon beängstigend.

Die Intention ist garnicht so schlimm. Genaugenommen fand ich die Frage sogar ganz interessant. Wenn mir irgendwann mal langweilig ist, schreibe ich vielleicht mal nur zum Spaß einen JButtonThatBecomesGraySlowly - ja, ein lutiger Effekt. Aber wenn jemand das zielgerichtet entwickeln will, um damit einen bestimmten Zweck zu erfüllen, dann wird er sich, wenn er in einem Forum fragt, wie das geht, die Gegenfrage gefallen lassen müssen, welchen Zweck das haben soll...


----------



## Dagobert (2. Jul 2008)

Habt ihr schonmal ein Hauptmenü in einem Spiel gesehen was nicht solche Spielerrein hat (abgesehn von CS).
Und jetzt stellt euch zum Beipsiel mal ein Spiel mit Sandart Windows Buttons da.
Wie wüdert ihr euch fühlen?


----------



## Illuvatar (2. Jul 2008)

@Marco: Kenn ich ja auch zur Genüge :bae:

Aber trotzdem, so kleine Spielereien haben imo schon ihre Berechtigung und können auch gut aussehen... man stelle sich nur mal vor, Aerith wäre komplett mit Standard-Swing-Components gemacht


----------



## Dagobert (2. Jul 2008)

Wenn wir schon vom Theman abschweifen...
gibt es ne Chance ein Buffered Image auf ein Button zu setzten, bei mir kommt es immer zur nullpoint


```
BufferedImage temp = ...
button.setIcon(new ImageIcon(temp));
```

mfg. Dagobert


----------



## Campino (2. Jul 2008)

Dann überleg dir, warum das nullpointert. Irgendwas ist nicht da, was da sein sollte. Entweder button ist null oder temp. Lass dir beide mal mit System.out.println() ausgeben und guck, was null ist. 

In Spielen kommt eine echte Game Engine zum Einsatz. Warum bloß? Ach, richtig, weil tolle Effekte wie der von dir beschriebene mit Standard- GUI- Packungen nicht gehen...


----------



## Marco13 (2. Jul 2008)

Hmja, man kann solche Effekte natürlich nachbauen, aber ... das Thema User Interface Design ist eine Wissenschaft für sich - da mal so einen Button Grau-animieren, nur weil's cool aussieht... naja. Ich hab' da mal was geschrieben (gehackt), das post ich ggf. morgen oder so mal...


----------



## lhein (3. Jul 2008)

Jedem das seine. 
Wer meint, dass er mit dem Standard L&F am besten fährt, der soll das in Gottes Namen tun. Aber dann ist nicht Swing die Wahl der Waffen sondern SWT/JFace.
Wer lieber GUI's nach Art von Aerith oder Picasa haben will, der braucht eben solche "Spielereien". Und für den ist das besagte Buch eben eine gute Wahl.


----------



## byte (3. Jul 2008)

Ich nehme mal an, es geht um Swing? Dann kann man SwingX verwenden, um solche Effekte zu erzeugen. SwingX beherrscht Transparenz und es gibt noch eine API zum Erzeugen von Animationen.


----------



## Marco13 (9. Jul 2008)

Ach ja, da war ja noch was....


Ist gehackt, und ineffizient aufgrund des Versuches, einigermaßen das gleiche ENDergebnis zu erreichen wie bei "setEnabled(false)" aber .... was passieren sollte, wenn man so einen gefadeten Button dann zusätzlich noch disabled, ist mir eh nicht klar, darum ist das egal....


```
import javax.swing.*;

import java.awt.*;
import java.awt.image.*;

public class FadingButton extends JButton
{
    private BufferedImage image = null;
    private float fadeValue = 0;

    public FadingButton(Action a)
    {
        super(a);
    }
    public FadingButton(Icon icon)
    {
        super(icon);
    }
    public FadingButton(String text)
    {
        super(text);
    }
    public FadingButton(String text, Icon icon)
    {
        super(text, icon);
    }
    
    @Override
    public void paintComponent(Graphics gr)
    {
        Graphics2D g = (Graphics2D) gr;
        if (image == null || image.getWidth() != getWidth() ||
            image.getHeight() != getHeight())
        {
            image = new BufferedImage(getWidth(), getHeight(),
                                      BufferedImage.TYPE_INT_RGB);
        }
        Graphics2D ig = (Graphics2D) image.getGraphics();
        ig.setFont(g.getFont());
        ig.setStroke(g.getStroke());
        super.paintComponent(ig);
        //System.out.println("fadeValue "+fadeValue);
        for (int x = 0; x < image.getWidth(); x++)
        {
            for (int y = 0; y < image.getHeight(); y++)
            {
                image.setRGB(x, y, filter(image.getRGB(x, y)));
            }
        }
        g.drawImage(image, 0, 0, this);
    }

    private float hsb[] = new float[3];

    private int filter(int rgb)
    {
        float brightness = getBrightnessFor(rgb);
        int r = (rgb >> 16) & 0xFF;
        int g = (rgb >> 8) & 0xFF;
        int b = (rgb >> 0) & 0xFF;
        Color.RGBtoHSB(r, g, b, hsb);
        hsb[1] *= (1 - fadeValue);
        hsb[2] = (1-fadeValue) * hsb[2] + fadeValue * brightness;
        int result = 0xFF000000 | Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]);
        return result;
    }

    private float getBrightnessFor(int rgbIn)
    {
        int rgb = getAsGray(rgbIn);        
        int r = (rgb >> 16) & 0xFF;
        int g = (rgb >> 8) & 0xFF;
        int b = (rgb >> 0) & 0xFF;
        Color.RGBtoHSB(r, g, b, hsb);
        return hsb[2];
    }
    
    private int getAsGray(int rgb)
    {
        int percent = 72;
        int r = (rgb >> 16) & 0xFF;
        int g = (rgb >> 8) & 0xFF;
        int b = (rgb >> 0) & 0xFF;
        int gray = (int)((0.30 * r + 0.59 * g + 0.11 * b) / 3);
        gray = (255 - ((255 - gray) * (100 - percent) / 100));
        if (gray < 0) gray = 0;
        if (gray > 255) gray = 255;
        return (rgb & 0xff000000) | (gray << 16) | (gray << 8) | (gray << 0);        
    }
    
    public void setFaded(final boolean faded)
    {
        Thread thread = new Thread(new Runnable()
        {
            public void run()
            {
                for (int i = 0; i < 100; i++)
                {
                    fadeValue = (float) i / 100;
                    if (!faded)
                    {
                        fadeValue = 1.0f - fadeValue;
                    }
                    repaint();
                    try
                    {
                        Thread.sleep(10);
                    }
                    catch (Exception e)
                    {}
                }
            }
        });
        thread.start();
    }
}
```


```
import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.color.ColorSpace;


public class FadingButtonTest
{
    public static void main(String args[])
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new GridLayout(1,0));
        
        final FadingButton fadingButton = new FadingButton(new ImageIcon("071207.jpg"));
        f.getContentPane().add(fadingButton);

        
        final JButton button = new JButton(new ImageIcon("071207.jpg"));
        f.getContentPane().add(button);
        
        final JToggleButton b = new JToggleButton("Toggle");
        b.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                fadingButton.setFaded(b.isSelected());
                button.setEnabled(!b.isSelected());
            }
        });
        f.getContentPane().add(b);
        
        //f.setSize(400,300);
        f.pack();
        f.setVisible(true);
    }
}
```


----------

