Принесите JPanel впереди других объектов в Java (SWING) - PullRequest
6 голосов
/ 11 мая 2011

Я хочу сделать сообщение о загрузке при обработке приложения, поэтому я использовал JPanel вместо JTree.Но когда пользователь нажимает на JPanel, будет выбран JTree и JPanel вернется назад.После сокрытия JPanel оно больше не отображается.Я не знаю почему, но кажется, что это никогда не идет впереди JTree.

Мне нужен способ поставить JPanel перед всем.Как я могу это сделать?

РЕДАКТИРОВАТЬ: Также я должен отметить, что я не хочу JDialog.Я хочу использовать JPanel поверх любого элемента для отображения сообщения о загрузке до завершения процесса.

Ответы [ 7 ]

8 голосов
/ 11 мая 2011

Итак, у вас есть как минимум два решения. Или идите с тем, что предлагают @Geoff и @sthupahsmaht. Кстати, также возможно использовать JOptionPane, которая автоматически создает диалог для вас.

Другим вариантом будет использование GlassPane из фрейма.

Или еще один вариант - использовать JLayeredPane, как подсказывает @jzd.

EDIT: Пример, показывающий, как использовать GlassPane для захвата пользовательских выборов. Попробуйте следующие шаги:

1. Левый клик на стеклянной панели виден при запуске. Смотрите вывод.

2. Щелкните правой кнопкой мыши. Это скрывает стеклянную панель.

3.Нажмите левой кнопкой мыши на панели содержимого. Смотрите вывод.

4. Щелкните правой кнопкой мыши. Перейти к пункту 1. Наслаждайтесь.

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 : Если вы хотите создать эффект диалога, вы можете добиться этого, включив соответствующий код в мой пример.

        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);
4 голосов
/ 11 мая 2011

Вам необходимо использовать JLayeredPane для перемещения компонентов друг перед другом.

Вот учебное пособие: Как использовать многослойные панели

2 голосов
/ 11 мая 2011
1 голос
/ 11 мая 2011

Не совсем понятно, как организован ваш код. Тем не менее, это звучит так, как будто вы хотите модальный диалог. Вот ссылка на аналогичное обсуждение с несколькими ссылочными ресурсами.

Как сделать модальный JFrame в Swing Java

0 голосов
/ 05 февраля 2019

Для тех, у кого нет проблем с использованием JDialog, это верный способ показать его, если у вас возникли проблемы.Просто убедитесь, что вы правильно управляете им, если диалоговое окно является модальным, при утилизации, настройке фокуса и т. Д.

JDialog dialog = new JDialog();
dialog.setAlwaysOnTop(true);
0 голосов
/ 13 декабря 2012
Jpanel main = new JPanel();
Jpanel a = new JPanel();
JPanel b = new Jpanel();

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

на данный момент объект:

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

main.getComponentCount() = 2

main.setComponentZorder(b,0);


a -> 1
b -> 0;

b OVER
a DOWN
0 голосов
/ 11 мая 2011

Используйте JXLayer или JIDE Overlayable.

...