# jButton mit ImageIcon & MouseListener



## Dr.Gibble (14. Mai 2008)

Hallo miteinander,

ich möchte mir gerne eine Gui basteln die wie das Einstellungsmenü von Netbeans aussieht.
unter Netbeans: _Tools -> Options_







Bis jetzt sieht auch alles sehr schick aus nur bekomme ich diesen blauen Hintergrund nicht so hin wie er oben zu sehen ist wenn die Maus den Focus darauf hat.

Bisher verwende ich die Listener "MouseEntered", "MouseExited" und "MousePressed" dafür die mir die Werte je nach Bedarf ändern.

```
private void buttonMouseEntered(java.awt.event.MouseEvent evt) {
    generalButton.setBackground(new java.awt.Color(112, 179, 241));
    generalButton.setBorderPainted(true);
}

private void buttonMouseExited(java.awt.event.MouseEvent evt) {
    generalButton.setBackground(java.awt.Color.white);
    generalButton.setBorderPainted(false);
}

private void buttonMousePressed(java.awt.event.MouseEvent evt) {
    generalButton.setBackground(new java.awt.Color(68, 137, 202));
    generalButton.setBorderPainted(true);
}
```
 Leider ändert sich auf diese Weise der Hintergrund ständig sobald man mit der Maus darüber kommt.
Wenn ein Menüpunkt aber aktiv ist soll die dunkle Farbe beibehalten werden und sich nur die anderen Buttons dementsprechend ändern.

Hat vielleicht jemand einen Tip für mich wie man diesen Schönheitsfehler behebt oder es sogar komplett anders/besser machen könnte?

Vielen Dank im Voraus

greetz derDoc


----------



## MiDniGG (14. Mai 2008)

Machst halt noch nen boolean der sagt markiert true/false und frägst den in MouseEntered ab..


----------



## Dr.Gibble (14. Mai 2008)

Irgendwie komme ich nicht weiter.

Ich hatte es erst versucht mit einer allgemeinen MouseListenerKlasse für alle Buttons aber das lässt Netbeans nicht zu da ich die Gui mit dem Builder erstellt habe.

Jetzt habe ich halt in jedem eigenen Listener einen Verweis auf die jeweilige Operation "mouseEntered, mouseExited & mouseClicked" geschrieben und übergebe ihm den "MouseEvent event" mit.

Aber leider habe ich keine Möglichkeit gefunden den deklarierten Namen des Button abzufragen?
Die Buttons heissen ja bei mir "generalButton", "chartButton", "tableButton" etc und tragen jeweils einen Namen + Icon.


```
//generalButton
        generalButton.setBackground(java.awt.Color.white);
        generalButton.setFont(generalButton.getFont());
        generalButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/qRegelkarte/ui/img/32/config32.png"))); // NOI18N
        generalButton.setText("Allgemein");
        generalButton.setToolTipText("");
        generalButton.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        generalButton.setBorderPainted(false);
        generalButton.setFocusable(false);
        generalButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        generalButton.setMaximumSize(new java.awt.Dimension(100, 50));
        generalButton.setMinimumSize(new java.awt.Dimension(100, 50));
        generalButton.setPreferredSize(new java.awt.Dimension(100, 60));
        generalButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        generalButton.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                generalButtonMouseClicked(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                generalButtonMouseEntered(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                generalButtonMouseExited(evt);
            }
        });
        menuPanel.add(generalButton);

//Listener
private void generalButtonMouseEntered(java.awt.event.MouseEvent evt) {
    mouseEntered(evt);
}

private void generalButtonMouseExited(java.awt.event.MouseEvent evt) {
    mouseExited(evt);
}

private void generalButtonMouseClicked(java.awt.event.MouseEvent evt) {
    mouseClicked(evt);
}
```
... und dies für jeden Button.


```
//Operationen
private void mouseEntered(MouseEvent event) 
{
    JButton b = (JButton) event.getSource();
    System.out.println("Button: " + b.getName());

    while (isActive != true)
    {
        generalButton.setBackground(new java.awt.Color(112, 179, 241));
        generalButton.setBorderPainted(true);
    }
}
private void mouseExited(MouseEvent event) 
{
    System.out.println(event.paramString());

    //event.getButton().setBackground(java.awt.Color.white);
    //event.getComponent().setBorderPainted(false);
}

private void mouseClicked(MouseEvent event)
{
    generalButton.setBackground(new java.awt.Color(68, 137, 202));
    generalButton.setBorderPainted(true);
}
```

Jetzt bräuchte ich ja über den MouseEvent den Namen des Buttons (nicht den TextName) um zu unterscheiden welcher Button gedrückt wurde und um die Werte zu ändern damit die Operationen dynamisch auf alle Buttons funktionieren.
Statt: _generalButton.setBorderPainted(true);_ sollte dann stehen: _derAktuellAktiveButton.setBorderPainted(true);_


----------



## Dr.Gibble (14. Mai 2008)

Ich dachte ich könnte es folgendermassen lösen aber leider lag ich damit falsch.

Ich habe jedem jButton den ActionCommand des eigenen Variablennamen gegeben und wollte folgendermassen damit arbeiten:

```
private void mouseEntered(MouseEvent evt) 
{
    JButton b = (JButton) evt.getSource();
    String name = b.getActionCommand();
    
    name.setBackground(new java.awt.Color(112, 179, 241));
    name.setBorderPainted(true);
}
```
Leider geht das so nicht und der Compiler meckert wegen dem "name"

Hat vielleicht noch jemand eine andere Idee wie ich doch noch zu einer sinnvollen Lösung komme?


----------



## Dr.Gibble (14. Mai 2008)

So einfach und dennoch bin ich nicht darauf gekommen.

Ich brauche den ActionCommand gar nicht da ich mir mit dem EventListener ja immer direkt den ganzen Button übergebe. Nun habe ich es wie folgt gelöst und es funktioniert prima:


```
private JButton activeButton, markerButton;

generalButton = new javax.swing.JButton();
generalButton.setBackground(java.awt.Color.white);
        generalButton.setFont(generalButton.getFont());
        generalButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/qRegelkarte/ui/img/32/config32.png"))); // NOI18N
        generalButton.setText("Allgemein");
        generalButton.setToolTipText("");
        generalButton.setActionCommand("generalButton");
        generalButton.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        generalButton.setBorderPainted(false);
        generalButton.setFocusable(false);
        generalButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        generalButton.setMaximumSize(new java.awt.Dimension(100, 50));
        generalButton.setMinimumSize(new java.awt.Dimension(100, 50));
        generalButton.setPreferredSize(new java.awt.Dimension(100, 60));
        generalButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        generalButton.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                generalButtonMouseEntered(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                generalButtonMouseExited(evt);
            }
        });
        generalButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                generalButtonActionPerformed(evt);
            }
        });
        menuPanel.add(generalButton);


//MouseButtonListener
private void generalButtonMouseEntered(java.awt.event.MouseEvent evt) {                                           
    mouseEntered(evt);
}                                          

private void generalButtonMouseExited(java.awt.event.MouseEvent evt) {                                          
    mouseExited(evt);
}                                         

private void generalButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    buttonActionPerformed(evt);
}
```


```
private void mouseEntered(MouseEvent evt) 
{
    activeButton = (JButton) evt.getSource();
    
    if ( markerButton != activeButton )
    {
        activeButton.setBackground(new java.awt.Color(112, 179, 241));
        activeButton.setBorderPainted(true);
    }
}

private void mouseExited(MouseEvent evt) 
{
    activeButton = (JButton) evt.getSource();
    
    if ( markerButton != activeButton )
    {
        activeButton.setBackground(java.awt.Color.white);
        activeButton.setBorderPainted(false);
    }
}

private void buttonActionPerformed(ActionEvent evt)
{
    //hole den Button der das Event ausgelöst hat
    activeButton = (JButton) evt.getSource();
    
    //setze neue Werte für den aktiven Button
    activeButton.setBackground(new java.awt.Color(68, 137, 202));
    activeButton.setBorderPainted(true);
    
    if ( markerButton != null)
    {
        //setze diesen wieder auf die Ursprungswerte
        markerButton.setBackground(java.awt.Color.white);
        markerButton.setBorderPainted(false);
    }
   
    //übergeben den aktiven Button an den marker Button
    markerButton = activeButton;
}
```


----------



## Dr.Gibble (2. Jul 2008)

Hallo miteinander,

ich benutze mein oben geschildertes Design jetzt schon seid einiger Zeit im Projekt und bin auch sehr damit zufrieden. 

Leider muss ich jetzt eine Option zur Verfügung stellen die das gesamte LookandFeel der GUI mit diversen freien Designs verändert.
Realisieren lässt sich das ganze ja sehr einfach mit folgender Zeile: 
	
	
	
	





```
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
```
 Nur leider wird dabei auch mein hübsches Design des Konfigurationsmenüs überschrieben und an das jeweils gesetzte LookandFeel angepasst.

Da ich in der gesamten GUI aber noch mehrere normale jButtons habe die sich natürlich auch ändern dürfen nur die Paar aus dem Konfigurationsmenü nicht bräuchte ich nochmals Euren Rat wie man so etwas am besten realisiert.

Vielen Dank im Voraus

derDoc


----------

