JButton Problem beim Schriftfarbe Ändern

  • Themenstarter Themenstarter KandesBunzler
  • Beginndatum Beginndatum
K

KandesBunzler

Gast
Hallo Community.

Ich habe mir einen Minesweeper-Klon geschrieben und als Spielfeld ein zweidimensionales Array von JButtons benutzt. Es funktioniert auch alles so, wie es soll, außer eben das Einfärben. Damit meine ich, dass wie beim Vorbild die Zahl der umliegenden Mienen je nach Anzahl unterschiedlich gefärbt sein soll.

Nur das passiert einfach nicht. Keine Fehlermeldung, der Debugger in Eclipse hat mich auch nicht schlauer gemacht. Es bleibt einfach schwarz. Vielleicht weiß jemand von euch ja Rat. Vermute, dass es vielleicht an den Threads liegt, die die JVM erzeugt, aber ich weiß nicht, wie ich das dann umgehen soll.

Der komplette Sourcecode ist zu lang, hier mal ein Beispiel wie ich das gemacht habe:

Java:
private void deckeAuf(JButton[][] btns, int zeile, int spalte) {

		//Iteration um das geklickte Feld herum
		for (int a = zeile - 1; a < zeile + 2; a++) {
			for (int b = spalte - 1; b < spalte + 2; b++) {
				//IndexOutOfBounds verhindern
				if (!(a == -1 || b == -1 || a == this.zeilenAnz || b == this.spaltenAnz || (a == zeile && b == spalte))) {
					//Wenn das umliegende Feld keine Bombe enthält und keine 0 ist, aufdecken, bei 0 aufdecken und weiter schauen
					if (this.spielfeld[a][b] != -1) {
						btns[zeile][spalte].setEnabled(false);
						if (this.spielfeld[zeile][spalte] != 0) {
							btns[zeile][spalte].setText("" + this.spielfeld[zeile][spalte]);
						}
						Color tmp = this.getColorForNumber(this.spielfeld[zeile][spalte]);
						btns[zeile][spalte].setBackground(Color.WHITE);
						btns[zeile][spalte].setForeground(tmp);
						if (this.spielfeld[a][b] == 0 && btns[a][b].isEnabled()) {
							this.deckeAuf(btns, a, b);
						} else {
							btns[a][b].setEnabled(false);
//Hier hole ich die Farbe...
							Color tmp2 = this.getColorForNumber(this.spielfeld[a][b]);
							btns[a][b].setBackground(Color.WHITE);
							if (this.spielfeld[a][b] != 0) {
								btns[a][b].setText("" + this.spielfeld[a][b]);
							}
//...hier setze ich sie. Nix passiert.
							btns[a][b].setForeground(tmp2);
						}
					}
				}
			}
		}

	}



private Color getColorForNumber(int i) {
		Color clr = null;

		switch (i) {
		case 1:
			clr = new Color(32, 178, 170);
			break;
		case 2:
			clr = new Color(0, 139, 0);
			break;
		case 3:
			clr = new Color(255, 130, 71);
			break;
		case 4:
			clr = new Color(139, 121, 94);
			break;
		case 5:
			clr = new Color(255, 215, 0);
			break;
		case 6:
			clr = new Color(0, 0, 139);
			break;
		case 7:
			clr = new Color(255, 0, 255);
			break;
		case 8:
			clr = new Color(139, 0, 0);
			break;
		}
		return clr;
	}
 
Hey,

das Problem ist, dass dieses Verhalten Look-and-Feel-abhängig ist.

In Metal wird die Farbe anscheinend aus den UIDefaults geholt (Standard: Color[153,153,153]), während es in Windows Classic "funktioniert".

Eine Lösung weiß ich darauf nicht. Ich kann dir nur empfehlen, stattdessen JToggleButton zu verwenden und diese dann nicht zu deaktivieren, sondern immer gedrückt zu lassen, wenn sie einmal gedrückt wurden. So habe ich es zumindest mal für meinen Minesweeper-Klon gemacht.
 
Mhh. Ich habe mit JToggleButtons angefangen und die dann wieder verworfen und durch JButtons ersetzt, weil ich das mit dem UIManager und meinen bevorzugten Farben nicht klappte. -.-

Alles wieder rückgängig...och nö. :/

Zwischenzeitlich hatte ich einen "Bug", dass wenn ich auf einen aufgedeckten Button mit Zahl einen Rechtsklick gemacht habe (wie zum Flagge setzen) dann die Farbe gewechselt wurde - dabei wurde in der Methode nichts gemacht, weil die Bedingung isEnabled() ja schon false war (wird auf false gesetzt beim Aufdecken).

Deshalb auch meine Vermutung mit den Threads, da Swing ja eben nicht threadsicher ist und ja auch bei anderen Komponenten ein Notify braucht. Repaint() funktioniert übrigens leider auch nicht.

Ich würde es gerne verstehen, nur drum herum frickeln ist nicht befriedigend. Hat noch jemand einen Tipp?
 

Neue Themen


Zurück
Oben