2011-05-11 206 views
5

Quiero hacer una carga cuando el proceso de la aplicación, por lo que utilicé un JPanel sobre un JTree. Pero cuando el usuario hace clic en JPanel, JTree se seleccionará y JPanel irá a la parte posterior. también después de ocultar jpanel nunca más aparece (¡no sé por qué! pero parece que nunca pasa de jtree).Traer JPanel al frente de otros objetos en java (SWING)

Necesito una manera de llevar el JPanel adelante de cualquier cosa. ¿Cómo puedo hacer esto?

También debo mencionar que no quiero JDialog. Quiero usar la parte superior de jpanel de cualquier elemento para mostrar una carga hasta que termine el proceso.

+1

Probablemente debería utilizar un 'JDialog' en lugar de un' JPanel', ya que se puede establecer su _modality_ – mre

+1

_Also debo mencionar que yo no quiero JDialog.Quiero usar la parte superior de jpanel de cualquier elemento para mostrar una carga hasta que termine el proceso. ¿Qué? 'JDialog' hará todo esto de forma gratuita. ¿Puedes justificar el uso de 'JPanel' en lugar de' JDialog'? – mre

Respuesta

8

Así que aquí tiene al menos dos soluciones. O ve con lo que sugieren @Geoff y @sthupahsmaht. Por cierto, también es posible utilizar JOptionPane, que crea automáticamente un diálogo para usted.

La otra opción sería usar un GlassPane de un marco.

O bien, otra opción es utilizar JLayeredPane como @jzd sugiere.

EDIT: ejemplo que muestra cómo utilizar GlassPane para capturar las selecciones del usuario. Pruebe los siguientes pasos:

1.Haga clic con el botón izquierdo sobre el cristal visible al inicio. Ver la salida.

2.Haga clic derecho. Esto oculta el panel de vidrio.

3.Haga clic con el botón izquierdo en el panel de contenido. Ver la salida.

4.Haga clic derecho en él. Vaya al punto 1. Disfrútelo.

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class OverPanel extends JPanel 
{ 
    private static void createAndShowGUI() 
    { 
     final JFrame f = new JFrame(); 
     f.setPreferredSize(new Dimension(400, 300)); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
     JPanel glassPanel = new JPanel(); 
     glassPanel.setBackground(Color.RED);   
     glassPanel.addMouseListener(new MouseAdapter() 
     { 
      @Override 
      public void mousePressed(MouseEvent e) 
      { 
       super.mousePressed(e); 
       System.out.println("f.getGlassPane() mousePressed"); 
       if(e.getButton() == MouseEvent.BUTTON3) 
        f.getGlassPane().setVisible(false); 
      } 
     }); 
     f.setGlassPane(glassPanel);  

     f.getContentPane().setBackground(Color.GREEN); 
     f.getContentPane().addMouseListener(new MouseAdapter() 
     { 
      @Override 
      public void mousePressed(MouseEvent e) 
      { 
       super.mousePressed(e); 
       System.out.println("f.getContentPane() mousePressed"); 
       if(e.getButton() == MouseEvent.BUTTON3) 
        f.getGlassPane().setVisible(true); 
      } 
     }); 
     f.getGlassPane().setVisible(true); 
     f.pack(); 
     f.setVisible(true); 
    } 

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

Edit2: Si usted quiere tener un efecto de un cuadro de diálogo, se puede lograr mediante la incorporación de manera apropiada este código en mi ejemplo.

 JPanel panel = new JPanel(new GridLayout(0, 1)); 
     panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); 
     panel.setBackground(Color.YELLOW); 
     panel.add(new JLabel("I am message Label")); 
     panel.add(new JButton("CLOSE")); 
     JPanel glassPanel = new JPanel(new GridBagLayout()); 
     glassPanel.setOpaque(false); 
     glassPanel.add(panel); 
+0

No como me imagino (como html + jquery pre cargadores) pero funciona. – ShirazITCo

1

No está claro cómo está organizado su código. Sin embargo, parece que lo que podría querer es un diálogo modal. Aquí hay un enlace a una discusión similar con una cantidad de recursos referenciados.

How to make a JFrame Modal in Swing java

+0

esto realmente sirve mejor como un comentario. – mre

+0

Gracias por el consejo. Lo haré la próxima vez. – Geoff

4

Se necesita un de usar un JLayeredPane para los componentes en movimiento delante de la otra.

Aquí hay un tutorial: How to use Layered Panes

+0

+1 @jzd Me olvidé de eso. Pero supongo que no resolvería por completo el problema de la modalidad si el panel es más pequeño que el árbol. Por lo tanto, creo que un diálogo encaja mejor aquí. – Boro

+0

@Boro, estoy de acuerdo, un diálogo parece tener más sentido, pero la pregunta dice específicamente "No quiero JDialog". – jzd

+0

Sí, estoy de acuerdo. Ahora sí, pero no fue así cuando estaba respondiendo :) – Boro

0
Jpanel main = new JPanel(); 
Jpanel a = new JPanel(); 
JPanel b = new Jpanel(); 

main.add(a); 
main.add(b); 

en este punto del objeto:

a -> 0 (index) 
b -> 1 (index) 

main.getComponentCount() = 2 

main.setComponentZorder(b,0); 


a -> 1 
b -> 0; 

b OVER 
a DOWN 
+2

Utilice el formato del código para que el texto sea más legible. – span

Cuestiones relacionadas