Die Farbe von JButton beim Klicken ändern?

  • Themenstarter Themenstarter Lars Erik #85
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
L

Lars Erik #85

Gast
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!
 
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);
}
)
 
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

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

Code:
bCalc.setBackground(fgColor);

und dann dem Container hinzugefügt

Code:
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!
 
Code:
//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);
    }
}
 
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!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben