2009-06-02 33 views
52

¿Hay una manera de quitar el botón de cierre ("X") en la barra de título JDialog?botón Eliminar "X" en el oscilación JDialog

+7

He visto algunas aplicaciones que muestran otro cuadro de diálogo si se pulsa el botón de cierre que le pide pulsar uno de los botones de otros en su lugar. ¡Genio! –

Respuesta

1

Haciendo un cálculo, ajuste que sea PL & F decorado y eliminar el componente por su nombre.

+1

¿Qué es PL & F? Gracias. – kenshinji

+0

PL & F es Look & Feel conectable. La manera fea en que Swing puede adoptar un look & Feel arbitrario. –

+2

¿Por qué feo? ¿Cuál sería la forma correcta de hacerlo? –

53

Puede eliminar todo el título de diálogo llamando dialog.setUndecorated (verdadero), pero esto significa que el diálogo no se puede mover más.

También puede ejecutar dialog.setDefaultCloseOperation (WindowConstants.DO_NOTHING_ON_CLOSE) para evitar que el botón hace nada.

Además de eso, no creo que haya una forma de eliminar la X por completo.

13

Creo que puede llamar al dialog.setUndecorated(true) para eliminar la barra de título. Sin embargo, no estoy seguro acerca de la 'X'.

Extracción de la 'X' no puede ser una gran idea, sin embargo, como usted quiere que sus usuarios sean capaces de cerrar el diálogo con facilidad.

La mejor apuesta es controlar lo que sucede cuando los usuarios hacen clic en la "X" usando dialog.setDefaultCloseOperation o WindowListener.

9

A partir de Java 1.7 (También conocido como Dolphin o Java 7), no se puede desactivar o eliminar el botón de cierre en una ventana. Puede quitar/deshabilitar el botón Maximizar con frame.setResizable(false) y puede eliminar los botones minimizar y maximizar utilizando java.awt.Dialog o una clase que lo amplía, como javax.swing.JDialog. Puede eliminar la barra de título, los bordes y los botones con frame.setUndecorated(true), y puede tener control total sobre la visibilidad de todos los botones en la barra de título (mientras pierde compatibilidad con varias plataformas e integración de sistema operativo) con frame.setDefaultLookAndFeelDecorated(true) (suponiendo que es un JFrame o JDialog). Este es todo el control que veo posible con el JDK actual.

+4

Esto es "no se corregirá" en [bug parade] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5085932). –

+0

Esto no es del todo correcto. Subclasificar/instanciar un JDialog en OS X (probado en El Capitan) no elimina ningún botón de la barra de título, ni ninguna combinación de configuraciones (y sí, probé todas las combinaciones). Solo 'setUndecorated (true)' los elimina a todos, pero junto con ellos va la barra de título. Sin duda, puede modificar el comportamiento de los botones de la barra de título, pero en cuanto a la apariencia ...Es una situación muy complicada en la que he invertido demasiado tiempo con soluciones insatisfactorias y códigos no portátiles. – EntangledLoops

+0

@EntangledLoops ¡Gracias por contribuir con tu comentario! Si bien es cierto que JDialog no retira los botones minimizar/"maximizar" en los cuadros de diálogo de OS X, desactiva la función de minimizar. No tengo una Mac a la mano para probar esto, pero estoy dispuesto a apostar que el botón Maximizar simplemente lo cambia de tamaño, y si establece 'dialog.setResizable (false)', ¡el botón verde se desactivará también! De todos modos, como dije en mi respuesta, es molesto que no tengamos el control total sobre esto, pero me puedo imaginar cuán pesadilla podría ser para los creadores de JSE programar en todas las plataformas. ; 3 – Supuhstar

-3
static public void removeButtons(Component c){ 
    if (c instanceof AbstractButton){ 
     String accn = c.getAccessibleContext().getAccessibleName(); 
     Container p=c.getParent(); 
     //log.debug("remove button %s from %s",accn,p.getClass().getName()); 
     c.getParent().remove(c); 
    } 
    else if (c instanceof Container){ 
     //log.debug("processing components of %s",c.getClass().getName()); 
     Component[] comps = ((Container)c).getComponents(); 
     for(int i = 0; i<comps.length; ++i) 
      removeButtons(comps[i]); 
    } 
} 
+7

esto eliminará los botones agregados al diálogo, no los botones de cierre de diálogo. –

+0

Esto no tiene ningún efecto en los botones de la barra de título (OS X). – EntangledLoops

+1

Esto es realmente bastante divertido y deja tu aplicación en un estado hilarantemente inutilizable si _siempre_ usas botones x3 – Supuhstar

4

Aquí está mi experiencia:

  • intentado usar setUndecorated(true): Hecho todo el Dialog invisible.
  • Intentó setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE): Esto no cambió el comportamiento en absoluto. Mi cuadro de diálogo aún está cerrado. Al establecer la operación de cierre predeterminada en DO_NOTHING_ON_CLOSE, se delega la operación de cierre al método windowClosing() de WindowListener registrado.

lo que funcionó para mí fue:

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
//Remove any existing WindowListeners 
for (WindowListener wl : this.getWindowListeners()) 
     this.removeWindowListener(wl); 
this.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
       if ("Optional condition") { 
         JOptionPane.showMessageDialog(null, "You cannot close this window"); 
       } 
     } 
}); 
Cuestiones relacionadas