# Die Farbe von JButton beim Klicken ändern?



## Lars Erik #85 (16. Mai 2006)

Bin gerade dabei ein kleines Tool mit Swing Oberfläche zu programmieren und jetzt stehe ich vor einem kleinen Problem.

Beim Klicken eines JButton ändert sich dessen Farbe wärend der Klick-Dauer nun möchte ich geren diese Farbe definieren und finde einfach nicht heraus wie.

Bitt helft mir.

Gruß Lars Erik!


----------



## Mewel (16. Mai 2006)

wenn ich deine Frage richtig verstanden habe müsste die Lösung etwa so aussehen.

JButton b = new JButton("name");

b.addActionListener( new ActionListener() {
    public void actionPerformed(ActionEvent e) {
         ((JButton)e.getSource()).setBackgroundColor(Color.RED);
    }
)


----------



## Lars Erik #85 (16. Mai 2006)

Leider war das nicht ganz die Lösung.

Deine Lösung verändert die Farbe des Buttons nach dem Klicken nicht wärend das Klickens.

Ich werde mein Problem nochma etwas genauer beschreiben:

Ich habe einen JButton erstellt


```
JButton bCalc = new JButton("Berechnen");
```
und dann die Farbe geändert


```
bCalc.setBackground(fgColor);
```

und dann dem Container hinzugefügt


```
container.add(bCalc);
```


Nun zu meinem Problem wenn ich auf den Button Klicke und die Mouse gedrückt halte verändert sich die Farbe das Buttons in eine upassendes Grau. Wenn ich die Maus wieder los lasse bekommt der Button die von mir festgelegte Farbe zurück. 
Ich möchte jetzt gerne die Farbe die der Button wärend das Klickens annimmt in ein schönes Braun verwandeln damit mein gesamtbild wieder passt.

GRuß Lars Erik!


----------



## André Uhres (16. Mai 2006)

```
//package schnipsel2;
/*
 * ColorizedButton.java
 */
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
/**
 * @author  Leif Samuelsson  
 * Swing Engineer, Sun Microsystems  
 * Santa Clara, CA, USA  
 * [url]http://forum.java.sun.com/thread.jspa?threadID=430926&start=15&tstart=0[/url]
 */

public class ColorizedButton extends JButton {
    private static ColorizeImageFilter imageFilter = new ColorizeImageFilter();
    
    private Color color;
    
    public ColorizedButton(String title, Color color) {
        super(title);
        this.color = color;
    }
    
    public void paintComponent(Graphics g) {
        boolean opaque = isOpaque();
        if (opaque) {
            // Fill background
            g.setColor(getBackground());
            g.fillRect(0, 0, getWidth(), getHeight());
        }
        
        // Let the UI paint to offscreen image
        setOpaque(false);
        Image img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics g2 = img.getGraphics();
        g2.setFont(g.getFont());
        super.paintComponent(g2);
        
        // Colorize!
        img = imageFilter.colorize(this, img, color);
        
        // Paint offscreen image to button
        g.drawImage(img, 0, 0, null);
        setOpaque(opaque);
    }
    
    private static class ColorizeImageFilter extends RGBImageFilter {
        double cr, cg, cb;
        int bgRGB, fgRGB;
        
        public ColorizeImageFilter() {
            canFilterIndexColorModel = true;
        }
        
        public Image colorize(JComponent comp, Image fromImage, Color c) {
            cr = c.getRed()   / 255.0;
            cg = c.getGreen() / 255.0;
            cb = c.getBlue()  / 255.0;
            bgRGB = comp.getBackground().getRGB();
            fgRGB = comp.getForeground().getRGB();
            ImageProducer producer = new FilteredImageSource(fromImage.getSource(), this);
            return new ImageIcon(comp.createImage(producer)).getImage();
        }
        
        public int filterRGB(int x, int y, int rgb) {
            int alpha = rgb & 0xff000000;
            
            if (rgb == bgRGB || rgb == fgRGB || alpha < 0x80000000) {
                return rgb;
            }
            
            // Assume all rgb values are shades of gray
            double grayLevel = 2 * (rgb & 0xff) / 255.0;
            double r, g, b;
            
            if (grayLevel <= 1.0) {
                r = cr * grayLevel;
                g = cg * grayLevel;
                b = cb * grayLevel;
            } else {
                grayLevel -= 1.0;
                r = cr + (1.0 - cr) * grayLevel;
                g = cg + (1.0 - cg) * grayLevel;
                b = cb + (1.0 - cb) * grayLevel;
            }
            
            return (alpha +
                    (((int)(r * 255)) << 16) +
                    (((int)(g * 255)) << 8) +
                    (int)(b * 255));
        }
    }
    
    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        JFrame frame = new JFrame();
        Container cp = frame.getContentPane();
        cp.setLayout(new FlowLayout());
        cp.add(new ColorizedButton("Red",   Color.red));
        cp.add(new ColorizedButton("Green", Color.green));
        cp.add(new ColorizedButton("Blue",  Color.blue));
        frame.setBounds(100, 100, 200, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
```


----------



## Lars Erik #85 (17. Mai 2006)

Ich verstehe zwar noch nicht ganz wie es funktioniert aber so etwas habe ich gesucht. Satte farben hätten es auch getan aber das mit der Grauabstufung sieht natürlich verdammt gut aus.

Ich danke dir ersteinmal!

Würde mich allerdings freuen wenn jemand noch eine Lösung hätte die den Botton einfach nur von Rot noch Blau beim Klicken verändert. Da ich denke das dies für mich leichter Verstädnlich ist.

Gruß Lars Erik!


----------

