Verzwicktes Problemchen mit Panel-Array

Status
Nicht offen für weitere Antworten.

Developer_X

Top Contributor
Hi, kann mir einer helfen?

Java:
	public void prepare()
	{
		setLayout(new GridLayout(y,x));

		while(a<y)
		{
			while(b<x)
			{
				colors[a][b] = new Color(255,255,255);
				
				panels[a][b] = new Panel();				
				panels[a][b].setBackground(colors[a][b]);
				panels[a][b].addMouseListener(new MouseListener()
				{
					public void mouseClicked(MouseEvent arg0)
					{
						if(arg0.getButton()==MouseEvent.BUTTON1)
						{
							setBackground(foreground);
							repaint();
						}
						if(arg0.getButton()==MouseEvent.BUTTON3)
						{
							setBackground(background);
							repaint();
						}
					}
					public void mouseEntered(MouseEvent arg0)
					{
					}
					public void mouseExited(MouseEvent arg0) 
					{
					}
					public void mousePressed(MouseEvent arg0)
					{
					}
					public void mouseReleased(MouseEvent arg0) 
					{
					}
				});
				add(panels[a][b]);
				b++;
			}
			b=0;
			a++;
		}
		a = 0;
		b = 0;
	}

Mein Ziel ist folgendes:
Wenn man mit eienr Maustaste auf einen der Panels drückt, dann soll dieser, der gedrückte, entweder in die Color "foreground" oder "background" zu färben, kann mir bitte einer helfen?

Danke,
Developer_X
 

Developer_X

Top Contributor
ich machs nicht ganz einfach mit
Java:
                panels[a][b].setBackground(colors[a][b]);
weil die werte a und b nie wieder verwendet werden, und die methode einmal verwendet wird.
Das heißt, würde man, egal auf welches Panel, klicken, immer nur das erste oben, färben, also panel[0][0]
da am ende der methode die beiden werte auf 0 gesetzt werden. was soll ich also tun?
 

mmz

Aktives Mitglied
Ohne mir jetzt den Code genauer angeschaut zu haben oder länger darüber nachgedacht zu haben was Du eigentlich willst.

Ich glaube her ausgelesen zu haben, dass Du mehrere Panels hast. Diese sollen die Hintergrundfarbe, so wie die Vordergrundfarbe ändern können, je nach dem ob sie den Focus haben/selektiert wurden oder nicht. Soweit richtig?

Wenn ja, dann wäre es nicht falsch in einem, wie war das noch, KKBS zu zeigen was nicht funktioniert, bzw. anhand eines Bildes was Du haben möchtest.

Egal ob ich nun richtig liege oder nicht, glaube ich jede andere Lösung als Deine wäre besser geeignet das Problem zu lösen ( Subjektiv anhand des wirklich nur überflogenen Quelltextes )

Also bitte klarer machen was Du möchtest oder was nicht so funktioniert wie es soll.
 

hdi

Top Contributor
was soll ich also tun?

in den Listenern keine Index-Werte verwenden, die später zur Laufzeit auf 0 gesetzt werden. Das kannst du auch gar nicht :D Weil anonyme Klassen genau wegen der Vemeidung solcher fataler Situationen finale Variablen erwarten. D.h. du musst dir innerhalb der Listener zwei finale Kopien von a und b erzeugen, und dann wie gehabt

Java:
panels[finalA][finalB].setBackground(...);

Dass dein Code überhaupt kompiliert liegt daran, dass die Klasse in der du arbeitest wohl auch eine (J)Component ist, und daher die Methoden setBackground/foreground bereitstellt. Und genau darauf bezieht sich dein Code im Moment auch.

Wichtig: Nur weil ein Listener zu einem Objekt geaddet ist, heisst das doch nicht, dass sich jeglicher Code in seinen Methoden auf dieses Objekt bezieht :exclaim: Das mag vllt so rüberkommen bei

Java:
class MyPanel implements ActionListener {}

aber das ist nicht so. in diesem Fall beziehst du dich eben auf die Klasse selbst, nicht auf irgendein Panel.

Btw: repaint() ist nicht nötig, der macht das automatisch nach setBackground/setForeground

Und noch zur Information: Es gibt für (fast?) jeden Listener auch einen entsprechenden Adapter, der standardmässig alle Methoden pseudo-implementiert (die Rümpfe sind leer). Dann überschreibst du nur die Methoden, die du brauchst. Das bläht den Code bei Benutzung von anonymen Klassen nicht so auf:

Java:
panels[a][b].addMouseListener(new MouseAdapter(){
    @Override
     public void mouseClicked(MouseEvent e){
             ...
     }

    // die anderen Methoden sind implementiert (machen nichts), 
    // wenn wir sie nicht brauchen überschreiben wir sie einfach nicht.
});

Und da ich grad on fire bin hör ich noch immer nicht auf ;)

1) Du verwendest wie ich finde noch immer zu viele globale Variablen. Warum genau sind a, b und x,y nicht lokale Variablen der Methode prepare()? Es ist ziemlich fehleranfällig Variablen durch mehrere Methoden und Objekte zu ziehen, weil sie überall verändert werden können und du nie genau sagen kannst, was jetzt welche Variable für einen Wert hat. Wenn es also keinen Grund dafür gibt, warum sie nicht lokal sein dürfen (und den gibt es ganz sicherlich nicht, wenn doch, dann sag bitte Bescheid), dann änder das bitte.

Ich schätze mal du hälst das für performanter, nicht "unnötig" lokale Variablen zu erzeugen. Dann lass dir gesagt sein, dass es nicht performanter ist. Ich will hier nicht über nano-sekunden reden. Dein Stack kann mehr lokale Variablen speichern als du Sekunden in deinem Leben lebst, und bei Objekten zerstört der GC (Garbage Collector) auch sofort alles, was nicht mehr benötigt wird.
@mods: GC sollte nen Tool Tip bekommen

2) Was du allerdings besser machen kannst:
Java:
colors[a][b] = new Color(255,255,255);
Du erstellst bei jedem Durchlauf ein neues Objekt mit der gleichen Farbe, ganz abgesehen davon ist das auch noch eine vorgefertigte Konstante (Color.WHITE)

3) arg0 ist hässlich, das solltest du ersetzen. Okay, "e" ist vllt auch nicht das Wahre, aber immerhin deutet es ein Event an,und arg0 kann alles sein. Ist einfach eine dieser Konventionen, die du ja so sehr hasst und wahrscheinlich auch völlig ignorieren willst.

4) Um auch mal was Positives zu sagen: Abgesehen von den globalen Variablen sind das, was ich bemängel, ja alles eher unwichtige Kleinigkeiten (was nicht heißt dass du sie ignorieren sollst!). Alles in allem könnte die prepare()-Methode tatsächlich von jemandem geschrieben sein, der Ahnung von Java hat bzw. der verständlichen Quellcode schreibt ;) Zumindest schon um einiges besser als was ich bisher von dir gesehen habe.
 
Zuletzt bearbeitet:
S

Spacerat

Gast
in Zeile 4 würde ich genau eine einzige finale Instanz eines MouseAdapters deklarieren und initialisieren (natürlich über mehrere Zeilen verteilt). Innerhalb des MouseAdapter dürfte dann ((Component) arg0.getSource()).setBackground()" bzw. "arg0.getComponent().setBackground()" das tun was du haben willst.
Java:
    public void prepare()
    {
        setLayout(new GridLayout(y,x));
        final MouseAdapter listener = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                Component source = me.getComponent();
                int button = me.getbutton();
                if(button == MouseEvent.BUTTON1) {
                    source.setBackground(background);
                }
                if(button == MouseEvent.BUTTON3) {
                    source.setBackground(foreground);
                }
            }
        }
        while(a<y)
        {
            while(b<x)
            {
                colors[a][b] = new Color(255,255,255);
                
                panels[a][b] = new Panel();             
                panels[a][b].setBackground(colors[a][b]);
                panels[a][b].addMouseListener(listener);
                add(panels[a][b]);
                b++;
            }
            b=0;
            a++;
        }
        a = 0;
        b = 0;
    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Problemchen mit JTable AWT, Swing, JavaFX & SWT 8
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
CptK Ordentlicher Code & Panel ab bestimmter Komponentenzahl scrollbar machen AWT, Swing, JavaFX & SWT 12
B JTextField in Panel positionieren AWT, Swing, JavaFX & SWT 1
R Swing Panel nur bei Maus sichtbar AWT, Swing, JavaFX & SWT 2
B mit Maus verschiebbares Panel AWT, Swing, JavaFX & SWT 2
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
H Aus Array Container Panel an Tabbedpane zuweisen AWT, Swing, JavaFX & SWT 29
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
CptK Swing DropdownMenu über Panel-Grenzen hinaus anzeigen AWT, Swing, JavaFX & SWT 1
J Aufklappbares Panel in Toolbar AWT, Swing, JavaFX & SWT 6
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
J JFrame Panel hinzufügen AWT, Swing, JavaFX & SWT 10
B AWT Panel größe im BorderLayout einstellen AWT, Swing, JavaFX & SWT 1
K Swing Entfernen von Panel funktioniert nicht AWT, Swing, JavaFX & SWT 5
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
L JavaFX Klickverhalten bei einem Panel AWT, Swing, JavaFX & SWT 1
A Swing Panel mit ScrollBar AWT, Swing, JavaFX & SWT 7
K Panel verdeckt MenuItem AWT, Swing, JavaFX & SWT 5
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
N Swing Label auf Panel legen.. AWT, Swing, JavaFX & SWT 2
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
P AWT Panel überschreibt vorheriges... AWT, Swing, JavaFX & SWT 2
Thallius Swing Warum kann man Texte im Panel nicht markieren? AWT, Swing, JavaFX & SWT 1
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M AWT Panel wird nicht angezeigt AWT, Swing, JavaFX & SWT 7
P Fenstergröße ändern, Panel soll gleich bleiben AWT, Swing, JavaFX & SWT 2
M JavaFX Slide Panel AWT, Swing, JavaFX & SWT 2
P Swing Panel nicht sichtbar AWT, Swing, JavaFX & SWT 1
M Swing JtextField Panel in ander Panel aufrufen AWT, Swing, JavaFX & SWT 0
M Panel in geerbter JFrame Klasse adden AWT, Swing, JavaFX & SWT 4
S ScrollPane in Textarea und auf Panel AWT, Swing, JavaFX & SWT 4
D Swing Bei Button Click neues Panel laden AWT, Swing, JavaFX & SWT 3
D Panel wird nicht angezeigt und Fragen zum CardLayout AWT, Swing, JavaFX & SWT 6
S Swing JMenu löscht auf panel gezeichnetes AWT, Swing, JavaFX & SWT 3
X Java Panel zeitweise repainten AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
W Swing Nicht-Editierbares Textfeld in Panel in ScrollPane AWT, Swing, JavaFX & SWT 9
B zweidimensionales Buttonarray auf Panel AWT, Swing, JavaFX & SWT 11
F JAVA-EDITOR: Panel in Frame aufnehmen AWT, Swing, JavaFX & SWT 3
F textarea lässt panel verschwinden AWT, Swing, JavaFX & SWT 4
T LayoutManager GridLayout panel.setSize funktioniert nicht AWT, Swing, JavaFX & SWT 1
A Panel lässt sich nicht bewegen AWT, Swing, JavaFX & SWT 2
E Panel mit Leben füllen AWT, Swing, JavaFX & SWT 2
K Swing Maus in Panel einsperren AWT, Swing, JavaFX & SWT 8
D Panel in Panel zentriert nicht richtig AWT, Swing, JavaFX & SWT 3
P Swing Panel-austausch über einen MenuListener AWT, Swing, JavaFX & SWT 2
1 Swing Bestimme ob ein Subelement eines panel den Fokus verloren hat AWT, Swing, JavaFX & SWT 2
P Swing Button über gesamtes Panel AWT, Swing, JavaFX & SWT 2
O LayoutManager Panel in Panel "maximieren" AWT, Swing, JavaFX & SWT 2
C AWT Horizontale Linie in einem Panel AWT, Swing, JavaFX & SWT 12
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
B Export eines Panel mit ScrollBar AWT, Swing, JavaFX & SWT 4
S Größe von Panel verändern welches auf anderem Panel sitzt AWT, Swing, JavaFX & SWT 10
bluerob Panel im BorderLayout South wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
M Swing Panel klassenübergreifend ändern AWT, Swing, JavaFX & SWT 6
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3
A 2D-Grafik Panel inhalt löschen AWT, Swing, JavaFX & SWT 5
H Scroll Panel wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 6
S Elemente im Panel in richtige Ausgangsstellung bringen AWT, Swing, JavaFX & SWT 10
X Swing Panel Extra Klasse & Aufruf über Button AWT, Swing, JavaFX & SWT 18
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
C Bild auf Panel vergrößern und verschieben AWT, Swing, JavaFX & SWT 4
C ImageIcon eines Labels auf einem Panel in neuem Fenster anzeigen AWT, Swing, JavaFX & SWT 2
H LayoutManager Panel verschieben sich AWT, Swing, JavaFX & SWT 5
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
S Vaadin: Panel AWT, Swing, JavaFX & SWT 10
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
C Etwas durchsichtig machen über einem Panel AWT, Swing, JavaFX & SWT 7
K Panel zu Laufzeit ändern AWT, Swing, JavaFX & SWT 6
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
D Panel aus externer Klasse holen AWT, Swing, JavaFX & SWT 2
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
T Listener in anderen Panel deaktivieren AWT, Swing, JavaFX & SWT 3
H Verschiedene JPanels aus eigenen Klassen in JFrame einfügen, nur ein Panel sichtbar AWT, Swing, JavaFX & SWT 4
GUI-Programmer Informations-Panel an Label AWT, Swing, JavaFX & SWT 2
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
J JPanel mit anderem Panel aus anderer Klasse setzen AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Panel-Zeichnung erscheint nicht AWT, Swing, JavaFX & SWT 7
S Panel rapaint AWT, Swing, JavaFX & SWT 18
T AffineTransform wirkt sich nur auf dem ersten Panel aus AWT, Swing, JavaFX & SWT 3
K Swing: Panel in Panel erzeugen AWT, Swing, JavaFX & SWT 11
M Panel in SWT einfügen AWT, Swing, JavaFX & SWT 12
T auf Panel zeichnen AWT, Swing, JavaFX & SWT 4
A FormLayout Panel-Breite AWT, Swing, JavaFX & SWT 7
Dit_ "Expandable" Panel ? AWT, Swing, JavaFX & SWT 6
A Panel-Unterklasse funktioniert nicht AWT, Swing, JavaFX & SWT 16
A Panel zu klein AWT, Swing, JavaFX & SWT 14
M Eigenes Panel aus Component? AWT, Swing, JavaFX & SWT 5
S Swing Größe von JLabels verändern sich in einem Panel unterschiedlich AWT, Swing, JavaFX & SWT 6
B Panel als Bild speichern AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben