2009-09-08 8 views
23

Ich habe einen Dialog Speichern unter in Java implementiert, der den Benutzer anfragt, ob die Datei bereits existiert und ich möchte, dass die Option Nein standardmäßig ausgewählt wird. Wie mache ich das?Wie wird JOptionPane.showConfirmDialog standardmäßig auf Nein gesetzt?

Hier ist mein aktueller Code:

JFileChooser chooser = new JFileChooser() 
{ 
    public void approveSelection() 
    { 
     File selectedFile = getSelectedFile(); 
     if (selectedFile != null && selectedFile.exists()) 
     { 
      int response = JOptionPane.showConfirmDialog(
        this, 
        "The file " + selectedFile.getName() + " already exists." 
         + " Do you want to replace the existing file?", 
        getDialogTitle(), 
        JOptionPane.YES_NO_OPTION, 
        JOptionPane.WARNING_MESSAGE); 
      if (response != JOptionPane.YES_OPTION) 
      { 
       return; 
      } 
     } 

     super.approveSelection(); 
    } 
}; 
+0

ich meine Antwort aktualisiert. –

Antwort

15

Mit diesem Konstruktor:

JOptionPane(Object message, int messageType, int optionType, 
      Icon icon, Object[] options, Object initialValue) 

wo options die Tasten gibt, und initialValue haben (eine der options Werte) angeben, was der Standard ist.

Aktualisierung: Sie können showOptionDialog statt showConfirmDialog anrufen. Ersteres erfordert options und initialValue Parameter.

+1

Aber ich möchte nicht selbst "Ja" und "Nein" angeben - ich möchte, dass das System seine Standardwerte annimmt. Kann das gemacht werden? – splintor

+0

Wie zeige ich nach dem Erstellen eines neuen Objekts mit diesem Ocnstructor das Dialogfeld zum Bestätigen von Modalitäten an? – splintor

+0

Nachdem Sie den Konstruktor verwendet haben, rufen Sie optionPane.createDialog (parent, "Title") auf. SetVisible (true) –

19

Das ist das erste, was mir in den Sinn kommt.

//Custom button text 
Object[] options = {"Yes", 
        "No"}; 
JOptionPane.showOptionDialog(this, "The file " + selectedFile.getName() + 
        " already exists. Do you want to replace the existing file?", 
        getDialogTitle(), 
        JOptionPane.YES_NO_OPTION, 
        JOptionPane.WARNING_MESSAGE, 
        null, options, options[1]); 

Aber wahrscheinlich gibt es einen besseren Ansatz.

6

Wenn Sie nicht mit „Ja“ und „Nein“ wollen hart codieren (zum Beispiel, wenn Sie Ihre App für andere Sprachen lokalisiert ist), können Sie UIManager Ressourcen nutzen:

UIManager.getString("OptionPane.yesButtonText", l) 
UIManager.getString("OptionPane.noButtonText", l) 
+0

Es gibt immer noch das Problem der Reihenfolge der Schaltflächen. Auf gtk kann der Benutzer die Reihenfolge mit gtk-alternative-button-order = 1 angeben. Ich weiß nicht, wie Sie die Bestellung für die aktuelle Plattform und Einstellung finden können. –

+0

Und ich hoffe, dass die Verwendung der ShowConfirmDialog dies je nach Plattform Look and Feel: –

+0

@RoelSpilker OptionPane.buttonOrientation, OptionPane.isYesLast, etc. Oder HighJack BasicOptionPaneUI ganze Schaltfläche Panel. – Trejkaz

1

Für das obige Beispiel, Es ist JOptionPane.showOptionDialog Diese Argumente können nicht an showConfirmDialog übergeben werden, weil es sie nicht hat.

Mehr Menschen suchen vielleicht danach, warum also nicht eine "funktionierende" Lösung anbieten.

6

Dies ist meine Lösung:

import java.awt.Component; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.UIManager; 


public class NegativeDefaultButtonJOptionPane { 

public static int showConfirmDialog(Component parentComponent, Object message, String title, int optionType) { 
    List<Object> options = new ArrayList<Object>(); 
    Object defaultOption; 
    switch(optionType){ 
    case JOptionPane.OK_CANCEL_OPTION: 
     options.add(UIManager.getString("OptionPane.okButtonText")); 
     options.add(UIManager.getString("OptionPane.cancelButtonText")); 
     defaultOption = UIManager.getString("OptionPane.cancelButtonText"); 
     break; 
    case JOptionPane.YES_NO_OPTION: 
     options.add(UIManager.getString("OptionPane.yesButtonText")); 
     options.add(UIManager.getString("OptionPane.noButtonText")); 
     defaultOption = UIManager.getString("OptionPane.noButtonText"); 
     break; 
    case JOptionPane.YES_NO_CANCEL_OPTION: 
     options.add(UIManager.getString("OptionPane.yesButtonText")); 
     options.add(UIManager.getString("OptionPane.noButtonText")); 
     options.add(UIManager.getString("OptionPane.cancelButtonText")); 
     defaultOption = UIManager.getString("OptionPane.cancelButtonText"); 
     break; 
     default: 
      throw new IllegalArgumentException("Unknown optionType "+optionType); 
    } 
    return JOptionPane.showOptionDialog(parentComponent, message, title, optionType, JOptionPane.QUESTION_MESSAGE, null, options.toArray(), defaultOption); 
} 

} 
Verwandte Themen