Sprache umstellen.

Status
Nicht offen für weitere Antworten.

DocMcFly

Bekanntes Mitglied
Ich bin an einer Software mit Unterstützung für mehrere Sprachen. Nun würde ich gerne im Start-Einrichtung-Assistenten die Möglichkeit bieten die Sprache um zustellen und wenn man okay klick - WUSCH .- alles auf ... was auch immer : zB Englisch oder Britisch oder amerikanische Sprache oder vielleicht auf bairisch

Naja... Aber wie kann ich die Fenster "reset"en von einer Sub-Klasse aus?

Ich hab einen Container - dem verschieden Panel via CardLayout geladen werden unteranderem auch die Spracheinstellung. Wenn ich den im Panel - Spracheinstellung die Sprach gewählt habe, soll sich auch der Container-Frame und alle Panels ändern.

Ich hab es damit versucht ...
Code:
        this.getParent().getParent().setLocale(local);
        this.getParent().getParent().setVisible(false);
        this.getParent().getParent().setVisible(true);

auch noch mal repaint.... aber nix .. die Texte scheinen nicht neu gelesen zu werden. Wie kann ich einen Rundumschlag machen kann man den Parent-reinitialisieren?


Geht das überhaupt?

Clemens
 

DaRolla

Mitglied
hi clemens,

ich hab da mal eine lösung gefunden, die erst auf den 2. blick (meines erachtens) smart ist.

in swing hat man häufiger das problem das man aus sub-komponenten eine funktion (und sei es ein refresh) der parent-komponenten anstossen will.

genaugenommen muss man also ne referenz der parents übergeben, z.b. im konstruktor.

da aber alle komponenten einen unterschiedlichen typ haben der sich nicht (ohne weiteres) über einen kamm schehren lässt, bietet sich dieses interface an.

also alle gui komponenten (z.b. fenster, baum, blätter, ...) implementieren dieses interface:

Code:
/**
 * [b]<code>ModelParent</code>[/b] stellt sicher, dass die Modellklassen
 * fuer das Gui ihre eigene Oberklasse kennen.
 */
public interface ModelParent {
    
    /**
     * Gibt die eigene Oberklasse zurueck.
     * @return <code>ModelParent</code> - die Oberklasse.
     */
    public ModelParent getModelParent();


    /**
     * Setzt die eigene Oberklasse.
     * @param newParent <code>ModelParent</code> neue Oberklasse.
     */
    public void setModelParent( ModelParent newParent );

}//interface

gruß
DaRolla
 

DaRolla

Mitglied
ps: und denk daran alle texte in eine properties datei zu stecken, dann kannst du einfach eine (anders sprachliche) properties laden und dadurch die sprache umschalten...
 

DaRolla

Mitglied
deutsch.properties:
label1 = Name
label2 = Addresse
label3 = Stadt
...

english.properties:
label1 = name
label2 = adress
label3 = city
...
 

DocMcFly

Bekanntes Mitglied
:roll: mmmh... ich bin nicht so bewandert in Java aber, wie soll mir das helfen?


Also ich hab einfach mal
Code:
        System.out.println(this.getParent().getParent().toString());

rein gepackt und bekomme folgendes:


  • client.gui.Assistent[dialog0,326,232,500x400,invalid,layout=java.awt.GridBagLayout,modeless,title=]
    client.gui.Assistent[dialog0,326,232,500x400,layout=java.awt.GridBagLayout,modeless,title=]

daraus schließe ich, mit .getParent().getParent() bin ich schon an der richtigen Stelle ... aber wie löse ich jetzt einen reset aus?

Zum PS. bein netbeans gibt es ja schon ne fertige MehrSprachenUnterstützung - mittels Properties. Wenn ich gleich am Anfang die Sprache mittels

Code:
  java.util.Locale.setDefault(new java.util.Locale("en"));

auf English schalte gehts... aber wie im laufenden Prozess? Ich verstehe nicht wo ich da das interface einsetze.... und ist das nicht unglaublich viel Arbeit, bei allen GUI-Elementen noch das interface einbaue?

:bahnhof:

Gruß Clemens
 

DaRolla

Mitglied
Okay, du hast Recht. Ich dachte du hättest eine Model-View-Control trennung. Egal...

getParent() liefert immer ein Contrainer.

und z.b. JTextArea erbt von Contrainer, wie schätzungsweise alle
Swing Komponenten.

Suche dir doch einfach die Methode aus Container aus, die du brauchst, z.b. repaint();

Oder du castest dir das zurecht:

Mir ist deine Hierachie nicht ganz klar, nehmen wir mal an wir sind in einer JTextArea, die in einer JScrollPane steckt.

Container c = textArea.getParent();

Das liefert dir die JScrollPane, allerdings nur als Superklasse Container. Jetzt also noch der Cast:

JScrollPane sp = (JScrollPane)(textArea.getParent());

Ich denke auf die Art und Weise kommst du bis auf JFrame oder JWindow hoch.

Gruß
DaRolla
 

DocMcFly

Bekanntes Mitglied
Danke für Deine Geduld... Während ich auf Deine Antworten sehnsüchig *bitte nicht falsch verstehen* warte, probiere ich wild herum. Hier sind meine wenigen Erkenntnisse.

also ich hatte folgenden Ansatz:
Code:
this.getParent().....getParent().setLocal( en );

und dann wenn das Fenster neugezeichnet wird, gibts auch neue Sprache. aber: UnterElemente vom MainFrame übernehmen die Sprache nicht... theoretisch müsste ich ihm alles neuzeichnen...

noch zu Orientierung:
so werden bei mir die Button beschriftet.

Code:
jButton1.setText(tools.delUnderline(java.util.ResourceBundle.getBundle("vpsclient/gui/LanguageSet").getString("check")));

Scheinbar wird das aber nicht wieder aufgerufen... trotz:
Code:
        this.getParent().getParent().getParent().setLocale(local);
        this.getParent().getParent().getParent().invalidate();
        this.getParent().getParent().getParent().validate();
        this.getParent().getParent().getParent().repaint();
 

DaRolla

Mitglied
soweit ich das versteh läuft das alles vernünftig.
weiss jetzt auch nicht worans liegen kann. :(

vielleicht machst du ja einfach einen kleinen Fehler, den man leicht übersieht. ich empfehle logging (siehe auch meinen anderen beitrag "swt -> log4j")

überprüfe einfach mal alles. wird der neue text für die buttons auch gefunden? oder kommt da irgendwo n leerstring durch? gibt ne nullpointerexception die du fängst aber nicht verarbeitest? wird die methode mit dem setzen der neuen texte für die buttons auch aufgerufen?

*dir die daumen drück*

gruß
DaRolla
 

DocMcFly

Bekanntes Mitglied
also ich expermentier die Weihnachtstage über .. nix zu tun ;-)

und poste dann die Lösung...

Clemens :idea:
 

DaRolla

Mitglied
mir fällt noch was ein :)

wenn du die sprache umgeschaltet hast, dass aber grafisch nicht dargestellt wird, kannst du überprüfen, ob es ein repaint problem ist, indem du das applikationsfenster einfach mal sehr weit aus deinem windows desktop rausziehst und dann wieder rein ziehst.

windows meldet dann der applikation ein repaint (klar, war ja auch ausserhalb der sichtbaren grenzen) und dann sollte das auf höchster ebene repaintet werden.

wirst du aufgerufen, dann hast du ein repaint problem.

wenn nicht (und darauf tippe ich) liegt an anderen gründen, die sich per logging überprüfen lassen; z.b. an der stelle wo du die labels neu beschriftest.

oder kann es sein dass du aus versehen in den verschiedenen sprach properties die gleichen (z.b. deutschen) texte benutzt? ist mir schon mal passiert... wollte erst später in ruhe übersetzen... ;)

Gruß
DaRolla
 
B

bygones

Gast
hab nicht alles hier gelesen - aber meines Wissens ist es nicht möglich die Spracheinstellungen des Computers während der Laufzeit ändern...

das anzeigen von individuellen Texten ist möglich und auch änderbar - mehr aber nicht

falls es doch gehen sollte her damit ;)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben