# JButton überschreiben



## ForenDaddy (3. Mai 2011)

ich möchte meinem jbutton einen eigenen look geben.
nach der recherche per google und hier im forum sollte es mit dem überschreiben von jbutton eigentlich nicht so schwer sein.
*Ziel:* ein bestimmter button soll dauerhaft eine andere farbe bekommen, wenn ein bestimmter zustand erreicht wurde.
es tut sich jedoch einfach nichts.
wie gesagt, ich will nur die farbe ändern.
imageicons sind leider keine lösung.

habe auch schon mit uimanager experimentiert (kleine testzeile (17) in der main klasse).
damit kann ich die farbe ändern, aber eben nur global für alle buttons und auch nur für den moment, in dem er gedrückt wird (Button.select).
unter rgagnon.com ist mir allerdings nichts ins auge gefallen, das mir persönlich nützlich wäre.

look&feel hatte ich mir auch mal angesehen, aber nicht schlau draus geworden. zumindest in bezug auf mein problem.

nach 2 tagen geht mir langsam die luft aus und ich weiss nicht mehr, was ich noch testen soll oder kann.

*Meine Button Klasse:*

```
package fcp.GUI;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JButton;

public class FCPbutton extends JButton {

    public FCPbutton( String text) {
        super( text );
        setContentAreaFilled(false);
    }

    /** @override */
    public void paintComponent( Graphics g ) {
        super.paintComponent(g);
        g.setColor( Color.RED );
    }
}
```

*Meine pseudo "Main"-Klasse damit man was sieht:*

```
package fcp;
import java.awt.*;
import javax.swing.*;

public class JButtons extends JFrame {
  public static void main(String[] args) {
    new JButtons();
  }

  public JButtons() {
    super("My Button");
    Container content = getContentPane();
    content.setLayout(new FlowLayout());
    FCPbutton button1 = new FCPbutton("hallo");

    UIManager.put( "Button.select", Color.RED );
    
    content.add(button1);
    pack();
    setVisible(true);
  }
}
```


----------



## Michael... (3. Mai 2011)

ForenDaddy hat gesagt.:


> *Ziel:* ein bestimmter button soll dauerhaft eine andere farbe bekommen, wenn ein bestimmter zustand erreicht wurde.


Kannst Du das ein bisschen präzisieren?
Denn ich vermute mal 
	
	
	
	





```
button.setBackground(Color.RED);
```
 sobald der Zustand erreicht ist, ist nicht die Lösung die Du Dir erhoffst.


----------



## ForenDaddy (4. Mai 2011)

exakt. setbackground verändert die farbe hinter dem button.
ich möchte aber die farbe des buttons selber ändern.
normalerweise ist das ja dieses modisch schicke mausgrau.
bei mir soll es ein rot bzw. grün sein.

ich habe eigentlich gehofft dass das setcolor etwas daran ändern würde.

für mich ist halt wichtig, dass es kein bild ist, sondern dass der button immer frisch gerendert wird, weil die buttons ständig ihre größe und form ändern.


----------



## ARadauer (4. Mai 2011)

ForenDaddy hat gesagt.:


> ich habe eigentlich gehofft dass das setcolor etwas daran ändern würde.
> 
> 
> > > public void paintComponent( Graphics g ) {
> ...


----------



## ForenDaddy (4. Mai 2011)

hab ich auch schon mal anders herum versucht.
selbe wirkung, nämlich leider keine.

witzigerweise hatte jemand in einem anderen forum, genau das bei einem so vorgeschlagen.
deshalb hab ich es so rum gelassen.

ich frag mal anders rum.
ist das was ich prinzipiell mache richtig?
woher weiss ich, was ich zu "tunen" habe, damit es gegebenenfalls so aussieht wie ich will?


----------



## Michael... (4. Mai 2011)

ForenDaddy hat gesagt.:


> exakt. setbackground verändert die farbe hinter dem button.
> ich möchte aber die farbe des buttons selber ändern.


Wenn ich bei einem Button setBackground(Color.RED) setzte, dann ist bei mir der Button rot.
Was meinst Du mit "hinter dem Button"?
Nutzt Du ein spezielles LaF?


----------



## ForenDaddy (4. Mai 2011)

hast recht. das ganze hier, ist eine testanwendung, in der ich die l&f aus dem original programm vergessen habe.
mit der l&f klappt das mit dem hintergrund nicht (siehe zeile 14).
aber auch mit hintergrund und ohne l&f, ist der button einfach nur rot, lässt aber die nette "3D" optik vermissen.

*upgedatete main methode:*

```
package fcp;
import java.awt.*;
import javax.swing.*;

public class JButtons extends JFrame {
  public static void main(String[] args) {
    new JButtons();
  }

  public JButtons() {
    super("Using Buttons");

    try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
	} catch(Exception e) {
            System.out.println("Error setting native LAF: " + e);
	}

    Container content = getContentPane();
    content.setLayout(new FlowLayout());
    FCPbutton button1 = new FCPbutton("hallo");
    button1.setText( "test" );
    button1.setBackground( Color.RED );
    //UIManager.put( "Button.select", Color.RED );
    
    content.add(button1);
    pack();
    setVisible(true);
  }
}
```


----------



## Michael... (4. Mai 2011)

Wenn der 3D Effekt erhalten bleiben soll, fallen mir da spontan nur folgende Möglichkeiten ein:
1. Du schreibst eine eigene ButtonUI und weisst sie den betreffenden Buttons zu (könnte aufwendig werden)
2. Du machst die Buttons mit setContentAreaFilled(false) transparent und setzt sie auf ein JPanel auf dem Du den 3D Effekt selber malst.
3. Du schreibst Dir eine eigene Buttonklasse (z.B. auf Basis einer JComponent mit MouseListener)

Wobei mir jetzt beim Schreiben Variante 3 besser gefällt als Variante 2


----------



## ForenDaddy (4. Mai 2011)

die variante 3 ist, so oder so ähnlich, das was ich eigentlich bezweckte.
ich dachte nur, es reicht den jbutton zu nehmen und lediglich eine komponente zu verändern, die farbe.

puh, ok.
mal gegenfrage, woher weisst du jetzt, dass du eine jcomponent nehmen musst und keinen jbutton?


----------



## Michael... (4. Mai 2011)

Kommt auf den Einsatzzweck und die Verwendungsart an.
In dem Fall würde ich auf Basis einer JComponent und MouseListener den Button selbst zusammenbauen, da man mit den Methoden des MouseListeners ja das Verhalten ausreichend nachstellen kann.
Denke das ist einfacher als an JButton, LaF rumzuschrauben oder mittels AbstractButton was eigenes zu definieren.

So ein Objekt kann dann allerdings nicht als "Button" verbaut/verwendet werden und wenn man diesem auch noch einen ActionListener zuweisen wollte, müsste man das auch noch implementieren.


----------



## ForenDaddy (5. Mai 2011)

ich bin jetzt gerade schwer am überlegen, ob ich den farbigen button wirklich wirklich brauche 
hört sich alles kompliziert und für den kleinen effekt nach sehr viel arbeit an.

hat das eigentlich noch nie jemand selbst gemacht?
ich bin über google zumindest noch nie über einen brauchbaren beispielcode gestolpert.
vielleicht auch nach den falschen begriffen gesucht, wer weiss.


----------



## Michael... (5. Mai 2011)

ForenDaddy hat gesagt.:


> hat das eigentlich noch nie jemand selbst gemacht?


Aussehen und Verhalten von Komponenten wird überwiegend über das verwendete LaF bestimmt.
Je nach Komplexität der Komponenten und der zur Verfügung gestellten Methoden hat der "Verwender" noch gewisse Einflussmöglichkeiten.


----------



## ForenDaddy (5. Mai 2011)

die einflussmöglichkeiten sind leider sehr sehr begrenzt.
was somit schnell viel arbeit nach sicht zieht. selbst für einfache dinge.
und farbe ist wohl keine kernphysik.


----------



## Michael... (5. Mai 2011)

ForenDaddy hat gesagt.:


> und farbe ist wohl keine kernphysik.


Grundsätzlich nein, aber das LaF ist ja auch eine philosophische Frage ;-)


----------



## ForenDaddy (6. Mai 2011)

kann man eigentlich ein imageicon verwenden und die schrift wie beim normalen jbutton darüber projezieren? momentan wird jeder jbutton bei mir mit dem imageicon überlagert. settext sachen sind somit nicht sichtbar. so könnte ich mir meine eigenen buttons basteln, den text aber zur laufzeit immer wieder bequem verändern. und ich könnte den button einfach skalieren lassen, die schrift würde aber trotzdem immer korrekt aussehen.


in wie weit ist L&F eine philosophische frage?
wenn die software unter einem windows system laufen soll, ist es einfach nur praktisch für den benutzer, wenn es auch nach windows aussieht.
das fördert die akzeptanz und einfache benutzung, weil die erwartungshaltung erfüllt wird.

abgesehen davon sind die original java buttons nicht wirklich schön, um es höflich auszudrücken.
sie haben leider keinen wow effekt, weil sie sooo total neu und stylisch aussehen.
und habe leider auch keinen nostalgie faktor, wie z.b. zu 8bit zeiten.


----------



## ForenDaddy (9. Mai 2011)

suche noch eine antwort auf die frage, ob imagicon und text eines buttons gleichzeitig anzeigbar sind (siehe oben).


----------

