Anzeige:
Ergebnis 1 bis 8 von 8

Thema: mousePressed soll Farbe von JButton ändern

  1. #1
    massimo
    Gast

    mousePressed soll Farbe von JButton ändern

    Hallo,
    versuche gerade ein Menge von JButtons mit windowAdaptern zu versehen, die dafür sorgen, dass, wenn ein JButton gedrückt wird, er seine Hintergrundfarbe ändert, und beim auslassen des Buttons soll die Farbe wieder zurückgesetzt werden.

    Code:
    //buttonsa ist ein Object[]
    //jButtonTemp ist ein JButton
    //color_temp ist ein Color Object
    for (int i = 0; i < buttonsa.length; i++) {
        jButtonTemp = (JButton) buttonsa[i];
        color_temp = jButtonTemp.getBackground();
        jButtonTemp.addMouseListener(new MouseAdapter() {
           public void mousePressed(MouseEvent me) {
              jButtonTemp.setBackground(jColorChooser1.getColor());
           }
           public void mouseReleased(MouseEvent me) {
              jButtonTemp.setBackground(color_temp);
           }
        //jButtonTemp = null; <- führt zu einer NullPointerException, wieso?
       });
    }
    Es wird hier immer nur der erste JButton in dem Array mit dem Listener versehen, d.h. egal welcher diesr Button gedrückt wird, es wird immer die Farbe des ersten Buttons geändert - ich verstehe aber nicht warum. Vielleicht kann mich da jemand ein wenig erleuchten.

    Danke,
    massimo

  2. #2
    Registrierter Benutzer
    Registriert seit
    07.02.2002
    Beiträge
    41
    Also das mit der NullPointer Exception ist einfach zu erklären.

    Du weisst der Variablen jButtonTemp einen jButton aus dem Array zu. Dann erzeugst du einen neuen MouseAdapter und fügst du dem Button den Listener hinzu. Anschliessend setzt du jButtonTemp auf null.

    Innerhalb des Listeners, der ja nicht unbedingt beim erzeugen aufgerufen wird, sondern meistens später, greifst du auf die Instanzvariable jButtonTemp zu, die allerdings null ist. Dadurch kommt es zu der Exception.

    Das nur der erste Button mit dem Listener versehen wird ist falsch, wenn du sagst, dass sich die Farbe des ersten Buttons ändert, egal welchen Button du drückst. Jeder der Button wird mit dem Listener versehen, nur dass jeder Listener die Farbe des selben Buttons ändert.
    Ich würde die Buttons nicht in einem Array speichern, sondern jeden für sich deklarieren. Das ist um einiges übersichtlicher.

    Hoffe geholfen zu haben

    Gruss
    Sebastian

  3. #3
    massimo
    Gast
    Der Code war nicht ganz korrekt, die letzte Zuweisung war ausserhalb von diesem .addMouseListener Statement.

    Jeder der Button wird mit dem Listener versehen, nur dass jeder Listener die Farbe des selben Buttons ändert.
    Das kann ich nicht nachvollziehen. Ich hole mir einen Button aus dem Array und füge diesem einen Mouselistener hinzu. Dieser Listener reagiert auf ein Mousepressed und ändert den selben Button, der den Listener ausgelöst hat, oder?

  4. #4
    Registrierter Benutzer
    Registriert seit
    07.02.2002
    Beiträge
    41
    Zitat Zitat von massimo
    Der Code war nicht ganz korrekt, die letzte Zuweisung war ausserhalb von diesem .addMouseListener Statement.


    Das kann ich nicht nachvollziehen. Ich hole mir einen Button aus dem Array und füge diesem einen Mouselistener hinzu. Dieser Listener reagiert auf ein Mousepressed und ändert den selben Button, der den Listener ausgelöst hat, oder?
    Ich nehme mal an, dass deine Variable jButtonTemp global ist, oder?

    Diese Variable bekommt in der for Schleife die buttons zugewiesen. Der letzte Button, der der Variablen zugewiesen wurde, bleibt auch darin, wenn die Schleife zu Ende gelaufen ist.
    Wenn du nun, nachdem die Schleife durchgelaufen ist, auf einen Button drückst, wird die Aktion auf jButtonTemp ausgeführt. Aber egal, welchen Button du drückst, es wird immer die Farbe von jButtonTemp geändert und jButtonTemp hat immer den gleiche Wert, da dieser sich nicht mehr ändert.
    Jedem Button wurde zwar eine MouseListener zugewiesen, jedoch greift jeder dieser MouseListener auf dieselbe globale Variable zu, die nach der Zuweisung nicht mehr geändert wird und somit immer der letzte Button, der aus dem Array in jbuttonTemp geschrieben wurde, drin steht.

    Wie schon gesagt, ich glaub nicht, dass es so einfach mit einem Array lösbar ist. Ich würde mir jeden Button einzeln als globale Instanzvariable deklarieren und dann

    Code:
    button1 = new JButton("beschriftung");
    button1.addMouseListener(new MouseAdapter() {
           public void mousePressed(MouseEvent me) {
              button1.setBackground(jColorChooser1.getColor(  ));
           }
           public void mouseReleased(MouseEvent me) {
              button1.setBackground(color_temp);
           }
       });
    verwenden.

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.07.2004
    Beiträge
    50
    Lasst ihn doch die Buttons als Arrays verwenden, wenn er will.

    Code:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    
    public class Main extends JFrame implements MouseListener
    {
      JButton buttons[];
      
      Color colors[];
      
      final int count = 20;
      
      
      public Main()
      {
        super("JButton-Farben");
        setSize(450, 450);
        
        addWindowListener(new WindowAdapter() { public void windowClosing(final WindowEvent evt) { System.exit(0); } });
        
        
        buttons = new JButton[count];
        
        colors = new Color[count];
        
        getContentPane().setLayout(new GridLayout(count, 1));
        
        for (int i=0; i<count; i++)
        {
          buttons[i] = new JButton("Button " + (i+1));
          
          buttons[i].addMouseListener(this);
                
          getContentPane().add(buttons[i]);
          
          int rgb = (int)((255 / count) * i);
          
          colors[i] = new Color(rgb, rgb, rgb);
        }
      }
      
      
      public void mousePressed (MouseEvent evt)
      {
        for (int i=0; i<count; i++)
        {
          if (evt.getSource().equals(buttons[i]))
          {
            buttons[i].setBackground(colors[i]);
            return;
          }
        }
      }
      
      
      public void mouseMoved (MouseEvent evt) {}
      public void mouseExited (MouseEvent evt) {}
      public void mouseClicked (MouseEvent evt) {}
      public void mouseDragged (MouseEvent evt) {}
      public void mouseReleased (MouseEvent evt) {}
      public void mouseEntered (MouseEvent evt) {}
      
      
      public static void main (String args[])
      {
        new Main().show();
      }
    }

  6. #6
    Registrierter Benutzer
    Registriert seit
    07.02.2002
    Beiträge
    41
    Zitat Zitat von KL47
    Lasst ihn doch die Buttons als Arrays verwenden, wenn er will.

    [...]
    Okay, dass ist natürlich ne Möglichkeit, die funktioniert. Soweit hatte ich jetzt nicht gedacht.
    Aber Tatsache ist, dass man mit den Buttons anders umgehen muss.

  7. #7
    massimo
    Gast
    Danke, das hat weitergeholfen.

  8. #8
    Registrierter Benutzer Avatar von Sym
    Registriert seit
    05.09.2002
    Ort
    Bremen
    Beiträge
    278
    Zitat Zitat von KL47
    Lasst ihn doch die Buttons als Arrays verwenden, wenn er will.
    Zum Code: Da würde sich statt des MouseListeners ein MouseAdapter lohnen, da man die leeren Methode nicht noch extra implementieren müsste.
    Denk mal drüber nach...

    Lars

    ACHTUNG: ersetze Linux durch GNU/Linux an den entsprechenden Stellen
    www.macuser.de, MSVC2005 Express und Qt, Qt/Mac installieren

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •