Als Anwendungsbeispiel soll die Oberfläche, in der die Schiffe des Spielers platziert werden können, internationalisiert werden. Hierzu wird die Klasse SchiffFenster verwendet, die bereits in Kapitel 4.6 erläutert wurde. Zuerst werden alle Textbausteine, die bisher hart im Code verdrahtet waren, in zwei Properties Files gespeichert (File 1, File 2). # Properties File fuer Deutsche Version Textlabel1 = Zum Setzen der Schiffe bitte Anfangs- und Endposition mit der Maus markieren Textlabel2 = Zum Entfernen der Schiffe bitte Anfangs- und Endposition nochmals mit der Maus markieren ship2 = 2-er Schiff ship31 = 3-er Schiff 1 ship32 = 3-er Schiff 2 ship4 = 4-er Schiff ship5 = 5-er Schiff readybutton = Fertig # Properties File for English Version Textlabel1 = To set ship mark start and end position with mouse Textlabel2 = To delete ship mark start and end position with mouse again ship2 = 2-Ship ship31 = 3-Ship 1 ship32 = 3-Ship 2 ship4 = 4-Ship ship5 = 5-Ship readybutton = Ready Die in den Properties Files verwendeten Variablennamen müssen anschließend im Code der Klasse SchiffFenster reflektiert werden. Die neue Klasse SchiffFenster sieht dann wie folgt aus: import java.awt.*; import java.awt.event.*; import java.applet.*; import java.util.*; public class SchiffFenster extends Frame implements ActionListener{ SpielCanvas sc1; Spielfeld s; Quadrate q[]; Panel southPanel; // für die zwei Info Zeilen Panel centerPanel; // Spielfeld und panel 2 Label label1; //1. Informationszeile Label label2; //2. Informationszeile Label label3; // Label der einzusetzenden Schiffe Panel panel1; // Panel zur Platzierung der Schiffe Panel panel2; // Panel fuer Schiffe, Bezeichnungen und // des fertig-Buttons Container c; //Internationalisierungsinformation String language; String country; Locale currentLocale; ResourceBundle messages; Die letzten vier Variablen sind zur Internationalisierung der Klasse notwendig. Es sollte auch darauf geachtet werden, dass das Package java.util importiert wird. Der Konstruktor der Klasse wird wie folgt verändert: public SchiffFenster(Spielfeld s, Container c) { language = new String("en"); country = new String("US"); currentLocale = new Locale(language, country); messages = ResourceBundle.getBundle("MessagesBundle",currentLocal e); Im Beispiel wird der US-amerikanische Text für die Benutzeroberfläche eingebunden, wozu auf das Properties File MessagesBundle_en_US.properties zugegriffen wird. Die nun folgenden Anweisungen sind mit den in Kapitel 4.6 angegebenen Kommandos identisch. this.s = s; this.c = c; s.initialisieren(); q = new Quadrate[5]; setLayout(new BorderLayout(0,0)); setSize(300,250); centerPanel = new Panel(); centerPanel.setLayout(new GridLayout(1,2,0,0)); centerPanel.setBounds(0,0,300,220); add("Center", centerPanel); //Spielfeld des Benutzers sc1 = new SpielCanvasPos2(s, q); centerPanel.add(sc1); //Infofelder panel2 = new Panel(); panel2.setLayout(new GridLayout(5,1,3,3)); centerPanel.add(panel2); In den nun folgenden Anweisungen werden die Informationsfelder der Schiffe angelegt. Hierbei wird internationalisierter Text verwendet. Anstatt diesen direkt anzugeben, werden die Daten, die im Properties File gespeichert sind, eingefügt. zeigeQuadrat(messages.getString("ship2"), false, 0); zeigeQuadrat(messages.getString("ship31"), true,1); zeigeQuadrat(messages.getString("ship32"), true, 2); zeigeQuadrat(messages.getString("ship4"), true, 3); zeigeQuadrat(messages.getString("ship5"), true, 4); southPanel = new Panel(); southPanel.setLayout(new GridLayout(2,1,0,0)); southPanel.setBounds(0,220,426,0); add("South", southPanel); label1 = new Label(messages.getString("Textlabel1"), Label.LEFT); label1.setBounds(0,0,426,23); southPanel.add(label1); label2 = new Label(messages.getString("Textlabel2"), Label.LEFT); label2.setBounds(0,23,426,23); southPanel.add(label2); } In der nun folgenden Methode zeigeQuadrat wird der fertig-Button internationalisiert. protected void zeigeQuadrat(String name, boolean val, int schiffNummer) { panel1 = new Panel(); panel1.setLayout(null); q[schiffNummer] = new Quadrate(s, schiffNummer); q[schiffNummer].setBounds(5,5,20,20); panel1.add(q[schiffNummer]); label3 = new Label(name); label3.setBounds(30,5,100,20); panel1.add(label3); // Anlegen der Buttons if (val==false){ //Internationalisierte Version Button fertig = new Button(messages.getString("readybutton")); fertig.setBounds(130,5,60,30); panel1.add(fertig); fertig.addActionListener(this); } panel2.add(panel1); } Die noch fehlenden Komponenten der Klasse SchiffFenster sind im Folgenden der Vollständigkeit halber angegeben. Die weiteren Klassen des Beispiels, wie auch der Text der Fehlermeldung, wurden hierbei nicht internationalisiert. Dies sei dem Leser zur Übung überlassen. Die Bildschirmausgabe der internationalisierten Version ist in Abb. 6-1angegeben. Abb. 6.1: Internationalisierte (US-amerikanische) Version der Benutzeroberfläche public void actionPerformed(ActionEvent e) { if (s.schiffZahl == 0){ repaint(); setVisible(false); s.schiffZahl = 17; s.spielfeldFertigstellen(); c.setSize(c.getSize().width+1, c.getSize().height+1); } else { Object anker = sc1.getParent(); while (! (anker instanceof Frame)) anker = ((Component) anker).getParent(); FehlerFenster dialog = new FehlerFenster((Frame)anker, "Erst alle Schiffe setzen!!"); dialog.setVisible(true); dialog.setSize(150,100); } } }