# Locale mit JCombobox umschalten



## dudu3k (12. Mrz 2008)

hallo,

ich habe ein program geschrieben, und die Umschaltung der Locale geht nicht. Zu diesem Bug habe ich nun einen Auszug erstellt. Wenn man die Sprache in der JCombobox umschaltet, dann gehen die Buttons irgendwie nicht mehr!? wer weiss Rat?


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.plaf.*;
import javax.swing.LookAndFeel.*;
import javax.swing.BorderFactory;
import javax.swing.plaf.basic.*;
import java.util.*;

public class ShockCfg extends JPanel implements ActionListener
{
   public JFrame vonbraun;
   public JPanel nix;
   static ResourceBundle txt;
   public JButton speicherButton, abbruchButton;
        public JRadioButton engBox, deuBox;
   public ButtonGroup langBoxes;
   public GridBagLayout gb;
   public GridBagConstraints gbc;
   public JLabel langtext;
   public String[] langs;
   public JComboBox langlist;
   public JLabel langLabel;
   public JPanel vonbraunPanel;
   
   public void actionPerformed(ActionEvent a)
   {
      if(a.getActionCommand().equalsIgnoreCase(ShockCfg.txt.getString("ButtonButtonAbb")))
         System.exit(0);
      if(a.getActionCommand().equalsIgnoreCase(ShockCfg.txt.getString("ButtonButtonSave")))
      {
                        System.exit(0);
      }
   }

   public ShockCfg()
   {
      Locale sprache = Locale.getDefault();
      try
          {
         System.out.println(sprache.getLanguage());
         txt = ResourceBundle.getBundle("resources.MyTextResource", sprache);
      }
      catch ( MissingResourceException e )
      {
         System.err.println( e );
      }
      
      vonbraun = new JFrame();
      vonbraun.setLayout( new FlowLayout());
      vonbraunPanel = new JPanel();
      vonbraun.add(vonbraunPanel);
      vonbraunPanel.setBorder(BorderFactory.createLineBorder(Color.green));
      vonbraunPanel.setOpaque(true);
      nix = new JPanel();
      nix.setLayout(gb = new GridBagLayout());
      gbc = new GridBagConstraints();
      langtext = new JLabel(ShockCfg.txt.getString("ButtonLabelLang"));
      gbc.gridx = 0;
      gbc.gridy = 0;
      gbc.gridwidth = 1;
      gbc.gridheight = 1;
      nix.add(langtext, gbc);
      langLabel = new JLabel(ShockCfg.txt.getString("MainLabelLang"));
      String[] langs = {ShockCfg.txt.getString("MainDeuLang"), ShockCfg.txt.getString("MainEngLang")};
      langlist = new JComboBox(langs);
      langlist.setBorder(BorderFactory.createLineBorder(Color.green));
       langlist.setEditable(true);
      langlist.setOpaque(true);
      langlist.setMaximumSize(new Dimension(99, 33));
   gbc.gridx = 1;
   gbc.gridy = 0;
       nix.add(langlist);
      langlist.addItemListener(new ItemListener(){
         public void itemStateChanged(ItemEvent e) {
            if(e.getStateChange()==ItemEvent.SELECTED)
            {
               JComboBox cbe = (JComboBox)e.getItemSelectable();
               String str81 = (String)cbe.getSelectedItem();
               if(str81.contains("Englisch"))
               {
                  System.out.println("en");
                  Locale en = new Locale("EN");
                  setLoc(en);
               }
               if(str81.contains("German"))
               {
                  System.out.println("de");
                  Locale d = new Locale("DE");
                  setLoc(d);
               }
            }}});
      
      speicherButton = new JButton(ShockCfg.txt.getString("ButtonButtonSave"));
           speicherButton.setMnemonic(KeyEvent.VK_E);
      speicherButton.setRolloverEnabled(false);
      speicherButton.setBorder(BorderFactory.createCompoundBorder(
         BorderFactory.createLineBorder(Color.green),
         BorderFactory.createEmptyBorder(5,5,5,5)
      ));
      gbc.gridx = 5;
      gbc.gridy = 1;
      gbc.gridwidth = 1;
      gbc.gridheight = 1;
      nix.add(speicherButton, gbc);
      speicherButton.addActionListener(this);
          abbruchButton = new JButton(ShockCfg.txt.getString("ButtonButtonAbb"));
      abbruchButton.setMnemonic(KeyEvent.VK_A);
          abbruchButton.setSelected(true);
      abbruchButton.setRolloverEnabled(false);
      abbruchButton.setBorder(BorderFactory.createCompoundBorder(
         BorderFactory.createLineBorder(Color.green),
         BorderFactory.createEmptyBorder(5,5,5,5)
      ));
          gbc.gridx = 6;
      gbc.gridy = 1;
      gbc.gridwidth = 1;
      nix.add(abbruchButton, gbc);
          abbruchButton.addActionListener(this);
      vonbraun.getContentPane().add(nix);
      
      vonbraun.setSize(640,480);   //wo Groesse einstellen?
      vonbraun.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);   //EXIT_ON_CLOSE?
      vonbraun.setVisible(true);   //Fenster undursichtig
   }

   public static void setLoc(Locale loca)
   {
      Locale sprache = loca;
      JComponent.setDefaultLocale(sprache);
      Locale.setDefault(sprache);
      ShockCfg.txt = ResourceBundle.getBundle("resources.MyTextResource", sprache);
                System.out.println("errln");
   }
   
   public static void main(final String args[])
   {
      ShockCfg shock = new ShockCfg();
   }
}
```

Die Resourcen stehen im Ordner resources in MyTextResource.properties Dateien.


```
MainLabelLang=Sprache:
MainDeuLang=Deutsch
MainEngLang=Englisch
ButtonLabelLang=Sprache von ShockCfg:
ButtonRadioGer=Deutsch
ButtonRadioEng=Englisch
ButtonButtonSave=Speichern
ButtonButtonAbb=Abbrechen
WriteCfgDia1=Bitte waehlen sie das System Shock 2 Verzeichnis aus!
WriteCfgDia2=Auswaehlen
WriteCfgErr=Fehler beim Erstellen der Datei ShockCfg.cfg
ShockHelp=Hilfe:
RCCErrFehler=Fehler beim lesen der cam.cfg.
RICErrFehler=Fehler in der install.cfg! Falsche Sprache!
RICErrFehler3=Fehler beim lesen der install.cfg.
RSCErrFehler=Fehler beim lesen der shock.cfg.
RUCErrFehler=Waffenverschleiss zu klein oder zu gross!
RUCErrFehler2=user.cfg existiert nicht
RUCErrFehler6=lower spam min zu klein oder zu gross!
RUCErrFehler7=raise spam rand zu klein oder zu gross!
RickErrThr=Fehler Thread unterbrochen.
ShockPriHelp=Hilfe: java ShockCfg [help|xerxes|citadell|version]
WCCErrFehler=Fehler beim schreiben der cam.cfg.
WCCErrFehler2=Error
WICErrFehler=Fehler beim schreiben der Install.cfg.
WICErrFehler2=Dateifehler: install.cfg
WSCErrFehler=Fehler beim schreiben der Shock.cfg.
WSCErrFehler2=Dateifehler: Shock.cfg
WUCErrFehler=Error user.cfg
```


----------



## SlaterB (13. Mrz 2008)

hmm, kannst du das näher beschreiben,
wieso gehen die Buttons nicht mehr, irgendwelche Exceptions oder sonstige Hinweise?

bei mir geht alles,

oder stört dich nur, dass sich die Sprache nicht ändert?


----------



## dudu3k (13. Mrz 2008)

wie ich gesagt habe, wenn man de sprache auf englisch umstellt, gehen danach die buttons nicht mehr!


----------



## SlaterB (13. Mrz 2008)

nunja, diese Beschreibung bringt eben nix,
da sie keinen Fehler vermuten läßt und nicht reproduzierbar ist,

nix zu machen


----------



## dudu3k (13. Mrz 2008)

welche java version verwendest du?
ich hab die version b24 von java.net, vieleicht ist das ja ein bug.


----------



## SlaterB (13. Mrz 2008)

Compiler von Eclipse, 5.0
JRE jdk1.5.0_04


----------



## dudu3k (14. Mrz 2008)

von wo hast du das java?
bei mir tritt der fehler nämlich mit dem 1.5.0_12-b04 trotzdem auf! und das ist diesmal die version von sun!


----------



## SlaterB (14. Mrz 2008)

es macht keinen Sinn hier über Versionen nachzudenken,
das ist normaler Code der überall normal läuft

meine ist wahrscheinlich normal von Sun, habe ich aber nicht selber geladen (auf der Arbeit)


----------



## dudu3k (14. Mrz 2008)

eigentlich müsste bei dir der fehler auftretten, da meine java-version neuer ist als deine! kann sich dem problem vieleicht noch jemand annehmen, bei dem der fehler auftitt? ein kurzes post, falls der fehler nicht auftritt, wäre auch hilfreich!
big thx


----------



## dudu3k (14. Mrz 2008)

kann das niemand testen???

SlaterB: hast du mit 3 locale dateien getestet?


----------



## Wildcard (14. Mrz 2008)

Natürlich geht das nicht mehr. Wie kommt man auch auf die Idee auf ein lokalisiertes Action Command zu prüfen das man nicht explizit setzt und dann mit dem Locale zu spielen?  :autsch:


----------



## dudu3k (14. Mrz 2008)

was? ich versteh nur bahnhof!  :autsch: 
was hab ich denn da falsch gemacht, und wie mahe ich es richtig?


----------



## Wildcard (14. Mrz 2008)

Benutz keine ActionCommands. Falls du davon aber nicht lassen kannst, dann setz sie explizit und koppel das nicht an die Resourcen.


----------



## dudu3k (14. Mrz 2008)

ach so, ich dachte ich verwende die locale, die ich grade geändert hab im event!

muss wohl doch noch mal was über events erst lesen! eine empfelung auf deutsch vieleicht, der herr?

danke  :roll:


----------



## Wildcard (14. Mrz 2008)

Ein Event kennt kein Locale, dein Problem sind die ActionCommands.


----------



## dudu3k (15. Mrz 2008)

mit setLoc werden normal noch die Localen gesetzt, und das funktoniert auch. aber was ist das problem bei den ActionCommands? in denen schreibe ich nur dateien und beende das program. darf ich also den buttons keine actionlistener zuweisen? was dann? thx


----------



## dudu3k (15. Mrz 2008)

ich habe jetzt itemListener verwendet, aber jetzt passirt gar nicht wenn ich die buttons  drücke. in der api und im tutorial bei buttons habe ich nichts gefunden!


----------



## dudu3k (15. Mrz 2008)

```
speicherButton.addItemListener(new ItemListener()
{
   public void itemStateChanged(ItemEvent a)
   {
      if(a.getStateChange()==ItemEvent.SELECTED)
         System.exit(0);
   }
}
```


----------



## dudu3k (15. Mrz 2008)

das implements habe ich entfernt. folgender code geht leider auch nicht, das ergebnis ist das selbe, system.exit(0) geht nicht!?   

```
speicherButton.addActionListener(new ActionListener()
{
   public void actionPerformed(AvtionEvent a)
   {
      System.exit(0);
   }
}
```


----------



## dudu3k (15. Mrz 2008)

ist ja heut nacht nicht vil los hier! okay ich werde diesen code verwendn  :meld: 

```
public void actionPerformed(ActionEvent a)
{
   if((a.getActionCommand().equalsIgnoreCase("Abbrechen"))||(a.getActionCommand().equalsIgnoreCase("Abort")))
      System.exit(0);
}
```


----------

