Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Translucent loading overlay for JFrame

Tags:

java

swing

I have a JFrame containing various components and I would like to add a translucent grey overlay over the top while the application is initializing various things. Ideally it would prevent interaction with the underlying components and would be able to display some "Loading..." text or a spinning wheel or something similar.

Is there a simple way to do this using Java and Swing?

like image 916
DanielGibbs Avatar asked Dec 11 '25 03:12

DanielGibbs


2 Answers

Take a look at JRootPane and JLayeredPane http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#layeredpane

What you're asking about specifically sounds like a Glass Pane. http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#glasspane

The Glass Pane prevents interaction with underlying components and can be used to display something on top of your JFrame.

like image 92
David Koelle Avatar answered Dec 13 '25 17:12

David Koelle


As @David said, you can use the glass pane for displaying some loading text or image above the rest of the application.

As for the grey overlay: why don't you use the built in ability to disable components as long as your application is loading? Disabled components will get grayed out automatically and cannot be interacted with by the user.

Something like this:

public class LoadingFrame extends JFrame{

JButton button;
public LoadingFrame() {
    button = new JButton("ENTER");
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Application entered");
        }
    });
    setLayout(new BorderLayout());
    add(button, BorderLayout.CENTER);
}


public void startLoading(){
    final Component glassPane = getGlassPane();
    final JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    final JLabel label = new JLabel();
    panel.add(label, BorderLayout.SOUTH);
    setGlassPane(panel);
    panel.setVisible(true);
    panel.setOpaque(false);
    button.setEnabled(false);

    Thread thread = new Thread(){
        @Override
        public void run() {
            for (int i = 5; i > 0; i--) {
                label.setText("Loading ... " + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
                            // loading finished
            setGlassPane(glassPane);
            button.setEnabled(true);
        }
    };
    thread.start();
}

public static void main(String[] args) {
    LoadingFrame frame = new LoadingFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500, 500);
    frame.startLoading();
    frame.setVisible(true);
}
}
like image 21
Balder Avatar answered Dec 13 '25 17:12

Balder



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!