2009-09-08 37 views
23

Implementé un cuadro de diálogo Guardar como en Java que pregunta al usuario si el archivo ya existe y quiero que la opción No se seleccione de forma predeterminada. ¿Cómo hago esto?¿Cómo hacer que JOptionPane.showConfirmDialog no tenga seleccionado por defecto?

Aquí está mi código actual:

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

He actualizado mi respuesta. –

Respuesta

15

Utilice este constructor:

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

donde options especifica los botones, y tienen initialValue (uno de los options valores) especifique lo que el defecto es.

Actualización: Puede llamar al showOptionDialog en lugar de showConfirmDialog. El primero toma los parámetros options y initialValue.

+1

Pero no quiero especificar el "Sí" y el "No", quiero que el sistema tome sus valores predeterminados. Se puede hacer esto? – splintor

+0

Además, después de crear un objeto nuevo utilizando este ocnstructor, ¿cómo se muestra el diálogo de confirmación modal? – splintor

+0

después de usar el constructor, llama a optionPane.createDialog (principal, "Título"). SetVisible (verdadero) –

19

Eso es lo primero que me viene a la 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]); 

Pero probablemente haya un mejor enfoque.

6

Si no desea codificar "Sí" y "No" (por ejemplo, cuando su aplicación se localiza por otros idiomas), puede utilizar los recursos UIManager:

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

Todavía existe la cuestión del orden de los botones. En gtk, el usuario puede especificar el orden usando gtk-alternative-button-order = 1. No sé cómo puedes encontrar el orden para la plataforma y la configuración actual. –

+0

Y espero que el uso de showConfirmDialog maneje esto dependiendo del aspecto y la sensación de la plataforma :-) –

+0

@RoelSpilker OptionPane.buttonOrientation, OptionPane.isYesLast, etc. O bien, el panel de botones completo de BasicOptionPaneUI de highjack. – Trejkaz

1

Para el ejemplo anterior, es JOptionPane.showOptionDialog Esos argumentos no se pueden pasar a showConfirmDialog porque no los tiene.

Más personas pueden estar buscando esto, ¿por qué no ofrecer una solución "de trabajo".

6

Esta es mi solución:

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

} 
Cuestiones relacionadas