Portare JPanel a fronte di altri oggetti in java (SWING)

Voglio fare un messaggio di caricamento quando un’app processi, così ho usato un JPanel oltre un JTree. Ma quando l’utente fa clic sul JPanel, il JTree saranno selezionate e la JPanel andrà sul retro. Dopo aver nascosto il JPanel, non mostra mai di nuovo. Non so perché, ma a quanto pare non passare mai davanti al JTree.

Ho bisogno di un modo per portare il JPanel di fronte a tutto ciò. Come posso fare questo?

EDIT: Inoltre devo dire che non voglio un JDialog. Voglio usare il JPanel su qualsiasi elemento per mostrare un messaggio di caricamento fino a quando un processo termina.

Probabilmente si dovrebbe essere utilizzando un JDialog invece di un JPanel, dal momento che si può impostare il suo modo
devo Anche dire che io non voglio JDialog. voglio utilizzare il jpanel superiore di qualsiasi elemento di mostrare un carico fino a quando un processo di finitura. che Cosa? JDialog farà tutto questo per libero. Potete per favore giustificare l’utilizzo di un JPanel invece di un JDialog?

OriginaleL’autore ShirazITCo | 2011-05-11

7 Replies
  1. 8

    Così qui si ha almeno due soluzioni. Vai con quello che @Geoff e @sthupahsmaht stanno proponendo. BTW anche possibile utilizzare JOptionPane che crea automaticamente una finestra di dialogo per voi.

    L’altra opzione sarebbe quella di utilizzare un GlassPane da una cornice.

    O ancora un’altra opzione è quella di utilizzare JLayeredPane come @jzd suggerisce.

    EDIT:
    Esempio che mostra come utilizzare GlassPane per catturare le selezioni dell’utente.
    Provare la seguente procedura:

    1.Cliccando a sinistra sul vetro visibile all’inizio. Vedere l’uscita.

    2.A destra clic su di esso. Questo nasconde il pannello di vetro.

    3.Cliccando a sinistra sul riquadro del contenuto. Vedere l’uscita.

    4.A destra clic su di esso. Andare al punto 1.
    Godere di.

    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:
    Se si desidera avere un effetto di una finestra di dialogo, è possibile raggiungere, integrando opportunamente il codice nel mio esempio.

            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);
    Non come immagino (Come html + jquery pre pale), ma funziona.

    OriginaleL’autore Boro

  2. 4

    Devi utilizzare un JLayeredPane per i componenti di spostamento in fronte all’altro.

    Ecco un tutorial: Utilizzo di Vetri Stratificati

    +1 @jzd ho dimenticato su di esso. Ma credo che non risolve completamente il problema della modalità, se il pannello è più piccolo di un albero. Quindi credo che un dialogo si adatta meglio di qui.
    Sono d’accordo, una finestra di dialogo sembra avere più senso, ma la domanda in particolare dice “non voglio JDialog”.
    Sì sono d’accordo. Ora funziona, ma non quando stavo rispondendo 🙂
    sì non dire che quando mi è stata risposta.

    OriginaleL’autore jzd

  3. 1

    Non è molto chiaro in che modo il codice è organizzato. Tuttavia, sembra che ciò che si potrebbe desiderare è una finestra di dialogo modale. Ecco un link ad una discussione simile con un numero di risorse di riferimento.

    Come fare un JFrame Modale in java Swing

    questo serve davvero meglio come commento.
    Grazie per il suggerimento. Lo farò la prossima volta.

    OriginaleL’autore Geoff

  4. 0
    Jpanel main = new JPanel();
    Jpanel a = new JPanel();
    JPanel b = new Jpanel();
    
    main.add(a);
    main.add(b);

    a questo punto l’oggetto:

    a -> 0 ( index)
    b -> 1 (index)
    
    main.getComponentCount() = 2
    
    main.setComponentZorder(b,0);
    
    
    a -> 1
    b -> 0;
    
    b OVER
    a DOWN
    Si prega di utilizzare il codice di formattazione per rendere il testo più leggibile.

    OriginaleL’autore Santiago

  5. 0

    Per coloro che non hanno alcun problema utilizzando un JDialog, questo è un modo sicuro per farlo vedi se hai problemi. Basta fare in modo di controllare correttamente se la finestra di dialogo modale, per lo smaltimento, l’impostazione di messa a fuoco etc.

    JDialog dialog = new JDialog();
    dialog.setAlwaysOnTop(true);

    OriginaleL’autore CodeAssist

Lascia un commento