Natriumarm Geschrieben 8. Oktober 2013 Geschrieben 8. Oktober 2013 Hallo, ich hab eine relativ simple Frage für die Wissenden. Ich habe eine Oberfläche mit vielen verschiedenen JLABEL (Beispiel myLabel_1-10). Aufgrund von verschiedenen Eingaben werden verschiedene Texte / Zahlen in die myLabel mit setText() geschrieben. Nun stelle ich fest, dass ich ein bestimmtes Label korrigieren muss, zum Beispiel myLabel_5. Ich habe mir jetzt das entsprechende myLabel_5 mit Stringverknüpfungen und Berechnungen ermittelt und die exakte Bezeichnung steht jetzt in einem String LabelName = myLabel_5 (über System.out.printl getestet). Der Hintergedanke dabei war, dass ich gehofft hatte, mir die Bezeichnung des zu korrigierende JLabel einfach zusammen zu basteln, sodass ich eine mehrfache verschachtelte if Struktur oder switch case vermeiden kann. Nun ist die Frage, wie kann ich über diesen String LabelName den Inhalt des myLabel_5 mit getText() auslesen? Ich hoffe mein Anliegen gut genug beschrieben zu haben und bedanke mich schon mal für die Ideen. Zitieren
Schiller256 Geschrieben 8. Oktober 2013 Geschrieben 8. Oktober 2013 Also ich vermute jetzt mal das was du suchst sind Reflection? Also eine Möglichkeit zur Laufzeit die Labelwerte zu ändern! Solltest du was anderes gemeint haben dann habe ich deine Frage nicht verstanden. Da müsstest du es nochmal versuchen zu beschreiben was du da genau vor hast. Trail: The Reflection API (The Javaâ„¢ Tutorials) Zitieren
Natriumarm Geschrieben 8. Oktober 2013 Autor Geschrieben 8. Oktober 2013 Ich schau mir diese Reflection mal an. Ich muss dazu sagen, dass ich mehr oder weniger Leihe bin und mir das alles gerade versuche selber beizubringen nebenbei. Ich beschreib das Problem nochmal. Ich habe 10 JLabel myLabel_1-10. In jedem JLabel schreibe ich mit myLabel_x.setText() Zahlen / Werte rein. Jetzt stelle ich fest, dass ich in myLabel_5 anstatt eine 10 eine 8 reinschreiben müsste. Ich möchte jetzt eine Korrekturfunktion programmieren, die es mir ermöglicht, jedes beliebige myLabel zu korrigieren - ich nenn die Methode jetzt Korrektur(int LabelNummer). Den Übergabewert als integer, damit ich mir zusammen bauen kann, welches Label ich jetzt genau verändern will. Ich hab jetzt also einen String KorrekturLabel = myLabel_+Labelnummer. Durch diese Verküpfung steht jetzt in KorrekturLabel myLabel_5. Ab hier weiß ich dann nicht weiter. Ich hab da meinen String in dem mein zu korrigierendes Label steht, aber wie kann ich jetzt weiter machen mit .setText() oder getText() und falls nötig mit dem Inhalt aus dem Label noch was berechnen und dann erst wieder schreiben. Ich könnte natürlich auch über den Übergabewert LabelNummer jetzt switch LabelNummer aufbauen und dann case 1, case 2 etc programmieren. Dann hätte ich bei jeder Korrektur diese riesige switch case Struktur oder analog viele if, aber das bläht ja unheimlich auf. Ich muss dazu sagen, dass ich eine ähnliche switch case Variante schon im Programm habe, da allerdings nur mit 5 Label und in jedem case passiert im Grunde das gleiche mit dem entsprechenden Label. Daher hab ich die Hoffnung, dass irgendwie abkürzen zu können. Wenn das nicht geht, wie erhofft, kein Problem, dann eben switch case, aber man kann ja mal die Experten befragen. ;-) Zitieren
pr0gg3r Geschrieben 8. Oktober 2013 Geschrieben 8. Oktober 2013 Also erst einmal definierst du die Nummer der Labels nicht im Name des Labels, sondern als Variable in einer davon abgeleiteten Klasse (man kann zwar auch auf den Namen eines Objektes zugreifen, aber wieso unnötig kompliziert wenns auch einfach geht): public class NrLabel extends JLabel { private int nr; public NrLabel(int nr) { this.nr = nr; } public int getNr() { return this.nr; } } Dann fügst du die Labels einer ArrayList hinzu (entweder wie her per new oder deine bestehenden Label-Objekte, die du aber dann auch von NrLabel statt JLabel ableiten musst): private ArrayList<NrLabel> labels = new ArrayList<NrLabel>(); ... labels.add(new NrLabel(1)); labels.add(new NrLabel(2)); labels.add(new NrLabel(7)); labels.add(new NrLabel(44)); labels.add(new NrLabel(123)); Nun kannst du die ArrayList durchgehen (entweder du machst sie als Member oder übergibst sie mit an die Methode): public void Korrektur(int nr) { for(int i = 0; i < labels.size(); i++) { if(labels.get(i).getNr() == nr) { labels.get(i).setText("Hallo Welt"); break; } } } Fertig Zitieren
Natriumarm Geschrieben 9. Oktober 2013 Autor Geschrieben 9. Oktober 2013 Guten Morgen Das schaut alles recht verständlich aus. Dann verwerfe ich mal meine "Idee" mit der Labelbezeichnung in einem String. Ich probiere das heute mal aus und melde mich, wenn ich fest stecke oder Verständnisprobleme habe. Vielen Dank! PS: Wenn jemand noch eine andere Idee hat, würde ich die gerne auch ausprobieren an der anderen Stelle mit meiner recht "großen" Switch case Struktur Zitieren
Gast runtimeterror Geschrieben 9. Oktober 2013 Geschrieben 9. Oktober 2013 So wie pr0gg3r es beschrieben hat ist der übliche Weg. Reflection ist in diesem einfachen Falle völlig fehl am Platz. Als Variante zur ArrayList (i.A. List) kann man noch mit einer Map (z.B. HashMap<String, JLabel>) arbeiten und anstelle über Nummern mit Strings das JLabel adressieren. Auch das gute alte Array (JLabel[]) erfüllt seinen Zweck, wenn vorher die Anzahl bekannt ist. Zitieren
pr0gg3r Geschrieben 9. Oktober 2013 Geschrieben 9. Oktober 2013 Was auch noch eine Möglichkeit wäre, Oberflächenelemente zu ermitteln, wäre über getComponents(). Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.