JButton und Aktion...


Und woher hast du die Farbnamen, ich mein du musst sie doch irgendwie abfragen, da es nicht nur 10 farben gibt (z.B), sondern eine ganze Menge


Ich hab halt die Farben genommen, die in der Abbildung in der Angabe aufgelistet waren. Das sind dann auch die Farben, die als Konstanten in java.awt.Color definiert sind (siehe hier unter „Field Summary“: JDK 21 Documentation - Home).


Ich hab in das String-Array [m]value[/m] sämtliche Farbwerte geschrieben.

Ich dachte ja auch, ich könnte den Farbwert des Buttons mittels folgendem Ausdruck ändern

[m]button.[u]setForeground/u;[/m]

Die Methode [m]setForeground[/m] scheint aber für Argumente (String) nicht anwendbar sein. Was mach ich falsch?


Habe zwei arrays genommen.
Eins mit Strings, welches ich zur erzeugung der Liste verwende.
Ein zweites vom Typ Color, das die Farben enthält, z.b.: {Color.black, Color.blue, …}


@dschulian: setForeground braucht Variablen vom Typ Color
machs wie von thomas_ beschrieben!


Über Typen in Java les ich glaub ich doch mal ein Buch :smiley: - Danke!


Habs erstaunlicherweise hinbekommen :wink:

PS: Hab ma mein Code mitangehängt, vll wollens sich ein paar Javafreaks von euch angucken - vll is ja was unsauber. thx :smiley:

Attachment:
LetsSwing.java: https://fsi.cs.fau.de/unb-attachments/post_29381/LetsSwing.java


Ich habs a wengl anders gemacht, aber im Prinzip doch auch richtig, oder?
Anstand

public LetsSwing

hab ich:


So was ähnliches hab ich gestern in nem tutorium von sun gesehen, allerdings mit public class LetsSwing implements ActionListener { …

Sollte eintlich auch funktionieren, allerdings weiß ich nicht, wie es sich verhält, sobald man mehr als zwei knöpfe hat und denen unterschiedliche anweisungen geben will.


Über den Event-Parameter lässt sich abfragen, welche Schaltfläche die Aktion ausgelöst hat. So kann man auch feststellen, ob der Benutzer z.B. Strg, Alt oder Shift dabei gedrückt hatte oder ob’s ein Links- oder Rechtsklick war, usw…


Hast du nen link, wo das knapp und gut beschrieben steht?


Wenn ihr beim Actionlistener den ActionEvent e habt.
Die Methode e.getActionCommand() gibt euch den Namen des Knopfes.


Ich hab bis jetz noch keine elegantere Methode die Aufgabe zu lösen als mit 2 Arrays,
von denen eines die Farbnamen als String Objekte enthält und das andere die echten Color Objekte.

Hab schon alle möglichkeiten mit Hashmaps probiert aber funzt alles nichts!
Bitte wenn jemand ne idee hat mir bescheid sagen.


So hätt’s ich gemacht:

class ColorPair {
	public Color color;
	public String desc;
	
	public ColorPair(Color c, String d) {
		color = c;
		desc = d;
	}	
}

Hat halt den Nachteil, dass man dann mit einer weiteren Funktion ein String-Array aus den Namen machen muss…


Kurz und knaoo ist das zwar jetzt nicht aber dafür recht informativ:

und JDK 21 Documentation - Home

Es gibt noch eine elegantere Möglichkeit die Farbe zu setzten: Die Farbkonstanten in java.awt.Color bilden nämlich ein Fieldset. Über die Möglichkeit ein einzelnes Field aus diesem set per (String-)Name auszuwählen erhält man dann das zugehörige Color-Objekt. Guckst du hier JDK 21 Documentation - Home und hier JDK 21 Documentation - Home. :wink:


Ich habe diese nette Hilfsfunktion in den unergründlichen Weiten des Internets gefunden:

private static Color getColorByName(String colorName)
{
	try {
		// Find the field and value of colorName
		Field field = Class.forName("java.awt.Color").getField(colorName.toLowerCase());
		return (Color) field.get(null);
	} catch (Exception exception) {
		return Color.BLACK;
	}
}

Damit man diese Funktion verwenden kann, muss man vorher [m]java.lang.reflect.*[/m] importieren.


Naja, ich weiß nicht…
Einerseits ist es zwar durchaus nett, so eine Funktion zu haben, andererseits… Vielleicht ist das ja bei Java was anderes(?), aber sonst würde ich solche Reflection-Sachen wirklich nur genau dann verwenden, wenn mir überhaupt nichts mehr anderes übrig bleibt.


Ich habe es jetzt auch mit zwei Array gemacht.
Die Listener sind jeweils diese nested classes.
Das finde ich ganz nett.

Für was Größeres würde ich darauf verzichten und Anzeige von Nachrichtenbehandlung abkoppeln…


Reflektion ist ja nicht soo schlecht, aber von meinem Blinkwinkel aus ziemlich verkrüppelt. :>
Soll sich jetzt keineswegs auf die Wertigkeit des Lösungsvorschlags oder so beziehen, sondern nur ausdrücken wie lame Java in der Hinsicht ist. Wer was besseres sucht kann sich ja mal Ruby geben (wird als neues Java gehandelt, wobei das mit Vorbehalt zu geniessen ist) oder am besten gleich λ tanzen. :stuck_out_tongue_winking_eye:

Und um noch was zum eigentlichen Thema beizutragen: IMHO wäre es vllt jetzt schon ganz hilfreich sich ein bisschen tiefergehend mit MVC auseinanderzusetzen. Denn wer weiß schon was da für uns noch alles im Petto ist. Wer das Pattern erst mal durchschaut hat versteht ausserdem den Aufbau des APIs viel leichter und es erscheint einem nicht so aus der Luft gegriffen.


Aber wenn ich schon eine Klasse mit ihrem Namen als String ansprich… Bääh… :motz:
In einer Skriptsprache mit eval-Funktionalität, meinetwegen, aber…
Und meiner Meinung nach muss ich da wirklich nicht um jeden Preis versuchen, aus den eigentlichen OOP-Konzepten auszubrechen.