PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mousePressed soll Farbe von JButton ändern



massimo
07-12-2004, 09:56
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.



//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

gaansch
07-12-2004, 10:26
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

massimo
07-12-2004, 10:45
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?

gaansch
07-12-2004, 17:01
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




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.

KL47
07-12-2004, 17:16
Lasst ihn doch die Buttons als Arrays verwenden, wenn er will. ;)


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

gaansch
07-12-2004, 18:55
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.

massimo
08-12-2004, 15:50
Danke, das hat weitergeholfen.

Sym
08-12-2004, 18:10
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.