Farbwechsel JButton mit Graphics2D

Status
Nicht offen für weitere Antworten.

ZZHAT

Mitglied
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();
	}
}
 
N

na-oma

Gast
hab mal in paintButtonColor vor GradientPaint gradientPaint = new GradientPaint
gesetzt:

try {Thread.sleep(3000);}catch(InterruptedException e) {}

da hab ich gesehen, dass der Butten beim Ändern erst Weiss/hell wird (wie gewünscht) und dann wieder rot eingefärbt wird.

in changeColor() rufst du erst paintButtonColor, dann scheinst du aber den Button wieder per jButton.getUI().paint zu übermalen, oder?
 

ZZHAT

Mitglied
Hi na-oma,
deine Beobachtung ist richtig!
Ich hatte es eigentlich so verstanden, dass ich den Hintergrund neu Zeichnen muss daher habe ich
"jButton.getUI().paint(g, jButton);" eingefüht.
Aber selbst, wenn ich die Zeile rausnehme, wird der Hintergrund wieder auf rot umgestellt.
Ich muss zugeben, dass ich das mit dem Zeichen noch nicht so recht kapiert habe.
Hoffe mir kann geholfen werden, dass Problem in den Griff zu bekommen.

Viele Grüße

//EDIT:
"jButton.getUI().paint(g, jButton);" brauche ich um den Buttontext zu erhalten.
 

ZZHAT

Mitglied
Hi L-ectron-X,
das macht keinen Sinn, weil der Txt ja schon da ist aber er durch die Grafik überzeichnet ist.
Ich habe "jButton.getUI().paint(g, jButton);" so verstanden, das ich den schon existierenden Button
so wieder darüber legen müss. Zumindest ist es die Einiege Art, wie ich den Text auf der Grafik zu erscheinen bringe.
Nur hilfts mir nicht, wenn ein augenblick später das der Button in seiner Uhrsprungsgestallt wieder dargestellt wird.

Also der Button erscheint nach den aufruf von "changeColor()" zwar für einen Augenblick richtig jedoch wechselt es er dann wieder zur Ursprungsdarstellung.
Ich verstehts einfach nicht warum!!
Ich weiss nicht was ich da falsch mache..

Viele Grüße
 

ZZHAT

Mitglied
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
 
N

na-oma

Gast
diese lösung würde ich als sauberer einschätzen.

um das ganze zu verfeinern:

statt boolean setzt du in actionperformed die genaue farbe, die du dann zeichnest:
im button:
paint(...current_color);
im menu:
current_color = WHITE; oder
current_color = new Color(...)


da könnte man auch noch eingabefelder machen, wo man die farbe einstellt oder so :)
 

ZZHAT

Mitglied
Hi na-oma!
Stimmt, kann man alles machen.
Ich für mein Teil brauche es auch etwas anders als in dem Beispeil.
Dies das war mir aber zu umstäntilch hier zu posten, daher hatte ich es mit einem simplen Beispiel dargestellt.
Hieran kann man gut erkennen, wie flexibel man sich das Ganze jetzt auf seine Bedürfnisse anpassen kann.

Viele Grüße
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Hilde22 Neu Start JButton einfügen Java Basics - Anfänger-Themen 2
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
M JButton setBackground() färbt nicht den ganzen Knopf Java Basics - Anfänger-Themen 4
C JButton reagiert nicht auf actionListener Java Basics - Anfänger-Themen 15
G jButton führt Main Methode nicht richtig aus Java Basics - Anfänger-Themen 3
J Jbutton blinkt Java Basics - Anfänger-Themen 5
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
E JButton und JTextField Java Basics - Anfänger-Themen 1
V_Fynn03 Erste Schritte JButton funktioniert nicht trotz richtiger Methode. Java Basics - Anfänger-Themen 17
J Erste Schritte if Abfrage von JButton in 2. Klasse Java Basics - Anfänger-Themen 27
J Erste Schritte Actionlistener für tbar/ JButton Java Basics - Anfänger-Themen 15
krgewb Icon von JButton ändern Java Basics - Anfänger-Themen 1
P JButton -Arrays Java Basics - Anfänger-Themen 4
A JButton in anderer Klasse bearbeiten. Java Basics - Anfänger-Themen 2
L Erste Schritte JButton reagiert nicht Java Basics - Anfänger-Themen 5
S Bild über JButton legen Java Basics - Anfänger-Themen 3
V Einem JButton anweisungen geben Java Basics - Anfänger-Themen 4
D Methoden JButton und JLabel in einer Methode erstellen Java Basics - Anfänger-Themen 5
F Interface JButton von anderer Klasse hinzufügen Java Basics - Anfänger-Themen 2
J JButton macht was er will Java Basics - Anfänger-Themen 3
D JButton soll Farbe von JTextfield ändern Java Basics - Anfänger-Themen 5
H JButton - Wechsel der Textfarbe alle 500ms Java Basics - Anfänger-Themen 10
G KeyListener und JButton vertragen sich nicht Java Basics - Anfänger-Themen 1
N JButton anpassen Java Basics - Anfänger-Themen 3
S JButton soll für bestimmte Zeit verschwinden Java Basics - Anfänger-Themen 5
schoenosrockos JButton füllt immer das ganze frame Java Basics - Anfänger-Themen 1
D JButton in JDialog mit Action belgen Java Basics - Anfänger-Themen 6
V JButton einer anderen Klasse übergeben? Java Basics - Anfänger-Themen 6
F JButton [] mit Werten hinterlegen Java Basics - Anfänger-Themen 10
M Code um per jButton ein neues Fenster zu öffnen Java Basics - Anfänger-Themen 3
A weiter JButton Fehler Java Basics - Anfänger-Themen 3
W JTable mit einem JButton-Array füllen Java Basics - Anfänger-Themen 4
S JCombobox und JButton verknüpfen Java Basics - Anfänger-Themen 6
V wie kann ich eine Schleife pausieren, bis ein Jbutton gedrückt wird ? Java Basics - Anfänger-Themen 17
N Erste Schritte JButton reagiert nur einmal. Java Basics - Anfänger-Themen 12
S JButton Java Basics - Anfänger-Themen 2
A Farben wechseln mit JButton Java Basics - Anfänger-Themen 2
S Farbe eine Zeile in JTable ändern, wenn JButton geklickt wurd Java Basics - Anfänger-Themen 4
F Funktion eines JButton in einen Vektor verlagern Java Basics - Anfänger-Themen 4
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
A Labels Inner JButton Event Erstellbar? Java Basics - Anfänger-Themen 3
K JButton alles zurücksetzen Java Basics - Anfänger-Themen 1
U JButton: Beschriftung ueber Variable zuweisen Java Basics - Anfänger-Themen 6
S JButton erscheint erst bei Mouseover Java Basics - Anfänger-Themen 10
S JButton mit ActionListener Java Basics - Anfänger-Themen 5
S JDK installieren JButton BorderPoints?! Java Basics - Anfänger-Themen 7
E Problem mit erben von JButton Java Basics - Anfänger-Themen 7
J Bei Hinzufügen von JButton Programm langsam Java Basics - Anfänger-Themen 3
J Verknüpfung von JButton to JTextField Java Basics - Anfänger-Themen 4
S Jbutton per Passworteingabe aktivieren Java Basics - Anfänger-Themen 2
G über JButton Action einen anderen Button verändern Java Basics - Anfänger-Themen 7
H JButton - Icon(.png) aus resources laden Java Basics - Anfänger-Themen 23
M Hintergrundbild für JButton Java Basics - Anfänger-Themen 6
A jbutton - icon linksbündig, text zentriert Java Basics - Anfänger-Themen 10
M Input/Output JFrame mit JButton und JTextfield Java Basics - Anfänger-Themen 114
J Hilfe bei JButton Java Basics - Anfänger-Themen 6
A JButton[] und String[] in doppelter For-Schleife Java Basics - Anfänger-Themen 4
W JButton in gleiche Größe bringen Java Basics - Anfänger-Themen 4
pg1337 JButton zuschneiden Java Basics - Anfänger-Themen 3
T Modales JDialog schliessen mit JButton Java Basics - Anfänger-Themen 2
D JButton Array setBackground Java Basics - Anfänger-Themen 2
F JButton wie selektierter JTabbebPane-Header Java Basics - Anfänger-Themen 7
G jButton bei Klick String +1 Java Basics - Anfänger-Themen 5
C OOP Java JButton mit Funktion belegen Java Basics - Anfänger-Themen 3
S JButton wird nicht angezeigt Java Basics - Anfänger-Themen 14
C JButton.getIcon() != null Java Basics - Anfänger-Themen 3
E JButton-Text wird in Schleife nicht geändert Java Basics - Anfänger-Themen 4
F welches Layout für JButton-Liste verwenden Java Basics - Anfänger-Themen 6
T JButton Text ändern Java Basics - Anfänger-Themen 4
L JButton erscheint nur mit pack() Java Basics - Anfänger-Themen 3
U Passwort auf JButton setzen. Java Basics - Anfänger-Themen 2
E JButton Hintergrund / Rahmen entfernen? Java Basics - Anfänger-Themen 4
L Bild auf einem JButton Java Basics - Anfänger-Themen 4
K JButton.setText Problem Java Basics - Anfänger-Themen 6
M JButton und DisabledIcon Java Basics - Anfänger-Themen 2
K jButton zur Laufzeit hinzufügen Java Basics - Anfänger-Themen 22
A GUI - JButton problem! Java Basics - Anfänger-Themen 5
M JButton selbst nachprogrammieren Java Basics - Anfänger-Themen 3
A JButton Textrahmen Java Basics - Anfänger-Themen 7
A Platzierung eines JButton Java Basics - Anfänger-Themen 4
D JButton oder ImageIcon klickt "langsam" Java Basics - Anfänger-Themen 5
E JButton klassenübergreifend nutzen? Java Basics - Anfänger-Themen 6
R Liste graphischer Objekte z.B. JButton dynamisch erstellen Java Basics - Anfänger-Themen 13
J JList Inhalt nach JButton Klick aktualisieren Java Basics - Anfänger-Themen 8
S JButton trotz Box-Layout skalieren Java Basics - Anfänger-Themen 6
P JButton identifizieren Java Basics - Anfänger-Themen 8
K Funktion zu einem JButton hinzufügen Java Basics - Anfänger-Themen 27
D HTML Text von jButton disablen Java Basics - Anfänger-Themen 2
E Auf JButton in Arraylist zugreifen Java Basics - Anfänger-Themen 6
E Andere Form eines JButton Java Basics - Anfänger-Themen 17
A JButton ActionListener nach einmaligem Ausführen zurücksetzen Java Basics - Anfänger-Themen 13
B JButton Größe einstellen? Java Basics - Anfänger-Themen 3
E Zeilenumbruch in JButton mit Variable Java Basics - Anfänger-Themen 2
A JButton erscheint nicht (BlueJ) Java Basics - Anfänger-Themen 2
M JButton sieht komisch aus :-) Java Basics - Anfänger-Themen 5
B JPanel über JButton umändern Java Basics - Anfänger-Themen 9
D JButton transparent bekommen? Java Basics - Anfänger-Themen 5
H JButton Unsichtbar Java Basics - Anfänger-Themen 7
R JTextField mittels JButton in Konsole ausgeben Java Basics - Anfänger-Themen 2
J Variable die bei JButton Clicks mitzählt Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben