2009-09-08 6 views
23

Ho implementato una finestra di dialogo Salva con nome in Java che richiede all'utente se il file esiste già e desidero che l'opzione No sia selezionata per impostazione predefinita. Come faccio a fare questo?Come rendere JOptionPane.showConfirmDialog non selezionato per impostazione predefinita?

Ecco il mio codice corrente:

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

Ho aggiornato la mia risposta. –

risposta

15

Utilizzare questo costruttore:

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

dove options specifica i pulsanti, e hanno initialValue (uno dei valori options) specificare ciò che il valore predefinito è.

Aggiornamento: È possibile chiamare showOptionDialog anziché showConfirmDialog. Il primo prende i parametri options e initialValue.

+1

Ma non voglio specificare me stesso "Sì" e "No": voglio che il sistema prenda le sue impostazioni predefinite. Può essere fatto? – splintor

+0

Inoltre, dopo aver creato un nuovo oggetto utilizzando questo ocnstructor, come posso visualizzare la finestra di dialogo di conferma modale? – splintor

+0

dopo aver utilizzato il costruttore, si chiama optionPane.createDialog (parent, "Title"). SetVisible (true) –

19

Questa è la prima cosa che mi viene in mente.

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

Ma probabilmente c'è un approccio migliore.

6

Se non si desidera hardcode "Sì" e "No" (ad esempio, quando la vostra applicazione è localizzata in altre lingue), è possibile utilizzare UIManager risorse:

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

C'è ancora il problema dell'ordine dei pulsanti. Su gtk, l'utente può effettivamente specificare l'ordine usando gtk-alternative-button-order = 1. Non so come puoi trovare l'ordine per la piattaforma e le impostazioni attuali. –

+0

E spero che l'uso di showConfirmDialog lo gestisca a seconda dell'aspetto della piattaforma :-) –

+0

@RoelSpilker OptionPane.buttonOrientation, OptionPane.isYesLast, ecc. Oppure dirottare l'intero pannello dei pulsanti di BasicOptionPaneUI. – Trejkaz

1

Per l'esempio precedente, è JOptionPane.showOptionDialog Questi argomenti non possono essere passati a showConfirmDialog perché non li ha.

Altre persone potrebbero cercarlo, quindi perché non offrire una soluzione "funzionante".

6

Questa è la mia Soluzione:

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

}