2012-04-11 11 views
7

Mi aplicación ofrece la capacidad de iniciar una tarea de larga ejecución. Cuando esto ocurre, se genera un JDialog no modal que muestra el progreso de la tarea. Específicamente, hago el diálogo no modal para permitir al usuario interactuar con el resto de la GUI mientras se ejecuta la tarea.JDialog sin modelar debe estar visible en la parte superior del elemento principal

El problema al que me enfrento es que si el diálogo se oculta detrás de otras ventanas en el escritorio se vuelve difícil de localizar: no hay un elemento correspondiente en la barra de tareas (en Windows 7), ni hay un icono visible en el menú Alt + Tab.

¿Hay una manera idiomática de resolver este problema? Consideré agregar un WindowListener a la aplicación JFrame y usar esto para llevar el JDialog al primer plano. Sin embargo, es probable que esto se vuelva frustrante (ya que presumiblemente significará que JFrame pierde el foco).

+0

¿Por qué no usar un JFrame en su lugar? Esa es una de las principales diferencias: el botón en la barra de tareas. –

+0

Porque no quiero que el diálogo ofrezca maximizar o minimizar la funcionalidad. – Adamski

+0

Puede usar setResizable (falso); Permitiría minimizar, de lo contrario, la aplicación podría ser un poco ofensiva, OMI. –

Respuesta

8

Puede crear un cuadro de diálogo no modal y darle un marco/diálogo principal. Cuando abre el marco/diálogo principal, también trae el diálogo no modal.

Algo como esto ilustra esto:

public static void main(String[] args) throws IOException { 
    JFrame frame = new JFrame(); 
    frame.setTitle("frame"); 
    JDialog dialog = new JDialog(frame, false); 
    dialog.setTitle("dialog"); 
    final JButton button = new JButton("Click me"); 
    button.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JOptionPane.showMessageDialog(button, "Hello"); 
     } 
    }); 
    final JButton button2 = new JButton("Click me too"); 
    button2.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JOptionPane.showMessageDialog(button2, "Hello dialog"); 
     } 
    }); 
    frame.add(button); 
    dialog.add(button2); 
    frame.pack(); 
    dialog.pack(); 
    frame.setVisible(true); 
    dialog.setVisible(true); 
} 
+0

Gracias, eso funcionó. Parece que estaba configurando la ubicación del diálogo en relación con un componente principal, pero no construyendo realmente el JDialog con un propietario. – Adamski

Cuestiones relacionadas