Nimbus Look And Feel Button textForeground

  • Themenstarter Themenstarter Vorby
  • Beginndatum Beginndatum
V

Vorby

Gast
Hallo ihr lieben,

ich vernde das schöne Look And Feel und wollte eigenltich wenn ich den Button drücke die Text Farbe ändern.
Alles Funktioniert nur das nicht.

z.b.
properties.put("Button[Default+Pressed].textForeground", Color.RED);
sollt gehen. tut sich nix.

jemand eine Idee?

2. Frage wäre - ist es denn möglich wenn ich drücke den Text BOLD zu machen? Also anstelle oder gleichzeitig BOLD und COLOR.

Wäre super wenn das jemand wüsst ich hab mich schon tot gego...

Beste Grüße
 
Wieso nimmst du keine ActionListener?
Hier mal auf die Schnelle eine kleine Testklasse mit einem riesigen Button! 😉
Java:
public class test extends JFrame implements ActionListener{
   private JButton btn;
   public test(){
      super();
      init();
      setLocation(200,100);
      setSize(640,480);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setVisible(true);
   }
   private void init(){
      btn= new JButton("Drück mich!");
      btn.addActionListener(this);
      add(btn);
      
   }
   @Override
   public void actionPerformed(ActionEvent e) {
      // TODO Auto-generated method stub
      if(e.getSource()instanceof JButton){
//Wenn Farbe nicht Rot dann mach es Rot und setze auf BOLD
         if(btn.getForeground()!= Color.red){
            btn.setForeground(Color.red);
            btn.setFont(btn.getFont().deriveFont(Font.BOLD));
         }else{
            btn.setForeground(Color.black);
            btn.setFont(btn.getFont().deriveFont(Font.PLAIN));
         }
        

      }
      
   }
}
 
Wieso nimmst du keine ActionListener?
Ich habe es so verstanden, dass sich die Schrift des Buttons nur ändern soll, während er gedrückt ist.

properties.put("Button[Default+Pressed].textForeground", Color.RED);
Das in den eckigen Klammern soll nur dokumentieren, worauf die Property Einfluss hat. Diese also weglassen:
Java:
properties.put("Button.textForeground", Color.RED);

2. Frage wäre - ist es denn möglich wenn ich drücke den Text BOLD zu machen? Also anstelle oder gleichzeitig BOLD und COLOR.
Einen sauberen Weg über den UIManager kenne ich nicht. Gehen würde es mit einer Unterklasse von JButton oder einer eigenen ButtonFactory mit diesem Code:
Java:
button.addChangeListener(new ChangeListener() {
	@Override
	public void stateChanged(final ChangeEvent e) {
		button.setFont(button.getFont().deriveFont(button.getModel().isPressed() /* oder isArmed() */ ? Font.BOLD : Font.PLAIN));
	}
});
 
danke für die eXtrem schnelle Antworten

Ich habe es so verstanden, dass sich die Schrift des Buttons nur ändern soll, während er gedrückt ist.

genau richtig

Das in den eckigen Klammern soll nur dokumentieren, worauf die Property Einfluss hat. Diese also weglassen:
Java:
properties.put("Button.textForeground", Color.RED);
genau das hat gar kein effekt bei mir & ließt sich auch als wäre es dann immer rot?
Nimbus Defaults (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)
und aus diesem link zu erkennen gibt es auch: Button[Default+Pressed].textForeground
Aber hier kann ich auch eintragen was ich will - nichts zu erkennen.

Einen sauberen Weg über den UIManager kenne ich nicht. Gehen würde es mit einer Unterklasse von JButton oder einer eigenen ButtonFactory mit diesem Code:
Java:
button.addChangeListener(new ChangeListener() {
	@Override
	public void stateChanged(final ChangeEvent e) {
		button.setFont(button.getFont().deriveFont(button.getModel().isPressed() /* oder isArmed() */ ? Font.BOLD : Font.PLAIN));
	}
});
Ok dann ist das nicht mehr von Interresse für mich


Genauso wie ein andere ActionListener uninterressant sind, da ich mit einem Eintrag alle Buttons abfrühstücken möchte.
Oder noch anders gesagt ich habe die Properites alle ausgelagert in einer Datei nach dem Motto:

Button[Default+Focused+MouseOver].backgroundPainter: bild.png

so kann man das ändern ohne jemals an den Code zu müssen.
Deswegn will ich auch den gedrückten Button den Text mit einer anderen Fabre versehen über das LookAndFeel: 🙂
 
Also das hier Funktioniert
properties.put("Button[MouseOver+Pressed].textForeground", Color.RED);
genau dann, wenn nur das angegeben wird.
Jetzt wird beim drücken der Text rot.

Anscheind wird wenn ich alles in meiner Prop. lade irgendwas überschrieben, sieht nach fummeln aus.

Sollte dennoch jemand Tips haben - immer damit hier.

Poste natürlich eine Lösung wenn ich eine habe.
 
Also wenn man sowas macht

Java:
properties.put("Button.textForeground", Color.BLUE);
properties.put("Button[MouseOver+Pressed].textForeground", Color.RED);
dann "dominiert" das blau keine Reaktion auf MouseOver+Pressed

nur
Java:
 properties.put("Button[MouseOver+Pressed].textForeground", Color.RED);
dann Funktioniert das. Aber ich kann nicht mehr meine Schriftfarbe wählen bei standard

:-(
 
Ich verstehe hier auch nichts mehr.
Meine Tests:
  • Code:
    Button.textForeground
    geht (ist immer rot)
  • Code:
    Button[Default].textForeground
    geht nicht
  • Code:
    Button[Pressed].textForeground
    geht (ist im gepressten Zustand rot)
  • Code:
    Button[Default+Pressed].textForeground
    geht nicht
  • Code:
    Button[MouseOver+Pressed].textForeground
    geht halbwegs (bewegt man die Maus im gepressten Zustand raus und wieder rein, wird die Schrift nicht wieder rot; wohl Nimbus-Bug?)

Mit den Paintern konnte ich bisher nichts anfangen. Scheint mir so, als würden diese nie gebraucht werden.
 
Ich verstehe hier auch nichts mehr.
Meine Tests:
  • Code:
    Button.textForeground
    geht (ist immer rot)
  • Code:
    Button[Default].textForeground
    geht nicht
  • Code:
    Button[Pressed].textForeground
    geht (ist im gepressten Zustand rot)
  • Code:
    Button[Default+Pressed].textForeground
    geht nicht
  • Code:
    Button[MouseOver+Pressed].textForeground
    geht halbwegs (bewegt man die Maus im gepressten Zustand raus und wieder rein, wird die Schrift nicht wieder rot; wohl Nimbus-Bug?)

Mit den Paintern konnte ich bisher nichts anfangen. Scheint mir so, als würden diese nie gebraucht werden.

genau: bei mir folgendes:
Java:
properties.put("Button[Disabled].textForeground", Color.BLUE);
properties.put("Button.textForeground", Color.RED);

nun wenn nun zwei Button hast, einer davon Disabled sollte die schrift rot blau sein. Ist aber nicht sondern RED weil alle textForeground rot bekommen. Wie kann man also sagen alle Rot außer Disabled buttons haben blau?

Nicht nacheinander versuchen, einzeln funktioniert ja alles
 

Zurück
Oben