Swing JColorChooser für die JToggleButtons

F_A_U_S_T

Mitglied
Hallo zusammen,
ich bin neu hier und bitte euch um Hilfe da ich seid ca. 4 Std. nicht mehr weiter komme.
Folgendes Problem: ich habe einen 2D Array aus Buttons erstellt und möchte nun jedem Button eine JColorChooser Funktion hinzufügen um später für jeden Button eine eigene Farbe wählen zu können um beispielsweise ein PixelArt-Bild zu erstellen.


Java:
public class Button extends GUI {
 
    public static void buttons() {
     
        int rows = 40;
        int colls = 40;
     
        JToggleButton  button [][] = new JToggleButton [rows][colls];

       
        panel.setLayout(new GridLayout(rows,colls));
       
       
        for(int i = 0; i < rows; i++) {
                for(int j = 0; j < colls; j++) { 
            button[i][j] = new JToggleButton ();
            panel.add(button[i][j]);
            button[i][j].setVisible(true);
         
         
            button[i][j].addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(ActionEvent e) {

                    Component comp = (Component) e.getSource();
                    Color newColor = JColorChooser.showDialog(null, "Wählen Sie neue Farbe", comp.getBackground());
                    button[i][j].setBackground(newColor); // hier zeigt der Complier den Fehler an, //wenn ich button[0][0] setze, klappt alles, allerdings nur für einen Button.
             
                }
            });
         
            }
        }       
    }
 
}
Wie Sie sehen können, bin ich ganz neu in dieser Programmiersprache und die Antwort kann recht simple sein.
Über jegliche Hilfe freue ich mich.
Danke.
 
Zuletzt bearbeitet:
Ein Stacktrace mit deinem Compilerfehler waere hilfreich.🙂
Hi,
ich hoffe, dass ich richtig verstanden habe was ein Stracktrace ist:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem:
    Local variable i defined in an enclosing scope must be final or effectively final

    at Button$1.actionPerformed(Button.java:43)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.JToggleButton$ToggleButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Es handelt sich um den Fehler, welcher ganz unten bei dem Array
Code:
button[i][j]
angezeigt wird. Wenn ich statt
Code:
button[i][j]
die werte
Code:
button[0][0]
eintrage, dann lauft auch alles, allerdings kann ich dann nur auf den ersten Button zugreifen und den mit JColorChooser verändern.
Es macht aber für mich kein Sinn alle Buttons einzeln zu beschreiben da die Zahlen von Zeilen und Spalten veränderbar sein sollten. Dazu baue ich später eine Stream Funktion ein um die Werte für Rows and Colls von der Tastatur ablesen zu können.
 
Zuletzt bearbeitet von einem Moderator:
Wie in der Fehlermeldung schon zu sehen ist müssen alle benutzen Variablen final / effektiv final sein. Was du machen könntest wäre vor dem Aufruf von addActionListener..
Zu schreiben : final int k = i; und dann im ActionListener k statt i zu verwenden.
 
Wie in der Fehlermeldung schon zu sehen ist müssen alle benutzen Variablen final / effektiv final sein. Was du machen könntest wäre vor dem Aufruf von addActionListener..
Zu schreiben : final int k = i; und dann im ActionListener k statt i zu verwenden.
Vielen Tausend Dank.
Das hat geklappt. Da muss ich wohl über final im Java-Buch nachlesen.
 

Zurück
Oben