Stringbuilder mit print ausgeben

Kotelettklopfer

Bekanntes Mitglied
Ich brauche bitte nocheinmal einen Rat.

Um das ganze weiterzuspinnen, habe ich die Überprüfung auf maximal 64 Zeichen in eine extra Methode gebaut.
Vorher wurde der Code direkt in der Methode "start" ausgeführt, nun läuft das ganze über oben benannte Methode, welche dann innerhalb Start ausgeführt wird. Als Parameter / Argument gebe ich einen String "language" an, damit er weiß welche Sprache nun benötigt wird.

Diese Methode "wrongUserEntryDiffLanguage" (verzeiht den Namen) funktioniert wie sie soll, aber der ein oder andere mag es von früher noch kennen.
Ich stehe am Anfang und alles was funktioniert ist erstmal toll, aber ich frage mich gerade ob meine Auslagerung in eine extra Methode hier so überhaupt Sinn macht !?

Ich sehe keinen Mehrwert an dieser Methode im Vergleich zum alten Vorgehen. Der Code wird/wurde auch hier einmal geschrieben.

[CODE lang="java" title="Applikation.java" highlight="28, 88..131"]import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.util.Scanner;

public class Application {

Scanner sc = new Scanner(System.in);
int numberOfChars;
int counter = 0;
String generatedPW;

public void start() {

System.out.println("Bitte wähle eine Sprache: ");
System.out.println("Please choose a language: ");
System.out.println("Veuillez choisir une langue: ");
System.out.println("DE / EN / FR");

String language = sc.next();

switch (language) {


case "DE", "de", "De":
System.out.println("Wie viele Zeichen soll ihr Passwort beinhalten?");
numberOfChars = sc.nextInt();

wrongUserEntryDiffLanguage("DE");

generatedPW = PasswordUtils.createPassword((numberOfChars));


System.out.println("Soll das neue Passwort in die Zwischenablage kopiert werden (J/N) ?");
String copyChoice = sc.next();

if (copyChoice.equalsIgnoreCase("J")) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
new StringSelection(generatedPW), null);
}

System.out.println("Neues Passwort: " + generatedPW);
break;

case "EN", "en", "En":
System.out.print("How many characters should your password contain?");
numberOfChars = sc.nextInt();

wrongUserEntryDiffLanguage("EN");

generatedPW = PasswordUtils.createPassword((numberOfChars));


System.out.println("Should the new password be copied to the clipboard (Y/N) ?");
copyChoice = sc.next();

if (copyChoice.equalsIgnoreCase("Y")) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
new StringSelection(generatedPW), null);
}

System.out.println("New password: " + generatedPW);
break;

case "FR", "fr", "Fr":
System.out.print("Combien de caractères votre mot de passe doit-il contenir ?");
numberOfChars = sc.nextInt();

wrongUserEntryDiffLanguage("FR");

generatedPW = PasswordUtils.createPassword((numberOfChars));


System.out.println("Si le nouveau mot de passe doit être copié dans le presse-papiers (O/N) ?");
copyChoice = sc.next();

if (copyChoice.equalsIgnoreCase("O")) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
new StringSelection(generatedPW), null);
}

System.out.println("Nouveau mot de passe: " + generatedPW);

}


}

public void wrongUserEntryDiffLanguage(String language) {

switch (language) {
case "DE":

while (numberOfChars > 64 && counter < 3) {
System.out.println("Die maximale Passwortlänge beträgt 64 Zeichen");
System.out.println("Wie viele Zeichen soll ihr Passwort beinhalten?");
numberOfChars = sc.nextInt();
counter++;
}

if (numberOfChars > 64 && counter == 3) {
System.out.println("Das Programm wird aufgrund mehrfacher Falscheingabe beendet");
System.exit(0);
}
break;

case "EN":

while (numberOfChars > 64 && counter < 3) {
System.out.println("The maximum password length is 64 characters");
System.out.println("How many characters should your password contain?");
numberOfChars = sc.nextInt();
counter++;
}
if (numberOfChars > 64 && counter == 3) {
System.out.println("The program is terminated due to multiple incorrect entries");
System.exit(0);
}
break;

case "FR":

while (numberOfChars > 64 && counter < 3) {
System.out.println("La longueur maximale du mot de passe est de 64 caractères");
System.out.println("Combien de caractères votre mot de passe doit-il contenir?");
numberOfChars = sc.nextInt();
counter++;
}
if (numberOfChars > 64 && counter == 3) {
System.out.println("Le programme est interrompu en raison de plusieurs entrées incorrectes.");
System.exit(0);
}


}

}
}[/CODE]

Zeile 28: Hier stand vorher der kompl. Code für die jeweilige Sprache nun greift die Methode
Zeile 88..131: Diese Methode habe ich gebaut und frage mich ob es Sinn macht xD
 

Jw456

Top Contributor
Das erstellen und benutzen der Methode hat schon mal einen Sinn denn du benutz ja den Code schon dreimal in dem Switch. Sonnst müsstest du ihn ja dort dreimal schreiben.

Für die Ausgaben in den verschiedenen Sprachen wurde dir doch schon etwas wie ein String Array empfohlen.
 

Kotelettklopfer

Bekanntes Mitglied
Das erstellen und benutzen der Methode hat schon mal einen Sinn denn du benutz ja den Code schon dreimal in dem Switch. Sonnst müsstest du ihn ja dort dreimal schreiben.

Für die Ausgaben in den verschiedenen Sprachen wurde dir doch schon etwas wie ein String Array empfohlen.
Na das ja eben nicht. In der Methode "wrongUserEntryDiffLanguage" habe ich switch cases die auf eine Sprache filtern. Diese Methode nutze ich allerdings in einer anderen Methode "start" an einer Stelle wo schon klar ist welche Sprache benötigt wird.
Würde ich in "start" nicht die "wrongUserEntryDiffLanguage" nutzen sondern den Code so hinschreiben, sähe das so aus :

[CODE lang="java" highlight="17..27, 47..56"]public void start() {

System.out.println("Bitte wähle eine Sprache: ");
System.out.println("Please choose a language: ");
System.out.println("Veuillez choisir une langue: ");
System.out.println("DE / EN / FR");

String language = sc.next();

switch (language) {


case "DE", "de", "De":
System.out.println("Wie viele Zeichen soll ihr Passwort beinhalten?");
numberOfChars = sc.nextInt();

while (numberOfChars > 64 && counter < 3) {
System.out.println("Die maximale Passwortlänge beträgt 64 Zeichen");
System.out.println("Wie viele Zeichen soll ihr Passwort beinhalten?");
numberOfChars = sc.nextInt();
counter++;
}

if (numberOfChars > 64 && counter == 3) {
System.out.println("Das Programm wird aufgrund mehrfacher Falscheingabe beendet");
System.exit(0);
}

generatedPW = PasswordUtils.createPassword((numberOfChars));


System.out.println("Soll das neue Passwort in die Zwischenablage kopiert werden (J/N) ?");
String copyChoice = sc.next();

if (copyChoice.equalsIgnoreCase("J")) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
new StringSelection(generatedPW), null);
}

System.out.println("Neues Passwort: " + generatedPW);
break;

case "EN", "en", "En":
System.out.print("How many characters should your password contain?");
numberOfChars = sc.nextInt();

while (numberOfChars > 64 && counter < 3) {
System.out.println("The maximum password length is 64 characters");
System.out.println("How many characters should your password contain?");
numberOfChars = sc.nextInt();
counter++;
}
if (numberOfChars > 64 && counter == 3) {
System.out.println("The program is terminated due to multiple incorrect entries");
System.exit(0);
}

generatedPW = PasswordUtils.createPassword((numberOfChars));


System.out.println("Should the new password be copied to the clipboard (Y/N) ?");
copyChoice = sc.next();

if (copyChoice.equalsIgnoreCase("Y")) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
new StringSelection(generatedPW), null);
}

System.out.println("New password: " + generatedPW);
break;
[/CODE]

Meiner Meinung nach habe ich durch die Methode keinen Code gespart sondern eher mehr geschrieben.


Das mit dem Array muss ich überlesen haben und da muss ich auch mal drüber nachdenken wie das gehen soll :)
 
M

Mart

Gast
Ich hatte deinen Tip mit dem Sprachpaket wohl schon gelesen, dachte aber das würde sich nur auf GUI bzw. Java FX beziehen.
Dann schau ich hier mal tiefer rein.
Danke
das sprachpaket funktioniert so dass man ein paket auswählt und die strings aus dem paket mit dem jeweiligen inhalt gefüllt werden

nur weis cih nicht wie man die paket auswahl ausserhalb von fx bestimmen kann sollte aber auch gehen immerhin muss ja awt und swing usw auch sprachpakete umsetzen dh es muss irgendwie eine allgemein gültige möglichkeit geben
 

Jw456

Top Contributor
Ich würde eine Key Value Datei, Array, Tabelle machen.
Für jede Sprache mit den gleichen Key aber mit der anderen Übersetzung.

Dann baust du dir eine Methode der gibst du den Key und die gibt dir den String zurück.
Die Methode sucht dir aus der vorher gewählten Sprach Datei i den Key und gibt das Value zurück.

Das gibt es aber auch fertig. zB bei Java FX

edit ich war zulangsam
 
K

kneitzel

Gast
Auf die schnelle einfach ein Beispiel, wie man mit ResourceBundle sowas machen kann.
Zu finden ist die Doku z.B. unter https://docs.oracle.com/javase/tutorial/i18n/intro/steps.html

Die Nachrichten sind in einfachen Properties-Dateien, also einfache Textdateien, die in .properties enden.
Diese haben einen beliebigen Namen. Die Basis ist dann z.B. ein messages.properties:
[CODE title="messages.properties"]text1 = Hallo Welt!
mir.geht.es.gut = Mir geht es gut!
danke = Danke!
missing = Dies ist nicht übersetzt![/CODE]

Nun kann man das in verschiedene Sprachen und Locale übersetzen. Der Name bekommt dann ein _<Kennung>, also z.B. _de für Deutsch, _en für Englisch... _en_us / _en_uk würden so auch gehen. Machen wir eine Übersetzung:
[CODE lang="java" title="messages_en.properties"]text1 = Hello world!
mir.geht.es.gut = I feel well!
danke = Thank You![/CODE]

Und ein kleines Testprogramm:
Java:
package example;

import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

public class InternationalizingExample {
    public static void main(String[] args) {
        printMessages(ResourceBundle.getBundle("example/messages", Locale.GERMAN));
        printMessages(ResourceBundle.getBundle("example/messages", Locale.ENGLISH));
        printMessages(ResourceBundle.getBundle("example/messages", Locale.CHINESE));
    }

    public static void printMessages(ResourceBundle bundle) {
        System.out.println(bundle.getString("text1"));
        System.out.println(bundle.getString("mir.geht.es.gut"));
        System.out.println(bundle.getString("danke"));
        System.out.println(bundle.getString("missing"));
        try {
            System.out.println(bundle.getString("gibt es nicht"));
        } catch (MissingResourceException ex) {
            System.out.println("Eintrag nicht gefunden!");
        }
    }
}

Bei getBundle muss angegeben werden, wo die Resource zu finden ist. Diese .properties Dateien sind also Ressourcen (wichtig, wenn diese vom Code getrennt sind wie z.B. bei Maven oder Gradle der Standard ist!)
Da ich es jetzt parallel zu der Klasse hatte (Namespace example) ist das bei mir example/messages. Hätte ich das ResourceBundle xyz genannt und wäre in den Resourcen unter abc zu finden, dann wäre es abc/xyz.

Und bei dem Test kannst Du paar Punkte erkennen:
- Ist ein Key nicht vorhanden ("gibt es nicht"), dann gibt es eine Exception!
- Ist ein Key in der Übersetzung nicht vorhanden ("missing"), dann wird der Wert aus dem Haupt-Bundle genommen. Teilübersetzungen sind also auch möglich.

In einem Programm kannst Du also ein Bundle mit den Nachrichten haben. Dieses Bundle nutzt du. Und bei Wahl der Sprache wird dann das Bundle neu gesetzt.
Bei allen Ausgaben fragst Du dann also das Bundle.

Eine Sache, die ich gut finde:
Java:
    public static String getMessage(ResourceBundle bundle, String key, String defaultMessage) {
        try {
             return bundle.getString(key);
        } catch (MissingResourceException ex) {
            return defaultMessage;
        }
    }
(Nur als Beispiel, ich würde das ResourceBundle in einer Klasse halten, d.h. die Methode wäre nicht static und das ResourceBundle müsste man nicht als Parameter übergeben)
Dies hat aus meiner Sicht den Vorteil, dass der Code lesbar ist und bleibt. Es ist halt schon hilfreich, wenn man eine Nachricht sieht, die der Benutzer bekommt und nicht nur ein Kürzel.
(Und es soll Leute geben, die kleine Scripts schreiben, die dann nach solchen Methodenaufrufen suchen um dann zu prüfen, ob in den Textdateien alle Keys enthalten sind. :) )
 

Kotelettklopfer

Bekanntes Mitglied
Wow danke euch.
Ich muss mal schauen ob es lohnt mit dem jetzigen Stand sich schon sowas in die Birne zu hauen.
Eigentlich war der Plan ja immer das gelernte zu vertiefen.
Das hier ist nochmal eine andere Hausnummer xD
Aber hört sich interessant an und werde es definitv mal speichern für später
 
Zuletzt bearbeitet:
M

Mart

Gast
Wow danke euch.
Ich muss mal schauen ob es lohnt mit dem jetzigen Stand sich schon sowas in die Birne zu hauen.
Eigentlich war der Plan ja immer das gelernte zu vertiefen.
Das hier ist nochmal eine andere Hausnummer xD
Aber hört sich interessant an und werde es definitv mal speichern für später
sprachen pakete wirst du immer wieder brauchen bzw du kannst immer damit glänzen
ich finde es schon gut das zu können
 
K

kneitzel

Gast
Ich muss mal schauen ob es lohnt mit dem jetzigen Stand sich schon sowas in die Birne zu hauen.
Also hier geht es ja nur um eine relativ einfache Anwendung von einer Sache. Probiere es einfach einmal auf und wenn es ohne viel Aufwand läuft, dann hast Du etwas, das Du einfach immer wieder einsetzen kannst. Ich denke, dass es also einen Versuch wert sein kann. Alleine schon, damit Dein Code übersichtlicher wird.
 

Kotelettklopfer

Bekanntes Mitglied
Auf die schnelle einfach ein Beispiel, wie man mit ResourceBundle sowas machen kann.
Zu finden ist die Doku z.B. unter https://docs.oracle.com/javase/tutorial/i18n/intro/steps.html

Die Nachrichten sind in einfachen Properties-Dateien, also einfache Textdateien, die in .properties enden.
Diese haben einen beliebigen Namen. Die Basis ist dann z.B. ein messages.properties:
[CODE title="messages.properties"]text1 = Hallo Welt!
mir.geht.es.gut = Mir geht es gut!
danke = Danke!
missing = Dies ist nicht übersetzt![/CODE]

Nun kann man das in verschiedene Sprachen und Locale übersetzen. Der Name bekommt dann ein _<Kennung>, also z.B. _de für Deutsch, _en für Englisch... _en_us / _en_uk würden so auch gehen. Machen wir eine Übersetzung:
[CODE lang="java" title="messages_en.properties"]text1 = Hello world!
mir.geht.es.gut = I feel well!
danke = Thank You![/CODE]

Und ein kleines Testprogramm:
Java:
package example;

import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

public class InternationalizingExample {
    public static void main(String[] args) {
        printMessages(ResourceBundle.getBundle("example/messages", Locale.GERMAN));
        printMessages(ResourceBundle.getBundle("example/messages", Locale.ENGLISH));
        printMessages(ResourceBundle.getBundle("example/messages", Locale.CHINESE));
    }

    public static void printMessages(ResourceBundle bundle) {
        System.out.println(bundle.getString("text1"));
        System.out.println(bundle.getString("mir.geht.es.gut"));
        System.out.println(bundle.getString("danke"));
        System.out.println(bundle.getString("missing"));
        try {
            System.out.println(bundle.getString("gibt es nicht"));
        } catch (MissingResourceException ex) {
            System.out.println("Eintrag nicht gefunden!");
        }
    }
}

Bei getBundle muss angegeben werden, wo die Resource zu finden ist. Diese .properties Dateien sind also Ressourcen (wichtig, wenn diese vom Code getrennt sind wie z.B. bei Maven oder Gradle der Standard ist!)
Da ich es jetzt parallel zu der Klasse hatte (Namespace example) ist das bei mir example/messages. Hätte ich das ResourceBundle xyz genannt und wäre in den Resourcen unter abc zu finden, dann wäre es abc/xyz.

Und bei dem Test kannst Du paar Punkte erkennen:
- Ist ein Key nicht vorhanden ("gibt es nicht"), dann gibt es eine Exception!
- Ist ein Key in der Übersetzung nicht vorhanden ("missing"), dann wird der Wert aus dem Haupt-Bundle genommen. Teilübersetzungen sind also auch möglich.

In einem Programm kannst Du also ein Bundle mit den Nachrichten haben. Dieses Bundle nutzt du. Und bei Wahl der Sprache wird dann das Bundle neu gesetzt.
Bei allen Ausgaben fragst Du dann also das Bundle.

Eine Sache, die ich gut finde:
Java:
    public static String getMessage(ResourceBundle bundle, String key, String defaultMessage) {
        try {
             return bundle.getString(key);
        } catch (MissingResourceException ex) {
            return defaultMessage;
        }
    }
(Nur als Beispiel, ich würde das ResourceBundle in einer Klasse halten, d.h. die Methode wäre nicht static und das ResourceBundle müsste man nicht als Parameter übergeben)
Dies hat aus meiner Sicht den Vorteil, dass der Code lesbar ist und bleibt. Es ist halt schon hilfreich, wenn man eine Nachricht sieht, die der Benutzer bekommt und nicht nur ein Kürzel.
(Und es soll Leute geben, die kleine Scripts schreiben, die dann nach solchen Methodenaufrufen suchen um dann zu prüfen, ob in den Textdateien alle Keys enthalten sind. :) )
Ich habe jetzt in Intelij ein Resource Bundle Output erstellt und darin ein properties output und output_en
Nun scheiter ich schon beim Versuch die Dateien zu laden.



Ich arbeite mit Maven in Intelij und sage ihm als Quelle output/output bzw. output/output_en oder?
Er findet aber die File nicht.

Was mache ich hier falsch?
1632343188984.png


Als nächstes fällt mir auf, das du in der Methode "printMessages" die Texte direkt ausgeben lässt. In meinem Fall würde ich die Texte in separaten String Variablen speichern um diese dann an der benötigten Stelle auszugeben oder?

Auch verstehe ich nicht die Punkt wo das Programm erkennen soll welche Sprache gerade benötigt wird.
 
K

kneitzel

Gast
Das ResourceBundle liegt direkt im resources Ordner, daher musst du nur output angeben.

Edit: wozu noch in einem String speichern? Was willst du noch damit machen?
 

Kotelettklopfer

Bekanntes Mitglied
Das ResourceBundle liegt direkt im resources Ordner, daher musst du nur output angeben.

Edit: wozu noch in einem String speichern? Was willst du noch damit machen?
Vielleicht habe ich auch einen Denkfehler aber,
bei dir stehen alle Texte aus der propertie File hier:

public static void printMessages(ResourceBundle bundle) {
System.out.println(bundle.getString("text1"));
System.out.println(bundle.getString("mir.geht.es.gut"));
System.out.println(bundle.getString("danke"));
System.out.println(bundle.getString("missing"));
try {
System.out.println(bundle.getString("gibt es nicht"));
} catch (MissingResourceException ex) {
System.out.println("Eintrag nicht gefunden!");
}



Ich brauche sie ja aber an diversen Stellen in einer anderen Methode (Zeilen habe ich markiert)

[CODE lang="java" title="Applikation.java" highlight="15,19,20,26,33,41"] public void start() {
printMessages(ResourceBundle.getBundle("output", Locale.GERMAN));

System.out.println("Bitte wähle eine Sprache: ");
System.out.println("Please choose a language: ");
System.out.println("Veuillez choisir une langue: ");
System.out.println("DE / EN / FR");

String language = sc.next();

switch (language) {


case "DE", "de", "De":
System.out.println("Wie viele Zeichen soll ihr Passwort beinhalten?");
numberOfChars = sc.nextInt();

while (numberOfChars > 64 && counter < 3) {
System.out.println("Die maximale Passwortlänge beträgt 64 Zeichen");
System.out.println("Wie viele Zeichen soll ihr Passwort beinhalten?");
numberOfChars = sc.nextInt();
counter++;
}

if (numberOfChars > 64 && counter == 3) {
System.out.println("Das Programm wird aufgrund mehrfacher Falscheingabe beendet");
System.exit(0);
}

generatedPW = PasswordUtils.createPassword((numberOfChars));


System.out.println("Soll das neue Passwort in die Zwischenablage kopiert werden (J/N) ?");
String copyChoice = sc.next();

if (copyChoice.equalsIgnoreCase("J")) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
new StringSelection(generatedPW), null);
}

System.out.println("Neues Passwort: " + generatedPW);
break;[/CODE]



Edit: Ich glaube ich habe eine Idee <----- Ne stehe auf dem Schlauch
 
Zuletzt bearbeitet:
M

Mart

Gast

hier ist es nicht ausführlich erklärt aber ein beispiel vom source code vllt kannst du damit was anfangen und es dir zusammen fünferln


dann sollte es vom "prinzip" her funktionieren

dann musst du es nur noch in ein bundle packen und in den resource ordner bekommen nur das ist für die grund funktionalität die basis
 

temi

Top Contributor
Java:
System.out.println("Die maximale Passwortlänge beträgt 64 Zeichen");

In der Resource gibst du dem String eine Art symbolischen Namen, z. B. password.size = Die maximale Passwortlänge...

In deinem Programm gibst du den String dann über diesen Namen aus.
Java:
System.out.println(bundle.getString("password.size"));

Je nachdem welche Sprache vorher ausgewählt wurde, wird dann der symbolisch adressierte String aus dem entsprechenden Bundle ausgegeben.
 

Kotelettklopfer

Bekanntes Mitglied
Java:
System.out.println("Die maximale Passwortlänge beträgt 64 Zeichen");

In der Resource gibst du dem String eine Art symbolischen Namen, z. B. password.size = Die maximale Passwortlänge...

In deinem Programm gibst du den String dann über diesen Namen aus.
Java:
System.out.println(bundle.getString("password.size"));

Je nachdem welche Sprache vorher ausgewählt wurde, wird dann der symbolisch adressierte String aus dem entsprechenden Bundle ausgegeben.
Das habe ich so aus dem Post von Kneitzel schon verstanden.
Was mir fehlt ist das Wissen, wie ich das für meine App umsetzen weil:

Ich habe eine Methode "Start"
Dort spielt sich alles ab (außer die eigentliche Passworterstellung).
Hier habe ich einige User Eingaben die dann per System.out angezeigt werden.

Ich bekomme es nicht gebacken, die Outputs die bei Kneitzel in der PrintMethode stehen in meine Start Methode zu implementieren.

Das hat mich gestern ein paar Gehirnzellen gekostet xD

Glaube typisches Anfänger Problem.
Ich kenne die Lösung aber sie will mir nicht "aufs Papier" kommen.
 
Zuletzt bearbeitet:

Kotelettklopfer

Bekanntes Mitglied
Also, es gibt einen Lichtblick wenn auch mit einem leichten Schatten xD.

Ich bin soweit, dass ich die Texte aus der properties File ausgegeben bekomme.
Zur Zeit allerdings noch so, dass ich es über die alte switch Funktion steuer welche Sprache er ausgibt.


Java:
public void start() {


        System.out.println("Bitte wähle eine Sprache: ");
        System.out.println("Please choose a language: ");
        System.out.println("Veuillez choisir une langue: ");
        System.out.println("DE / EN / FR");

        String language = sc.next();

        switch (language) {

//User wählte in diesem Beispiel DE
            case "DE", "de", "De":

// Local wird auf DE gesetzt
                Locale.setDefault(Locale.GERMAN);

//Bundle wird geladen
                ResourceBundle bundle = ResourceBundle.getBundle("output");

//String wird aus dem DE Bundle ausgelesen anhand des Keys
                System.out.println(bundle.getString("number.of.characters"));

                numberOfChars = sc.nextInt();

Wie bringe ich ihm bei das er auch ohne die Switch/case Anweisung die richtige Sprache zieht?



@kneitzel: Wenn es in deinem Code schon erklärt war, habe ich es leider nicht kapiert
 
K

kneitzel

Gast
Du musst die Variable mit dem bundle als Instanzvariable machen. In dem Switch wird dann nur das bundle gesetzt. (Oder wenn Du das Locale selbst setzen willst: gerne. Aber den Weg finde ich nicht gut, denn da setzt du deutlich mehr. Du willst ja ggf. nicht die Formatierungen ändern sondern nur die Sprache!)

Also entweder machst Du nur sowas:
Java:
public void switchLanguage(String language) {
    switch (language) {
        case "DE", "de", "De":
            Locale.setDefault(Locale.GERMAN);
            break;
            
        case ...
    }
    bundle = ResourceBundle.getBundle("output");
}

oder

Java:
public void switchLanguage(String language) {
    switch (language) {
        case "DE", "de", "De":
            bundle = ResourceBundle.getBundle("output", Locale.GERMAN);
            break;
            
        case ...
    }
}

Die Instanzvariable kannst Du übrigens direkt initialisieren - dann ist die Sprache per default die Standard Sprache des Nutzers.
 

Kotelettklopfer

Bekanntes Mitglied
Du musst die Variable mit dem bundle als Instanzvariable machen. In dem Switch wird dann nur das bundle gesetzt. (Oder wenn Du das Locale selbst setzen willst: gerne. Aber den Weg finde ich nicht gut, denn da setzt du deutlich mehr. Du willst ja ggf. nicht die Formatierungen ändern sondern nur die Sprache!)

Also entweder machst Du nur sowas:
Java:
public void switchLanguage(String language) {
    switch (language) {
        case "DE", "de", "De":
            Locale.setDefault(Locale.GERMAN);
            break;
          
        case ...
    }
    bundle = ResourceBundle.getBundle("output");
}

oder

Java:
public void switchLanguage(String language) {
    switch (language) {
        case "DE", "de", "De":
            bundle = ResourceBundle.getBundle("output", Locale.GERMAN);
            break;
          
        case ...
    }
}

Die Instanzvariable kannst Du übrigens direkt initialisieren - dann ist die Sprache per default die Standard Sprache des Nutzers.
Ok, glaube ich habe es verstanden. Ich schau es mir gerade nochmal an.

Edit: Das mit der Variablen hatte ich erst nciht kapiert, scheint aber nun zu klappen.
 

Jw456

Top Contributor
Hallo das was dir Keintzel mit den Switch gezeigt hast brauchst du nur am Anfang einmal machen. Also du fragst den User welche Sprache er benuten möchte und setzt dann deine Bundle Variable je nachdem was der User gewählt hat.


Jetzt brauchst du für Ausgaben deine Bundle Variablen und den Key für ein printf.
System.out.println(bundle.getString("key"));
 

Kotelettklopfer

Bekanntes Mitglied
Hallo das was dir Keintzel mit den Switch gezeigt hast brauchst du nur am Anfang einmal machen. Also du fragst den User welche Sprache er benuten möchte und setzt dann deine Bundle Variable je nachdem was der User gewählt hat.


Jetzt brauchst du für Ausgaben deine Bundle Variablen und den Key für ein printf.
System.out.println(bundle.getString("key"));
Ja das hatte ich schon umgesetzt. Er kannte aber die Variable bundle nicht, weil diese noch nicht als Instanzvariable vorlag.
Ich hatte Probleme zu verstehen wie ich aus bundle eine Variable mache. Nun geht es..... hoffe ich
 

Jw456

Top Contributor
Tipp benutze eine Variable und weise ihr was zu , die IDE wird dir einen Vorschlag machen welchen Typ sie braucht. Also Klicke einfach auf die rote Variable und drücke Alt + Enter


ResourceBundle mybundle = ResourceBundle.getBundle("MyLabels");
Link in #65
 

Kotelettklopfer

Bekanntes Mitglied
Tipp benutze eine Variable und weise ihr was zu , die IDE wird dir einen Vorschlag machen welchen Typ sie braucht. Also Klicke einfach auf die rote Variable und drücke Alt + Enter
Stehe ja noch am Anfang und für mich gibt es nur sowas wie int, String, double etc.

Er macht jetzt eine Instanzvariable

ResourceBundle bundle;

Das geht????

*Füge hier einen Smilie ein dem gerade die Birne explodiert
 

Kotelettklopfer

Bekanntes Mitglied
So es funktioniert. Danke Euch.
Wenn das hängen bleibt (und dass wird es zumindest teilweise), ist das schon ne coole Sache mit den Sprachen.

@Jw456 Habe das mit der VAriablen etwas ander gemacht.

In der Klasse wurde die Variable so gesetzt:
ResourceBundle bundle;

Und initialisiert wird sie in der Methode, so wie Kneitzel schrieb.
bundle = ResourceBundle.getBundle("output");

Für die Nachwelt, noch einmal der gesamte Code.
Vielleicht hat ja nochmal jemand die selben Probleme :))

[CODE lang="java" title="Main.java"]/*
+ Auswahl der Sprache (DE/EN/FR) --> erledigt
+ Auswahl der möglichen Zeichen (Sonderzeichen/Zahlen/Groß.-Klein)

*/




public class Main {

public static void main(String[] args) {

Application app = new Application();

app.start();

}

}

[/CODE]

[CODE lang="java" title="Applikation.java"]import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Locale;
import java.util.Scanner;

public class Application {


Scanner sc = new Scanner(System.in);
int numberOfChars;
int counter = 0;
String generatedPW;
String language;
ResourceBundle bundle;


public void start() {

System.out.println("Bitte wähle eine Sprache: ");
System.out.println("Please choose a language: ");
System.out.println("Veuillez choisir une langue: ");
System.out.println("DE / EN / FR");
language = sc.next();

switchLanguage(language);

System.out.println(bundle.getString("number.of.characters"));
numberOfChars = sc.nextInt();

while (numberOfChars > 64 && counter < 3) {
System.out.println(bundle.getString("maximum.characters"));
System.out.println(bundle.getString("number.of.characters"));
numberOfChars = sc.nextInt();
counter++;
}

if (numberOfChars > 64 && counter == 3) {
System.out.println(bundle.getString("exit"));
System.exit(0);
}

generatedPW = PasswordUtils.createPassword((numberOfChars));


System.out.println(bundle.getString("clipboard"));
String copyChoice = sc.next();

if (copyChoice.equalsIgnoreCase(bundle.getString("choice"))) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
new StringSelection(generatedPW), null);
}
System.out.println(bundle.getString("new.password") + generatedPW);


}


public void switchLanguage(String language) {

switch (language) {
case "DE", "De", "de":
Locale.setDefault(Locale.GERMAN);
break;
case "EN", "En", "en":
Locale.setDefault(Locale.ENGLISH);
break;
case "FR", "Fr", "fr":
Locale.setDefault(Locale.FRENCH);
}
bundle = ResourceBundle.getBundle("output");
}


}



[/CODE]


[CODE lang="java" title="PasswordUtils.java"]import java.security.SecureRandom;
public class PasswordUtils {

public static final String DEFAULT_ALLOWED_CHARS = "0123456789abcdefghijklmnopqrstuvwABCDEFGHIJKLMNOP!§$%&?*+#";

public static final String createPassword(int length) {
return createPassword(length, DEFAULT_ALLOWED_CHARS);
}

public static String createPassword(int length, String allowedChars) {
SecureRandom random = new SecureRandom();
StringBuilder pass = new StringBuilder(length);
for (int i = 0; i < length; i++) {
pass.append(allowedChars.charAt(random.nextInt(allowedChars.length())));
}
return pass.toString();
}
}
[/CODE]



Wenn ich mir dann diese Version und die Version mit der switch Case Variante anschaue, ist das schon ne ganze menge gesparte Codezeilen.
Macht das ganze viel übersichtlicher und vorallem auch besser zum erweitern/pflegen.

TOP

Danke Euch
 

fhoffmann

Top Contributor
Hallo @Kotelettklopfer ,

du hast am 10. September in #34 geschrieben:
"Ich merke schon, bevor ich mit Grafischen Oberflächen weitermache, sollte ich das Buch weiter lesen."
Warum hälst du dich nicht an deinen Vorsatz?
 

Kotelettklopfer

Bekanntes Mitglied
Hallo @Kotelettklopfer ,

du hast am 10. September in #34 geschrieben:
"Ich merke schon, bevor ich mit Grafischen Oberflächen weitermache, sollte ich das Buch weiter lesen."
Warum hälst du dich nicht an deinen Vorsatz?
Ja, wenn ich das mal wüsste.

Neugier
Wahnsinn
Wissbegierde

Da willst du gelerntes in einem Projekt testen und festigen und zack fällt dir was neues ein was man wissen will

 

Kotelettklopfer

Bekanntes Mitglied
So langsam scheint es Früchte zu tragen.
Mein Programm fragt jetzt den User welche Zeichen berücksichtigt werden sollen und generiert daraus dann das PW.
Standard ist immer "nur Kleinbuchstaben" und der Rest ist optional.

[CODE lang="java" title="PasswordHelper.java"]import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Scanner;

public class PasswordHelper {
Scanner sc = new Scanner(System.in);
static String specialChar;
static String numeric;
static String caseSensitive;
static String allowedChars;

ResourceBundle bundle;


public void switchLanguage(String language) {

switch (language) {
case "DE", "De", "de":
Locale.setDefault(Locale.GERMAN);
break;
case "EN", "En", "en":
Locale.setDefault(Locale.ENGLISH);
break;
case "FR", "Fr", "fr":
Locale.setDefault(Locale.FRENCH);
}
bundle = ResourceBundle.getBundle("output");
}

public void allowedChars() {
System.out.println(bundle.getString("special.character"));
String specialCharChoice = sc.nextLine();

if (specialCharChoice.equalsIgnoreCase(bundle.getString("choice"))) {
specialChar = "!§$%&?*+#";
}


System.out.println(bundle.getString("numeric"));
String numericChoice = sc.nextLine();

if (numericChoice.equalsIgnoreCase(bundle.getString("choice"))) {
numeric = "0123456789";
}


System.out.println(bundle.getString("case.sensitive"));
String caseSensitiveChoice = sc.nextLine();

if (caseSensitiveChoice.equalsIgnoreCase(bundle.getString("choice"))) {
caseSensitive = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
}
allowedChars = "abcdefghijklmnopqrstuvwxyz" + specialChar + numeric + caseSensitive;

}


}
[/CODE]

Weil ich es "erstmal" nicht anders hinbekommen habe, sind die Variablen statisch.
Hätte Sie sonst nicht aus der Helper Klasse in die PasswordUtils bekommen, da der DEFAULT_ALLOWED_CHARS final static ist.

[CODE lang="java" title="PasswordUtils.java"]import java.security.SecureRandom;


public class PasswordUtils extends PasswordHelper {


public static final String DEFAULT_ALLOWED_CHARS = allowedChars;

public static final String createPassword(int length) {
return createPassword(length, DEFAULT_ALLOWED_CHARS);
}

public static String createPassword(int length, String allowedChars) {
SecureRandom random = new SecureRandom();
StringBuilder pass = new StringBuilder(length);
for (int i = 0; i < length; i++) {
pass.append(allowedChars.charAt(random.nextInt(allowedChars.length())));
}
return pass.toString();
}


}
[/CODE]

[CODE lang="java" title="PasswordGenerator.java"]import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Locale;
import java.util.Scanner;

public class PasswordGenerator {


Scanner sc = new Scanner(System.in);
int numberOfChars;
int counter = 0;
String generatedPW;
String language;

PasswordHelper helper = new PasswordHelper();


public void start() {

System.out.println("Bitte wählen Sie eine Sprache");
System.out.println("Please choose a language: ");
System.out.println("Veuillez choisir une langue: ");
System.out.println("DE / EN / FR");
language = sc.next();

helper.switchLanguage(language);

System.out.println(helper.bundle.getString("number.of.characters"));
numberOfChars = sc.nextInt();

while (numberOfChars > 64 && counter < 3) {
System.out.println(helper.bundle.getString("maximum.characters"));
System.out.println(helper.bundle.getString("number.of.characters"));
numberOfChars = sc.nextInt();
counter++;

}

if (numberOfChars > 64 && counter == 3) {
System.out.println(helper.bundle.getString("exit"));
System.exit(0);
}

helper.allowedChars();

generatedPW = PasswordUtils.createPassword((numberOfChars));


System.out.println(helper.bundle.getString("clipboard"));
String copyChoice = sc.next();

if (copyChoice.equalsIgnoreCase(helper.bundle.getString("choice"))) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
new StringSelection(generatedPW), null);
}
System.out.println(helper.bundle.getString("new.password") + generatedPW);


}


}



[/CODE]

Geiles Gefühl mal ohne Hilfe durchzukommen auch wenn es mit Sicherheit Verbesserungswürdig ist :)
 
M

Mart

Gast
das mit kleinbuchstaben kannst du lösen indem du den string immer zu lower case machst bzw upper case egal was der user eingibt
 

Kotelettklopfer

Bekanntes Mitglied
das mit kleinbuchstaben kannst du lösen indem du den string immer zu lower case machst bzw upper case egal was der user eingibt
Genau so habe ich es gemacht.
allowedChars = "abcdefghijklmnopqrstuvwxyz" + specialChar + numeric + caseSensitive;

Die 3 Variablen liefern nur Inhalt wenn der User sich dafür entscheidet ansonsten ist der standard "abc...."
 
M

Mart

Gast
Genau so habe ich es gemacht.
allowedChars = "abcdefghijklmnopqrstuvwxyz" + specialChar + numeric + caseSensitive;

Die 3 Variablen liefern nur Inhalt wenn der User sich dafür entscheidet ansonsten ist der standard "abc...."
achso das ist das für das passwort ?

dachte es geht um die user eingabe zb dass es egal ist ob man de oder DE eingibt
 

Kotelettklopfer

Bekanntes Mitglied
achso das ist das für das passwort ?

dachte es geht um die user eingabe zb dass es egal ist ob man de oder DE eingibt
Die Usereingabe zb De / DE / de fange ich per .equalsIgnorecase ab.
Soweit läuft das Programm auch echt gut, mich stört dass die ganzen Variablen jetzt static sind damit ich die in der PasswordUtil nutzen kann. Habe ja gelernt, dass man sowas vermeiden sollte, wusste in dem Fall aber nicht wie :)

Das was du da oben siehst, ist der zusammengesetze String aus kleinbuchstaben (default) und dann den jeweiligen Entscheidungen des Users.
Willst du Großbuchstaben / Willst du Zahlen / Willst du Sonderzeichen.

Nach dem er das alles ausgewählt hat, generiere ich das PW.




Jetzt verstehe ich auch deinen Kommentar erst richtig und muss feststellen, wir hatten Anfangs aneinander vorbeigeschrieben :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
sserio StringBuilder und Strings Java Basics - Anfänger-Themen 8
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
P Methode trim() ohne StringBuilder Java Basics - Anfänger-Themen 1
P Stringbuilder richtig einsetzen Java Basics - Anfänger-Themen 1
W Teilstring durch Teilstring mittels StringBuilder ersetzen Java Basics - Anfänger-Themen 7
P Schleife für insert() und delete() im StringBuilder in Verbindung mit indexOf() Java Basics - Anfänger-Themen 7
G Wozu ist die Methode offsetByCodePoints(int, int) beim StringBuilder sinnvoll? Java Basics - Anfänger-Themen 1
G Wie kann ich einem StringBuilder einen int Wert formatiert hinzufügen? Java Basics - Anfänger-Themen 8
G Gibt es eine Methode die bei einem StringBuilder n mal das Zeichen c hinzufügt? Java Basics - Anfänger-Themen 6
G StringBuilder .setLength Methode wirkungslos? Java Basics - Anfänger-Themen 2
F StringBuilder: Zeilenumbruch nach x Zeichen ohne Worttrennung Java Basics - Anfänger-Themen 1
K StringBuilder Objekt überschreiben - Speicherverbrauch Java Basics - Anfänger-Themen 3
R [Erledigt]Fehler beim löschen von einzelnen Buchstaben aus StringBuilder Java Basics - Anfänger-Themen 1
H Suche Vergleichstabelle für die Klassen String und StringBuilder Java Basics - Anfänger-Themen 1
R Frage zum StringBuilder Java Basics - Anfänger-Themen 7
F Scanner + Stringbuilder geben leeren String aus wenn Umlaute enthalten sind Java Basics - Anfänger-Themen 29
M Array erweitern ohne Stringbuilder Java Basics - Anfänger-Themen 6
E StringBuilder.delete Problem Java Basics - Anfänger-Themen 2
J StringBuilder / String zusammensetzen Java Basics - Anfänger-Themen 2
A Datentypen Stringbuilder vollständig leeren Java Basics - Anfänger-Themen 6
F Problem bei StringBuilder Methoden Java Basics - Anfänger-Themen 11
C String oder StringBuilder? Java Basics - Anfänger-Themen 13
Java-Insel StringBuilder Zeilenumbrüche erkennen Java Basics - Anfänger-Themen 3
L StringBuilder Probleme in einer Klasse Java Basics - Anfänger-Themen 4
S im StringBuilder Zeichenketten ersetzen Java Basics - Anfänger-Themen 6
J StringBuilder initialisieren und Löschbefehl Java Basics - Anfänger-Themen 20
M Gittermuster mit Stringbuilder und einfacher Schleife erstellen Java Basics - Anfänger-Themen 19
B Stringbuilder verwenden Java Basics - Anfänger-Themen 15
L StringBuilder OutOfMemoryError Java Basics - Anfänger-Themen 8
S StringBuilder Java Basics - Anfänger-Themen 13
J Strings und StringBuilder Java Basics - Anfänger-Themen 12
K StringBuilder notwendig ab wann? Java Basics - Anfänger-Themen 42
H Array + StringBuilder in eine Textdatei speichern.laden. Java Basics - Anfänger-Themen 7
D StringBuilder Java Basics - Anfänger-Themen 10
N String oder StringBuffer/StringBuilder Java Basics - Anfänger-Themen 6
H Print und Println Java Basics - Anfänger-Themen 13
123456789sssssaaaa Which is the best way to Print Fibonacci Series in Java? Java Basics - Anfänger-Themen 3
H awt.print. Java Basics - Anfänger-Themen 0
paulen1 Methoden Unerwünschte Ausgabe bei System.out.print in For-Schleife Java Basics - Anfänger-Themen 8
Y Wie kann man überprüfen, ob bei einem Print Befehl tatsächlich etwas geprintet wurde? Java Basics - Anfänger-Themen 4
S Anweisungen verstehen System.out.print/println Java Basics - Anfänger-Themen 2
B Input/Output System.out.print mit und ohne "" Java Basics - Anfänger-Themen 5
Ghostman1711 Itext PDF print File gelockt by Java Java Basics - Anfänger-Themen 15
L system.print.out geht nicht Java Basics - Anfänger-Themen 11
B Print Service Java Basics - Anfänger-Themen 5
I Print Client -> Server -> Client? Java Basics - Anfänger-Themen 1
I Print Monitor Java Basics - Anfänger-Themen 0
I Drucken (Print) monitoren Java Basics - Anfänger-Themen 0
S Unterschied print() und println() Java Basics - Anfänger-Themen 3
J Umgang mit System.out.println() und .print() Java Basics - Anfänger-Themen 6
C Kleines Problem mit System.out.print Java Basics - Anfänger-Themen 1
R Char wird in System.out.print(); nicht ausgegeben Java Basics - Anfänger-Themen 6
T System.out.print : Frage zu Aufbau Java Basics - Anfänger-Themen 4
J Erste Schritte System.out.print (Fehlermeldung) Java Basics - Anfänger-Themen 14
X Eclipse System.out.print fehler Java Basics - Anfänger-Themen 5
K char-int-Addition in System.out.print Java Basics - Anfänger-Themen 3
A Feststellen ob Desktop.print("*.pdf") fertig ist Java Basics - Anfänger-Themen 6
Junb Sys.Out.Print - aus Methode zugreifen Java Basics - Anfänger-Themen 6
G DRUCKEN von z.B. eines JFrame über print(Graphics g) Java Basics - Anfänger-Themen 9
S [JUnit] Print Results while running Java Basics - Anfänger-Themen 6
J print button Java Basics - Anfänger-Themen 2
T Dezimaltrennzeichen bei Ausgabe mit print ändern Java Basics - Anfänger-Themen 4
ruutaiokwu System.err.print(ln) macht ein durcheinander??! Java Basics - Anfänger-Themen 8
J print-Anweisung verschluckt Java Basics - Anfänger-Themen 3
S Print Methode zweier "Classes" kombinieren Java Basics - Anfänger-Themen 2
O Drucker: print methode wird 2 mal aufgerufen nachfrage Java Basics - Anfänger-Themen 4
J Fragen zu System.out.print und charAt Java Basics - Anfänger-Themen 3
S 2 kleine Methoden negieren und print Java Basics - Anfänger-Themen 8
D System.out.print(0101); =65. Warum? Java Basics - Anfänger-Themen 3
E Mehrfache print ausgabe ohne Schleife oder Rekursiven aufruf? Java Basics - Anfänger-Themen 48
M to pdf print process starten Java Basics - Anfänger-Themen 4
C javax.print.DocPrintJob Java Basics - Anfänger-Themen 17
F print in java Java Basics - Anfänger-Themen 3
W Die Methode print() wird 2 mal für jede Seite aufgerufen Java Basics - Anfänger-Themen 9
B Objekt Orintiertes Programmieren ausgabe Fehler mit Print() Java Basics - Anfänger-Themen 4
S print()! Java Basics - Anfänger-Themen 2
L PrintWriter autoflush: println funktioniert, print nicht Java Basics - Anfänger-Themen 3
G Auswahl:in File schreiben, oder System.out.print Java Basics - Anfänger-Themen 4
J System.out.print Java Basics - Anfänger-Themen 5
S Listen - insert - print etc. Dringend! Bitte! Java Basics - Anfänger-Themen 6
H Print Methode Java Basics - Anfänger-Themen 6
C System.out.print oder println ? Java Basics - Anfänger-Themen 2
richis-fragen JTable den angezeigten WERT nicht den Wert aus dem Model ausgeben. Java Basics - Anfänger-Themen 3
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
Glühlampe Usereingabe in der gleichen Zeile ausgeben Java Basics - Anfänger-Themen 6
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
H Minimum und Maximum ausgeben lassen Java Basics - Anfänger-Themen 7
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
javaBoon86 Arrays 2 Dimension Werte ausgeben Java Basics - Anfänger-Themen 15
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
S Vollmond berechnen und ausgeben Java Basics - Anfänger-Themen 12
S Vollkommene Zahl berechnen und ausgeben Java Basics - Anfänger-Themen 16
K wie kann ich alle Attribute von dem Objekt(pagode) ausgeben lassen ? Java Basics - Anfänger-Themen 3
I Wortkette in umgekehrter Rheinfolge + in neuer Zeile ausgeben Java Basics - Anfänger-Themen 4
jeff98 Wie kann man in Java eine Zeichenformation ausgeben? Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben