2012-02-23 15 views
5

Quiero hacer que la ventana basada en JDialog esté inactiva, por lo que todos los controles aparecen desactivados (en color gris). setEnabled (falso) simplemente hace imposible hacer clic en cualquier control, incluso cerrar la ventana. Pero nada se vuelve gris. Ayuda por favor.cómo hacer que JDialog esté inactivo

EDIT: Aquí hay un código de muestra.

import javax.swing.JButton; 
import javax.swing.JDialog; 


public class Analyzer extends JDialog{ 

public Analyzer() { 
    JButton but = new JButton("test"); 
    setLayout(null); 
    but.setBounds(10,10,100,100); 

    add(but); 
    setSize(200, 200); 
    setVisible(true); 
    setEnabled(false); 
} 

public static void main(String[] args) { 
    new Analyzer(); 
} 

} 
+0

ejemplo de código adicional. ¿Dice que necesito repetir todos los controles y desactivarlos manualmente? –

+1

Esa no es exactamente la muestra que estamos buscando. Nos gustaría ver tu intento de resolver esto. ¿Ha considerado usar recursion para recurse a través del árbol contenedor/componente del JDialog, habilitando o deshabilitando todos los componentes encontrados? –

+0

Estoy de acuerdo con Hovercraft ... setDisabled en cada componente que contiene el JDialog. – John

Respuesta

8

Las dos formas que conozco para hacer esto, una de las que deshabilita los componentes de un cuadro de diálogo de forma recursiva, y el segundo en el que deshabilita el diálogo completo (incluyendo la capacidad de arrastrar el cuadro de diálogo):

import java.awt.Component; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class DisableEg extends JPanel { 
    public static final String DISABLE_DIALOG_COMPONENTS = "Disable Dialog Components"; 
    public static final String ENABLE_DIALOG_COMPONENTS = "Enable Dialog Components"; 
    public static final String DISABLE_DIALOG = "Disable Dialog"; 
    public static final String ENABLE_DIALOG = "Enable Dialog"; 
    private static final int LOC_SHIFT = 150; 
    private Analyzer analyzer; 

    public DisableEg(JFrame frame) { 
     analyzer = new Analyzer(frame); 
     analyzer.pack(); 
     analyzer.setLocationRelativeTo(frame); 
     Point location = analyzer.getLocation(); 
     location = new Point(location.x - LOC_SHIFT, location.y - LOC_SHIFT); 
     analyzer.setLocation(location); 
     analyzer.setVisible(true); 

     add(new JButton(new AbstractAction(DISABLE_DIALOG_COMPONENTS) { 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      AbstractButton btn = (AbstractButton) evt.getSource(); 
      if (btn.getText().equals(DISABLE_DIALOG_COMPONENTS)) { 
       btn.setText(ENABLE_DIALOG_COMPONENTS); 
       analyzer.setComponentEnabled(false); 
      } else { 
       btn.setText(DISABLE_DIALOG_COMPONENTS); 
       analyzer.setComponentEnabled(true); 
      } 
     } 
     })); 
     add(new JButton(new AbstractAction(DISABLE_DIALOG) { 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      AbstractButton btn = (AbstractButton) evt.getSource(); 
      if (btn.getText().equals(DISABLE_DIALOG)) { 
       btn.setText(ENABLE_DIALOG); 
       analyzer.setEnabled(false); 
      } else { 
       btn.setText(DISABLE_DIALOG); 
       analyzer.setEnabled(true); 
      } 
     } 
     })); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Disable Example"); 
     DisableEg mainPanel = new DisableEg(frame); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

@SuppressWarnings("serial") 
class Analyzer extends JDialog { 

    public Analyzer(JFrame frame) { 
     super(frame, "Analyzer Dialog", false); 
     JButton but = new JButton("test"); 
     setLayout(new FlowLayout()); 

     add(but); 
     setPreferredSize(new Dimension(200, 200)); 
    } 

    public void setComponentEnabled(boolean enabled) { 
     setComponentEnabled(enabled, getContentPane()); 

     // !! if you have menus to disable, you may need instead 
     // setComponentEnabled(enabled, this); // !! 
    } 

    private void setComponentEnabled(boolean enabled, Component component) { 
     component.setEnabled(enabled); 
     if (component instanceof Container) { 
     Component[] components = ((Container) component).getComponents(); 
     if (components != null && components.length > 0) { 
      for (Component heldComponent : components) { 
       setComponentEnabled(enabled, heldComponent); 
      } 
     } 
     } 
    } 

} 
+0

bien, buen trabajo. +1 – Jasonw

4

La forma típica de hacer esto es utilizar un GlassPane, pero Java 7 introdujo JLayer que debe hacer el truco también.

+0

Si estoy leyendo la pregunta del OP correctamente, esto no funcionará ya que quiere que los componentes muestren una apariencia deshabilitada. AFAIK, la forma típica de hacer esto es usar recursión. –

+1

de esta manera es más que cómodo, GlassPane podría ser de color, tan simple y no accesible por el mouse, buen hilo +1 para ambos (@Pete gran código ++++++++) – mKorbel

Cuestiones relacionadas