Anwendungsbeispiel

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).

code 

# 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:

code 

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:

code 

    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.

code 

    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.

code 

      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.

code 

    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.

international 

Abb. 6.1: Internationalisierte (US-amerikanische) Version der Benutzeroberfläche

code 

    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);

      }

    }

}


SPNavRight SPNavRight SPNavRight
BuiltByNOF