jOptionPane mit if else

maGG

Bekanntes Mitglied
Huhu ich bins wieder 😀 *winke winke*
Ich würde gern ein JOptionPane Fenster erzeugen, welches in einer Combobox verschiede Strings zur Auswahl hat und ein Ok und Cancel Button besitzt. Das ist mein bisheriger Code:
Java:
 Object[] possibleValues = { "First", "Second", "Third" };

Object selectedValue = JOptionPane.showInputDialog(null,
             "Choose one", "Input",
             JOptionPane.OK_CANCEL_OPTION, null,
             possibleValues, possibleValues[0]);
Was ich jetzt möchte ist so etwas:
Code:
if(First ist ausgewählt && Objekt == OK_OPTION){
     mach etwas
}else if (Second ...){
     ...
} else if(Third ...){
     ...
}else{}
Das Problem dabei ist, dass OK_OPTION vom Typ int ist und das andere ein Object Array. Wie vergleiche ich so etwas? Ich habs mit .equals(), .contains() und mit so nem Array.iwas ausprobiert. Ich hab mit if else leider nur einfache Beispiele mit YES_NO_OPTION gefunden, die bekomme ich auch hin. Das mit Object scheint schwieriger zu sein oder? Habt ihr vielleicht ne Idee wie man sowas macht?

MfG
 
Warum hast du ein Object Array und kein String Array? Sind doch alles Strings oder?

Im Prinzip musst du nicht prüfen ob Cancel oder Ok gedrückt wurde.
Immer dann, wenn der User OK drückt, wird der Eintrag der Combobox zurückgegeben und in selectedValue gespeichert. Wenn der User Cancel drückt wird null zurückgegeben.
Du kannst also schauen ob selectedValue null ist oder nicht und dann mit equals() weiter machen.

Java:
String selectedValue= (String) JOptionPane.showInputDialg(....);
if(selectedValue == null)
{
     // cancel button gedrückt
     // some fancy stuff
}
else if(selectedValue.equals("bla"))
{
      // foo
}
else
{
       // ....
}

Gruß Robert
 
Ist es vielleicht sowas was du willst:
Code:
String[] genderOptions = {
  "männlich", "weiblich", "keine Ahnung", "ändert sich ständig" };

String gender = (String) JOptionPane.showInputDialog( null,
          "Geschlecht",
          "Bitte das Geschlecht wählen (eigenes, nicht gewünschtes)",
          JOptionPane.QUESTION_MESSAGE,
          null, genderOptions,
          genderOptions[1] );

Edit: Uups, zu spät
 
Das er null ausgibt bei X und bei Cancel wusste ich nicht
Da hilft immer wieder ein Blick in die Dokumentation 😉
https://docs.oracle.com/javase/7/docs/api/javax/swing/JOptionPane.html#showInputDialog(java.awt.Component,%20java.lang.Object,%20java.lang.String,%20int,%20javax.swing.Icon,%20java.lang.Object[],%20java.lang.Object)
Da steht beschrieben was die einzelnen Parameter bedeuten/sind und mit welchen Rückgabewert (falls vorhanden) man rechnen kann.
 
Auch dir auch Danke Joose!
Ich hab noch was hehe *Trommelwirbel* 😀
Ich würde gern folgendes umsetzen, sofern nicht zu aufwändig bzw. überhaupt möglich: Es soll ein JOptionPane-Fenster ausgeben, mit eine Combobox. Die Combobox soll dann als Startwert den String ausgewählt haben der bei einer anderen Combobox im jFrame bereits ausgewählt wurde - die anderen Werte sollen noch auswählbar sein und die beiden Comboboxen sind soweit gleich, von ihren String Werten.
Java:
        Object[] possibleValues = {"AG", "Training", "Austria GmbH - AT", "CEF - AT", "B.V. - NL", "Polska - PL", "Sarl - FR", "G.L.S. - UK", "Corporation - USA", "Ltd. - CH"};
        Object selectedValue = JOptionPane.showInputDialog(null, "wähle eine Vorlage:", "Vorlage erstellen",
        JOptionPane.OK_CANCEL_OPTION, null,
        possibleValues, possibleValues[0]);

        public String getBereich(){
            String bereich = jComboBoxBereich.getSelectedItem().toString();
            return bereich;
        }
Hmmm bzw. eigentlich müsste ich den ausgewählt String dann nach vorne setzen, oder vielleicht entfernen und dann hinzufügen? Vielleicht geht das eher mit ArrayList, habt ihr ne Idee evtl.?
 
Mhmmm, ich verstehe noch nicht was du vorhast bzw. was das Problem ist. In possibleValues stehen die Alternativen und im letzten Parameter beim showInputDialog gibst du an welcher dieser Werte vorausgewählt sein soll. Ich verstehe nicht was du warumnach vorne oder hinten setzen willst
 
Hmm also es geht immer noch um das Programm zur Erstellung von Signaturen. Dabei gibt es inzwischen ziemliche viele Parameter, die übergeben werden (es werden immer mehr *augenroll*). Eine Abfrage erfolgt durch die ComboBox Bereich, welche das Äquivalent zu einer Schablone wäre: Je nachdem welche man auswählt sieht der Aufbau der Signatur unterschiedlich aus. Das Programm soll eine Hilfestellung sein die 99% aller Fälle abdecken. Da es aber immer Spezialisten geben wird, die eine ganz besondere Signatur brauchen, wäre eine Ausgabe ohne Parameter hilfreich - dafür ist das JOptionPane-Fenster.

Wenn ich jetzt das Programm benutze und gerade im Bereich "Training" drin bin und mir einfällt, dass ich jetzt auch noch gerne eine Vorlage geschrieben bekommen würde, dann würde ich auf den Button drücken und das Programm hätte automatisch schon die Combobox auf Training gesetzt. Natürlich ist das jetzt nicht besonders wichtig. Aber ich dachte mir, wenn ich weiß wie das funktioniert dann könnte ich noch andere coole Sachen machen.
Beispielsweise dachte ich daran bei der zip Funktion etwas zu erweitern. Im Moment zippt er ja den Ordner, der den String Namen = vorname + " " + nachname; trägt und auf den Desktop liegt. D.h. um das Programm so zu benutzen wäre es ideal, wenn man immer erst die Signatur ertellt und dann sofort zippt, bevor man eine neue eingibt.
Es wäre natürlich jetzt cool, wenn ich eine String ArrayList hätte, die immer nach Erstellen einer Signatur den Werte vorname + " " + nachname als Element der hinzufügt mit add. Und das diese ArrayList dann in der Combobox bei JOptionPane auftaucht. Also sagen wir ich hätte gerade die Signatur für Max Mustermann, Anna Musterfrau und Emil Schießmichtot erstellt und würde dann auf den Button zum zipp drückenn, dann würde zur Auswahl zum zippen eben diese drei String Werte zu verfügung stehen. Wenn keine Signatur davor erstellt wurde, dann würde er mir eben ne Fehlermeldung ausgeben.

So hatte ich mir das grob vorgestellt. Weiterhin hatte ich dann noch an eine optische Anwendung gedacht, z.B. das man zusätzlich noch eine Art Liste auf ein Panel z.B. angezeigt bekommt mit den letzt drei erstellten Signaturen, die dann immer wieder überschrieben wird.

Naja egal zurück zum Thema: Wenn ich also wüsste wie man die Werte in bei JOptionPane variable mache, dann würde mir das schon mal weiterhelfen. Und ich könnte mir noch mehr Gedanken dazu machen, wie man sowas überhaupt umsetzen könnte.

sry für den langen Text 😀
 
nö weiß ich irgendwie nicht 😀
Java:
        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
Es zeigt mir die Zeilen mit add als rot an. Ich bin irgendwie verwirrt; im Internet stand das als Beispielt und es hat anscheinend funktioniert - bei mir nicht. ArrayList besteht doch aus Klassen oder?
 
Zwei Alternativen:
Code:
        Object[] possibleValues = new String[4];
        possibleValues[0] = "der erste String";
        possibleValues[1] = "der zweite String";
        possibleValues[2] = "der dritte String";   // der soll vorselektiert sein.
        possibleValues[3] = "der vierte String";
        Object selectedValue = JOptionPane.showInputDialog(null, "wähle eine Vorlage:", "Vorlage erstellen",
                JOptionPane.OK_CANCEL_OPTION, null,
                possibleValues, possibleValues[2]);

        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        selectedValue = JOptionPane.showInputDialog(null, "wähle eine Vorlage:", "Vorlage erstellen",
                JOptionPane.OK_CANCEL_OPTION, null,
                list.toArray(), list.toArray()[2]);

Beides geht,
 
ah cool Danke JStein! 🙂 Es funktioniert jetzt fast perfekt. Wie kann ich von meinem String Array den Index als Bedingung angeben?

also wenn ich ...
switch(selectedValue){
case "index vom Array":
//mach irgendetwas
break;
}

und es soll eigentlich auch noch soviele cases erstellen, wie elemente in der arraylist sind, so etwa vielleicht?
Java:
        for(int i = 0; i < list.toArray().length; i++){
            if(null == selectedValue){
                jTextAreaAusgabe.setText("der Cancel Button oder X müsste gedrückt worden sein");
            }else switch(selectedValue){
                case i:
                    //mach etwas
                break;
                default:
                    //mach etwas
                break;
            }
        }
Das mit dem i funktioniert so natürlich noch nicht.
 
Wenn du die Alternative mit der ArrayList benutzt kannst du den Index des selektierten Elementes erfargen. So etwa:
Code:
        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        selectedValue = JOptionPane.showInputDialog(null, "wähle eine Vorlage:", "Vorlage erstellen",
                JOptionPane.OK_CANCEL_OPTION, null,
                list.toArray(), list.toArray()[2]);
        int index = list.indexOf(selectedValue);
und dann irgendwas mit dem Index machen. Hilft das weiter ?

Bei der Variante mit dem String-Array musst du halt selber eine Schleife drumrum machen und mit ...equals(selectedValue) rausfinden welcher Eintrag selektiert war.
 
Im Moment sieht es so aus:
Java:
        list.add("Max Mustermann");
        list.add("Vorname Nachname");
        list.add("Bin Unkreativ");
        list.add("Und Wie");
        String selectedValue = (String)JOptionPane.showInputDialog(null, "wähle eine Vorlage:", "Vorlage erstellen",
                JOptionPane.OK_CANCEL_OPTION, null,
                list.toArray(), list.toArray().length);
       
        for(int i = 0; i < list.toArray().length; i++){
            if(null == selectedValue){
                jTextAreaAusgabe.setText("der Cancel Button oder X müsste gedrückt worden sein");
            }else switch(list.indexOf(selectedValue)){
                case list.get(i):
                    //mach etwas
                break;
                default:
                    //mach etwas
                break;
            }
        }
kann man das so machen? Das mi dem list.get(i) ist noch rot
 
kann man das so machen? Das mi dem list.get(i) ist noch rot

Nein das geht nicht. Ein "case" braucht einen konstanten Wert.
Java:
list.add("Max Mustermann");
list.add("Vorname Nachname");
list.add("Bin Unkreativ");
list.add("Und Wie");
String selectedValue = (String)JOptionPane.showInputDialog(null, "wähle eine Vorlage:", "Vorlage erstellen", JOptionPane.OK_CANCEL_OPTION, null, list.toArray(), list.toArray().length);

if(null == selectedValue) {
   jTextAreaAusgabe.setText("der Cancel Button oder X müsste gedrückt worden sein");
} else {
   for(int i = 0; i < list.size(); i++) {
       if(selectedValue == list.get(i)) {
           // was auch immer dann passieren soll
           // wozu aber willst du es so machen? selectedValue enthält ja schon den ausgewählten wert!?
       }
   }
}

Und noch ein Hinweis das was du hier probiert hast:
Code:
for(int i = 0; i < list.toArray().length; i++){
   if(null == selectedValue) {
       jTextAreaAusgabe.setText("der Cancel Button oder X müsste gedrückt worden sein");
   } else
       switch(list.indexOf(selectedValue)) {
           case list.get(i):
               //mach etwas
           break;
           default:
               //mach etwas
           break;
       }
}
is nichts anderes als ein if/else, wobei die switch-Anweisung im else-Block steht (achte auf die Formatierung deines Codes).
Bei nur einer Anweisung in einem if oder else Block braucht man keine {}-Klammern (ich empfehle sie trotzdem immer zu machen.
 
Ok danke; es funktioniert jetzt perfekt. Danke nochmal!
Meine Lösung sieht jetzt so aus:
Java:
    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {        
if(!list.isEmpty()){
           
            Collections.reverse(list); //ändert die Reihenfolge
            String selectedValue = (String)JOptionPane.showInputDialog(null, "wähle eine Vorlage:", "Vorlage erstellen",
                    JOptionPane.OK_CANCEL_OPTION, null,
                    list.toArray(), list.toArray().length);
            if(!(selectedValue == null)){
                try{
                    String homeDirectory = new JFileChooser().getFileSystemView().getHomeDirectory().toString();

                    String dir = homeDirectory + "\\" + selectedValue;
                    String pfadBat = homeDirectory + "\\" + selectedValue + "\\" + "Signatur.bat";
                    String pfadHtm = homeDirectory + "\\" + selectedValue + "\\" + selectedValue + ".htm";
                    String pfadTxt = homeDirectory + "\\" + selectedValue + "\\" + selectedValue + ".txt";
                   
                    FileOutputStream fos = new FileOutputStream(dir + ".zip");
                    try (ZipOutputStream zos = new ZipOutputStream(fos)) {
                        addDir(zos, pfadBat);
                        addDir(zos, pfadHtm);
                        addDir(zos, pfadTxt);
                    }
                    jTextAreaAusgabe.setText("Der Zip-Ordner wurde erfolgreich auf dem Desktop erstellt.");

                }catch(FileNotFoundException ep){
                    ep.printStackTrace();
                    jTextAreaAusgabe.setText("Fehler: Pfad konnte nicht gefunden werden");
                }catch(IOException ex) {
                    ex.printStackTrace();
                    jTextAreaAusgabe.setText("Fehler: Speichervorgang abgebrochen");
                }
            }else{
                jTextAreaAusgabe.setText("Der Kompremiervorgang wurde nicht ausgeführt.");
            }      
        }else{
            jTextAreaAusgabe.setText("Fehler: Bitte erst mindestens eine Signatur erstellen");
        }   
    }
 

Zurück
Oben