Farbwechsel JButton mit Graphics2D

zzhat

Grünschnabel
Hallo,
ich möchte Button farblich etwas beeinflussen und hab mir zum Test mal ein kleine Programm zusammen gestellt.
Dabei ist das Darstellen beim Aufruf nicht problematisch jedoch möchte ich die Farbe des Buttons bei der Menüauswahl
"File->Change" wechseln. Leider misslinge mir all meine Versuche.
Meine letzte Variante poste ich hier mal mit. Sicher mach ich hier eine Denkfehler, daher würd ich mich freuen, wenn
mir vielleicht jemand einen Tipp geben könnte. Ich habs mit dem Neuzeichnen einfach noch nicht so recht begriffen.

Viele Grüße

Code:
import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.Event;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;

import javax.swing.KeyStroke;
import javax.swing.JPanel;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.GridBagConstraints;

/**
* @author
*
*/
public class GradientButton extends JFrame {

   private JPanel jContentPane = null;
   private JMenuBar jJMenuBar = null;
   private JMenu fileMenu = null;
   private JMenuItem changeMenuItem = null;
   private JButton jButton = null;

   final static Color DEFAULT = new java.awt.Color(255,80,80);
   final static Color CHANGE = new java.awt.Color(195,206,230);

   /**
    * This method initializes jButton   
    *    
    * @return javax.swing.JButton   
    */
   private JButton getJButton() {
      if (jButton == null) {
         jButton = new JButton() {
            protected void paintComponent(Graphics gra) {
               Graphics g = paintButtonColor(gra,this,DEFAULT);
               getUI().paint(g, this);
            }
         };
         jButton.setPreferredSize(new java.awt.Dimension(50,20));
         jButton.setMargin(new Insets(4, 4, 4, 4));
         jButton.setText("JoJo");
      }
      return jButton;
   }
   
   /**
    *
    * @param gra
    * @param button
    * @param c
    * @return
    */
   private Graphics paintButtonColor(Graphics gra, JButton button, Color c) {
      Graphics2D g = (Graphics2D) gra;
      int w = button.getWidth();
      int h = button.getHeight();
      int newH = h/5 * 2;
       GradientPaint gradientPaint = new GradientPaint(0, 0,
                                           c,
                                           0, newH,
                                           Color.WHITE,
                                           true);
      g.setPaint(gradientPaint);
      g.fillRect(0, 0, w, h);
      return g;
   }
   
   /**
    *
    *
    */
   private void changeColor() {
      Graphics g = paintButtonColor(jButton.getGraphics(),jButton, CHANGE);
      jButton.getUI().paint(g, jButton);
   }

   /**
    * This method initializes this
    *
    * @return void
    */
   private void initialize() {
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setJMenuBar(getJJMenuBar());
      this.setSize(300, 200);
      this.setContentPane(getJContentPane());
      this.setTitle("Application");
   }

   /**
    * This method initializes jContentPane
    *
    * @return javax.swing.JPanel
    */
   private JPanel getJContentPane() {
      if (jContentPane == null) {
         GridBagConstraints gridBagConstraints = new GridBagConstraints();
         gridBagConstraints.gridx = 0;
         gridBagConstraints.gridy = 0;
         jContentPane = new JPanel();
         jContentPane.setLayout(new GridBagLayout());
         jContentPane.add(getJButton(), gridBagConstraints);
      }
      return jContentPane;
   }

   /**
    * This method initializes jJMenuBar   
    *    
    * @return javax.swing.JMenuBar   
    */
   private JMenuBar getJJMenuBar() {
      if (jJMenuBar == null) {
         jJMenuBar = new JMenuBar();
         jJMenuBar.add(getFileMenu());
      }
      return jJMenuBar;
   }

   /**
    * This method initializes jMenu   
    *    
    * @return javax.swing.JMenu   
    */
   private JMenu getFileMenu() {
      if (fileMenu == null) {
         fileMenu = new JMenu();
         fileMenu.setText("File");
         fileMenu.add(getChangeMenuItem());
      }
      return fileMenu;
   }

   /**
    * This method initializes jMenuItem   
    *    
    * @return javax.swing.JMenuItem   
    */
   private JMenuItem getChangeMenuItem() {
      if (changeMenuItem == null) {
         changeMenuItem = new JMenuItem();
         changeMenuItem.setText("Chage");
         changeMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK, true));
         changeMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               changeColor();
            }
         });
      }
      return changeMenuItem;
   }
   
   /**
    * @param args
    */
   public static void main(String[] args) {
      // TODO Auto-generated method stub
      GradientButton application = new GradientButton();
      application.show();
   }

   /**
    * This is the default constructor
    */
   public GradientButton() {
      super();
      initialize();
   }
}
 
Hallo!

Schau mal hier:
Code:
 /**
  * 
  */
 package de.tutorials;
 
 import java.awt.Color;
 import java.awt.event.ActionEvent;
 import java.beans.PropertyChangeListener;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JMenu;
 import javax.swing.JMenuBar;
 import javax.swing.JMenuItem;
 
 /**
  * @author Tom
  * 
  */
 public class ButtonColorChangeExample extends JFrame {
 
 	boolean colorSwitch = false;
 
 	JButton btn;
 
 	public ButtonColorChangeExample() {
 		super("ButtonColorChangeExample");
 		setDefaultCloseOperation(EXIT_ON_CLOSE);
 
 		JMenuBar menuBar = new JMenuBar();
 		JMenu menu = new JMenu("File");
 		menuBar.add(menu);
 
 		menu.add(new JMenuItem(new AbstractAction("change color") {
 			public void actionPerformed(ActionEvent e) {
 				if (colorSwitch) {
 					btn.setBackground(Color.GREEN);
 				} else {
 					btn.setBackground(Color.YELLOW);
 				}
 				colorSwitch = !colorSwitch;
 			}
 		}));
 
 		setJMenuBar(menuBar);
 
 		btn = new JButton("Click me");
 		add(btn);
 
 		pack();
 		setVisible(true);
 	}
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 		new ButtonColorChangeExample();
 	}
 }

gruß Tom
 
HI Tom,
danke für Deine Antwort!
Ich habe nur nicht das Problem, den Hintergrung mit "setBackground" zu verändern sondern, wenn ich ihn selber zeichne, da ich ja einen Farbverlauf haben möchte und
für diesen Fall hilft mir das leider nicht weiter.
Viele Grüße
 
Kuck Dir mal die 2 Postings an vielleicht helfen Dir die weiter:
  1. Posting 1
  2. Posting 2

Kuck Dir mal dort den jeweiligen Quellcode an, da tauchte glaube ich die gleiche Frage auf Farbverlauf bei Button oder war das als Lösungsvorschlag irgendwo drin? Im Zweifelsfall hat es immer Seine Javaheit gepostet :)


Gruß

Luxor
 
Hi Luxor,
Danke für Links jedoch hilft es mir nicht so recht weiter, da ich weiss wie man einen Button mit "gradientPaint" maipuliert.
Ich möchte jedoch meinen beim Programm start definierten Button Hintergrund nach einem Aufruf eines Menüpunkten nochmals manipulieren.

So wie ich es mitlerweile herausgefunden habe, wird der Hintergrund zwar veränder.
Aber aus einem mir nicht erklärlichem Grund wird dieser gleich wieder auf die Ursprungsfarbe zurückgestellt. Ich kann mir einfach nicht erklären woran das liegt.

Viele Grüße
 
Ich habs jetzt für das Beispiel so gelöst.
Da der Button ja eine aktive Komponente ist, bette ich die Auswahl gleich bei der Konstrukion des Button mit ein.
Für das Beispiel hab ich dann einfach mal eine Boole-Variable eingebaut, die ich bei der auswahl des Menüpunktes dann
umstelle und ein repaint() ausführe. Damit erreiche ich in dem simplen Beispiel, dass gewünschte Resultat.

Nochmal Danke an die, die mir geantwortet haben.

Code:
import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.Event;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;

import javax.swing.KeyStroke;
import javax.swing.JPanel;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.GridBagConstraints;

/**
* @author
*
*/
public class gb extends JFrame {

   private JPanel jContentPane = null;
   private JMenuBar jJMenuBar = null;
   private JMenu fileMenu = null;
   private JMenuItem changeMenuItem = null;
   private JButton jButton = null;
   private boolean change = false;
   private Graphics g;
   private static gb application;

   final static Color DEFAULT = new java.awt.Color(255,80,80);
   final static Color CHANGE = new java.awt.Color(255,255,90);

   /**
    * This method initializes jButton   
    *    
    * @return javax.swing.JButton   
    */
   private JButton getJButton() {
      if (jButton == null) {
         jButton = new JButton() {
            protected void paintComponent(Graphics gra) {
            	if(change) {
            		g = paintButtonColor(gra,this,DEFAULT);
            	} else {
            		g = paintButtonColor(gra,this,CHANGE);
            	}
               getUI().paint(g, this);
            }
         };
         jButton.setPreferredSize(new java.awt.Dimension(50,20));
         jButton.setMargin(new Insets(4, 4, 4, 4));
         jButton.setText("JoJo");
      }
      return jButton;
   }
   
   /**
    *
    * @param gra
    * @param button
    * @param c
    * @return
    */
   private Graphics paintButtonColor(Graphics gra, JButton button, Color c) {
      Graphics2D g = (Graphics2D) gra;
      int w = button.getWidth();
      int h = button.getHeight();
      int newH = h/5 * 2;
 
      GradientPaint gradientPaint = new GradientPaint(0, 0,
                                           c,
                                           0, newH,
                                           Color.WHITE,
                                           true);
      g.setPaint(gradientPaint);
      g.fillRect(0, 0, w, h);
      
      return g;
   }
   
   /**
    * This method initializes this
    *
    * @return void
    */
   private void initialize() {
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setJMenuBar(getJJMenuBar());
      this.setSize(300, 200);
      this.setContentPane(getJContentPane());
      this.setTitle("Application");
   }

   /**
    * This method initializes jContentPane
    *
    * @return javax.swing.JPanel
    */
   private JPanel getJContentPane() {
      if (jContentPane == null) {
         GridBagConstraints gridBagConstraints = new GridBagConstraints();
         gridBagConstraints.gridx = 0;
         gridBagConstraints.gridy = 0;
         jContentPane = new JPanel();
         jContentPane.setLayout(new GridBagLayout());
         jContentPane.add(getJButton(), gridBagConstraints);
      }
      return jContentPane;
   }

   /**
    * This method initializes jJMenuBar   
    *    
    * @return javax.swing.JMenuBar   
    */
   private JMenuBar getJJMenuBar() {
      if (jJMenuBar == null) {
         jJMenuBar = new JMenuBar();
         jJMenuBar.add(getFileMenu());
      }
      return jJMenuBar;
   }

   /**
    * This method initializes jMenu   
    *    
    * @return javax.swing.JMenu   
    */
   private JMenu getFileMenu() {
      if (fileMenu == null) {
         fileMenu = new JMenu();
         fileMenu.setText("File");
         fileMenu.add(getChangeMenuItem());
      }
      return fileMenu;
   }

   /**
    * This method initializes jMenuItem   
    *    
    * @return javax.swing.JMenuItem   
    */
   private JMenuItem getChangeMenuItem() {
      if (changeMenuItem == null) {
         changeMenuItem = new JMenuItem();
         changeMenuItem.setText("Chage");
         changeMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK, true));
         changeMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	change = true;
            	repaint();
            }
         });
      }
      return changeMenuItem;
   }

   /**
    * @param args
    */
   public static void main(String[] args) {
      gb application = new gb();
      application.show();
   }

   /**
    * This is the default constructor
    */
   public gb() {
      super();
      initialize();
   }
}

Viele Grüße
 
Zurück