7 Stimmen

JPanel vor andere Objekte in Java bringen (SWING)

Ich möchte eine Lademeldung erstellen, wenn eine Anwendung verarbeitet wird, also habe ich eine JPanel über eine JTree . Aber wenn der Benutzer auf das Symbol klickt JPanel die JTree wird ausgewählt und die JPanel wird nach hinten gehen. Nach dem Verstecken der JPanel wird es nie wieder angezeigt. Ich weiß nicht, warum, aber es scheint, dass es nie vor dem JTree .

Ich brauche eine Möglichkeit, die JPanel vor allem. Wie kann ich das tun?

EDITAR: Ich muss auch erwähnen, dass ich keine JDialog . Ich möchte die JPanel über einem beliebigen Element, um eine Lademeldung anzuzeigen, bis ein Prozess abgeschlossen ist.

8voto

Boro Punkte 7893

Hier gibt es also mindestens zwei Lösungen. Entweder Sie nehmen das, was @Geoff und @sthupahsmaht vorschlagen. BTW auch möglich ist, JOptionPane zu verwenden, die automatisch einen Dialog für Sie erstellt.

Die andere Möglichkeit wäre die Verwendung eines GlassPane aus einem Rahmen.

Eine weitere Möglichkeit ist die Verwendung von JLayeredPane, wie von @jzd vorgeschlagen.

EDITAR: Beispiel für die Verwendung GlasScheibe um Benutzerauswahlen zu erfassen. Versuchen Sie folgende Schritte:

1. klicken Sie mit der linken Maustaste auf die Glasscheibe, die beim Start sichtbar ist. Siehe die Ausgabe.

2. klicken Sie mit der rechten Maustaste darauf. Dadurch wird die Glasscheibe ausgeblendet.

3. klicken Sie mit der linken Maustaste auf das Inhaltsfenster. Sehen Sie die Ausgabe.

4. klicken Sie mit der rechten Maustaste darauf. Gehen Sie zu Punkt 1. Genießen Sie.

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 : Wenn Sie den Effekt eines Dialogs haben wollen, können Sie ihn erreichen, indem Sie diesen Code in mein Beispiel einbauen.

        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);

5voto

jzd Punkte 23299

Sie benötigen ein um ein JLayeredPane für das Verschieben von Komponenten voreinander.

Hier ist eine Anleitung: So verwenden Sie geschichtete Fenster

2voto

camickr Punkte 315810

Behinderte Glasscheibe könnte Ihnen weiterhelfen.

1voto

Geoff Punkte 773

Es ist nicht ganz klar, wie Ihr Code organisiert ist. Es klingt jedoch so, als ob Sie einen modalen Dialog wünschen. Hier ist ein Link zu einer ähnlichen Diskussion mit einer Reihe von referenzierten Ressourcen.

Wie macht man ein JFrame Modal in Swing java

0voto

Jarek Przygódzki Punkte 4004

Utilice JXLayer oder JIDE Overlayable .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X