Reflection Problem

roxX0r

Mitglied
Hallo,

Es geht um folgendes: ich möchte der GUI meines Programmes weitere Sprachen gönnen, die Dialoge und Labels usw. werden aus einer XML Datei ausgelesen und je nach Sprache, sollen diese gesetzt werden.
Mein Ansatz lautet:

Gehe über alle Objekte der GUI Klasse und falls du eine Objekt findest, welches so heißt wie ein EIntrag in der XML Datei, dann setze den Wert aus der XML Datei.
Also in der XML Datei steht vereinfacht drin:

id=jButton1
lang=de
value=Das ist das Caption meines Buttons in Deutsch


Wobei die id genau der Variablenname des betreffenden Buttons ist.

Java:
      public void changeLang() {

        // c ist die Klasse in der die ganzen GUI Elemente (Buttons usw.) definiert sind.
        Class c = HotkeyGUI.class;
        try {
            // er läuft über alle Elemente in der XML Datei (hab ich vorher schon geparst)
            for (String key : MessageParser.map.keySet()) {
                
                // über alle Felder der Klasse (also auch GUI Elemente)
                for (Field field : c.getDeclaredFields()) {
                    
                    // wenn die Variable mit dem passenden Namen gefunden worden ist
                    if (field.getName().equals(key)) {

                        // hole dir die Methode setText von dem JButton
                        Method method = field.getType().getMethod("setText", String.class);
                        //und setze den Wert (vorher aus der XML geparst)
                        method.invoke(field, MessageParser.map.get(key));

                    }


                }
            }

        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }


    }


So nun bekomm ich hier eine "java.lang.NoSuchMethodException: javax.swing.JButton.setText(java.lang.String)"

Was mach ich falsch?

Irgendwie müsste ich das Objekt bekommen, das ich ändern möchte. Aber ich habe nur seinen Variablennamen als String vorliegen (bzw. als 'Field' Objekt). Wie kann ich nun direkt an das Objekt rankommen?
 
Zuletzt bearbeitet:

Onkel Hatti

Bekanntes Mitglied
Mir würde spontan folgendes einfallen:

Du definiertst ein Interface, z.B. 'LocaleGUIElement'.
In dieses kommt der Methodenrumpf 'setLocaleText(String text)'.
Jedes GUI Element, daß du mit der geparsten XML Datei lokalisieren willst, implementiert dein Interface 'LocaleGUIElement'
In die Methode kommt der Aufruf, den Text zu setzen.

Wenn Du jetzt den Variablennamen deines GUI Elementes hast, ist es wurst, was für eins es ist, ganz sicher ist es
aber ein Object vom Typ 'LocaleGUIElement'. Und dafür ist die Methode 'setLocaleText(String text)' auf jeden Fall definiert.

Hatti
 

roxX0r

Mitglied
hallo Hatti,

ja das ginge in der Tat. Mein Progamm hat aber unzählige GUI Elemente in verschiedenen Klassen, ich würde das gern irgendwie über Reflections machen, da ich nicht alle GUI Klassen ändern möchte.

Also der Ansatz, so wie ich es schon habe, so sollte es doch irgendwie auch gehen?
 

Onkel Hatti

Bekanntes Mitglied
schwierig zu sagen, weil
1. der Inhalt von HotkeyGUI nicht bekannt ist
2. Ich mich mit Reflection eh nicht so auskenne :)

Das Method.invoke funktioniert nur bei Klassen, die bereits instantiiert sind (ggf. nicht bei statischen Methoden, aber 'setText' ist definitiv keine). Also benötigt man die instantiierte Klasse, aud die man das .invoke ausführt. Bislang hast du die nicht.
Wenn die HotkeyGUI als Felder die instantiierten Buttons
Java:
public javax.swing.JButton meinButton=new javax.swing.JButton("Mein Text");

hat, dann könnte man vielleicht mittels

Java:
Object value=Field.get(Object obj);
if(value instanceof javax.swing.JButton)
{
...
}
vielleicht an das "laufende" Objekt herankommen.
Was fehlt, ist jetzt noch das Object obj, dass dem Field.get übergeben werden muss. Für statische Felder darf das null sein, für nicht statische Felder benötigt es wiederum eine instantiierte Klasse.
In deinem Fall die HotkeyGUI. In Zeile 4 deines Beispieles wird jedoch nur die Klasse selbst ermittelt, nicht die bereits instantiierte Klasse.
Ohne diese sehe ich keinen weiteren Erfolg.

Wenn die HotkeyGUI Klasse nur das Object selber definiert

Java:
public Class meinButton=javax.swing.JButton.class;

Dann sehe ich noch viel schwärzer, weil die Reflection nicht ermitteln kann, welches das konkrete Objekt ist, welches sie ändern soll.

Hatti
 

roxX0r

Mitglied
Hatti! Super klasse, es läuft!

Und zwar so:

Java:
Object value = field.get(this);
if(value instanceof javax.swing.JButton){
  javax.swing.JButton b = (javax.swing.JButton)value;
  b.setText("test");
}

"this" ist in diesem Falle das Object der Klasse HotkeyGUI.

Ich hab mit der "Get" Funktion des field Objektes schon rumgespielt, hab aber nich kapiert, was das Object sein soll, das als Parameter übergeben werden soll. Jetzt hab ichs geschnallt, der brauch natürlich das Object von dessen Klasse das gewünscht Feld-Objekt gefunden werden soll....

Danke nochmal :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Reflection Problem Allgemeine Java-Themen 15
brunothg Problem mit Reflection Allgemeine Java-Themen 6
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
Y Reflection - wie anwenden/benutzen bei folgendem Problem Allgemeine Java-Themen 3
C Reflection Problem! Allgemeine Java-Themen 2
V Reflection - Problem Allgemeine Java-Themen 3
B Reflection gone wrong? Allgemeine Java-Themen 21
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Reflection - Abprüfen von Klasseneigenschaften Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
J Reflection-Method Hook? Allgemeine Java-Themen 14
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
K Generic class und Reflection Allgemeine Java-Themen 2
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
E Reflection? Frage Allgemeine Java-Themen 4
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
T Reflection Allgemeine Java-Themen 11
G Klassen Cast auf Argumentenklasse via Reflection? Allgemeine Java-Themen 10
H Collections Generics und Reflection Allgemeine Java-Themen 6
TheWhiteShadow Reflection-Lösung für Objektkopien Allgemeine Java-Themen 3
B Reflection: getMethods schlägt fehl (NoClassDefFoundE)) Allgemeine Java-Themen 15
P Reflection "Cast" Allgemeine Java-Themen 5
D Reflection-Performance Allgemeine Java-Themen 7
S Reflection und Generic Allgemeine Java-Themen 9
W Reflection -> getMethod bei optionalen Parametern Allgemeine Java-Themen 4
Kr0e Reflection - Instanz einer Klasse erstellen, ohne Default-Constructor Allgemeine Java-Themen 15
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
M Probleme mit Reflection Allgemeine Java-Themen 10
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
G Java Reflection Allgemeine Java-Themen 11
N Reflection: NoSuchMethodException obwohl Methode existiert Allgemeine Java-Themen 2
M reflection in inner classes Allgemeine Java-Themen 7
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
Y Reflection und "extends" Schlüsselwort Allgemeine Java-Themen 3
N getName() of reflection Object Allgemeine Java-Themen 4
P Reflection - Wie rufe ich die Felder einer Klasse in einer Methode der Basisklasse? Allgemeine Java-Themen 4
M Reflection Queue auslesen Allgemeine Java-Themen 6
N generic reflection Allgemeine Java-Themen 5
megachucky Java Reflection -> versteckte Felder finden? Allgemeine Java-Themen 3
MQue Reflection Exception Allgemeine Java-Themen 11
ruutaiokwu Per Reflection membervariablen überschreiben / zuweisen / nullen Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
R Reflection: Membervariablen-Initialwerte Allgemeine Java-Themen 4
G Reflection Allgemeine Java-Themen 6
V reflection in java 5 und 6 Allgemeine Java-Themen 2
C Reflection Übergabeparamter überprüfen? Allgemeine Java-Themen 3
Ark Konstruktor per Reflection nicht bekannt Allgemeine Java-Themen 4
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
G [Reflection + WebService] Methodenaufruf an einem Proxy Allgemeine Java-Themen 11
T Parameternamen mit Reflection-API Allgemeine Java-Themen 14
M reflection mit parametern Allgemeine Java-Themen 8
M Reflection Frage Allgemeine Java-Themen 7
G Code vereinfachen bei Reflection Allgemeine Java-Themen 4
I reflection get inner static classes Allgemeine Java-Themen 2
C Reflection Allgemeine Java-Themen 12
Y Reflection - wie kann ich eine Methode benutzen Allgemeine Java-Themen 4
P Java Reflection API - ResultDataModel ? Allgemeine Java-Themen 3
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
G Reflection: aktuelle bzw umschliessende Methode? Allgemeine Java-Themen 7
G per Reflection auf private Klassenattribute zugreifen? Allgemeine Java-Themen 9
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
M per reflection private attributsnamen auslesen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
G Object cast via Reflection Allgemeine Java-Themen 8
T Reflection und Typsicherheit Allgemeine Java-Themen 5
Q Umgang mit Reflection Allgemeine Java-Themen 4
S reflection Allgemeine Java-Themen 12
X Reflection performant? Allgemeine Java-Themen 11
M Reflection und Serializable Allgemeine Java-Themen 5
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
the[V]oid Primitive Arrays per Reflection erzeugen? Allgemeine Java-Themen 2
W Package via Reflection parsen Allgemeine Java-Themen 4
R Interface mittels Reflection implementieren Allgemeine Java-Themen 8
M reflection Integer != int ? Allgemeine Java-Themen 3
M reflection invoce Allgemeine Java-Themen 3
K Reflection:Zugriff auf innere Klassen Allgemeine Java-Themen 4
N NoSuchMethodException bei Reflection-Versuch, aber warum? Allgemeine Java-Themen 3
byte Methodenaufruf per Reflection? Allgemeine Java-Themen 2
M Generics und Reflection Allgemeine Java-Themen 3
M Array per Reflection manipulieren Allgemeine Java-Themen 5
M Klassen von ausserhalb des Jars per Reflection nachladen Allgemeine Java-Themen 2
thE_29 Reflection Allgemeine Java-Themen 6
M statische Methode per reflection aufrufen Allgemeine Java-Themen 2
B Frage zu Reflection Allgemeine Java-Themen 3
clemson Reflection Interface Allgemeine Java-Themen 4
G mit reflection an die felder einer klasse rankommen Allgemeine Java-Themen 4
N Reflection: An Package einer .class-Datei kommen Allgemeine Java-Themen 2
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
B Reflection Allgemeine Java-Themen 10
C Reflection und variable casten ! Allgemeine Java-Themen 10
C Reflection - Kurze Beschreibung? Allgemeine Java-Themen 3
F Frage zum Thema Reflection Allgemeine Java-Themen 13

Ähnliche Java Themen


Oben