2009-09-08 10 views
23

J'ai implémenté une boîte de dialogue Enregistrer sous en Java qui invite l'utilisateur si le fichier existe déjà et je souhaite que l'option Non soit sélectionnée par défaut. Comment puis-je faire cela?Comment faire pour que JOptionPane.showConfirmDialog ait Non sélectionné par défaut?

Voici mon code actuel:

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

Je mis à jour ma réponse. –

Répondre

15

Utilisez ce constructeur:

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

options indique les boutons, et ont initialValue (une des options valeurs) ce que la valeur par défaut est.

Mise à jour: Vous pouvez appeler showOptionDialog plutôt que showConfirmDialog. Le premier prend les paramètres options et initialValue.

+1

Mais je ne veux pas spécifier le "Oui" et "Non" moi-même - Je veux que le système prenne ses valeurs par défaut. Cela peut-il être fait? – splintor

+0

De plus, après avoir créé un nouvel objet à l'aide de cet ocnstructor, comment afficher la boîte de dialogue de confirmation modale? – splintor

+0

après avoir utilisé le constructeur, vous appelez optionPane.createDialog (parent, "Title"). SetVisible (true) –

19

C'est la première chose qui me vient à l'esprit.

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

Mais il y a probablement une meilleure approche.

6

Si vous ne voulez pas coder en dur « Oui » et « Non » (par exemple, lorsque votre application est localisée pour d'autres langues), vous pouvez utiliser les ressources UIManager:

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

Il reste le problème de l'ordre des boutons. Sur gtk, l'utilisateur peut spécifier l'ordre en utilisant gtk-alternative-button-order = 1. Je ne sais pas comment vous pouvez trouver la commande pour la plate-forme et le réglage actuels. –

+0

Et j'espère que l'utilisation de showConfirmDialog gère cela en fonction de l'aspect et de la convivialité de la plateforme :-) –

+0

@RoelSpilker OptionPane.buttonOrientation, OptionPane.isYesLast, etc. Ou détendez le panneau de boutons complet de BasicOptionPaneUI. – Trejkaz

1

Pour l'exemple ci-dessus, il est JOptionPane.showOptionDialog Ces arguments ne peuvent pas être passés à showConfirmDialog car ils ne les ont pas.

Plus de gens pourraient être à la recherche de cela, alors pourquoi ne pas offrir une solution «de travail».

6

C'est ma solution:

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

} 
Questions connexes