Search code examples
javaswingsplash-screenjprogressbar

Visible JProgressBar while initializing main GUI


I'm building a fairly complicated GUI for a project I'm working on. Importantly, it contains (among other things) a JTabbedPane with 12+ panes of complex GUI components.

What I'm trying to do is display a JProgressBar when I'm instantiating these panes (creating and configuring; doing everything short of actually displaying). Actually, I'm hoping for an end result similar to the Eclipse splash screen:

enter image description here

Here is (updated to include SplashScreen) pseudo-code for what I'm trying to do:

ProgramManager:
private setupGUI() {
    mainGUI = new MainGUI(); // only instantiates internal JFrame field
    mainGUI.setup();
}

MainGUI:
public void setup() {
    //create and configure progress bar
    final SplashScreen ss = SplashScreen.getSplashScreen();
    JProgressBar jpb = new JProgressBar(){
        Graphics g = ss.createGraphics();
        @Override
        public void paint(Graphics pG) {
            // TODO Auto-generated method stub
            super.paint(g);
        }
    };
    jpb.setValue(0);        
    setup1stTab();
    //update Progress
    setup2ndTab();
    //update progress
    etc....
    ss.close();
}

Please let me know if this is just not possible, or if I'm simply going about it wrong. I've looked around and seen some mention of Threading/SwingWorker, but after messing around with that and the Observer/Observable stuff (admittedly only a little), I still can't figure it out.


Solution

  • To get something similar to the Eclipse splash, see java.awt.SplashScreen. Once the image is on-screen, it is possible to call SplashScreen.createGraphics() to get..

    ..a graphics context (as a Graphics2D object) for the splash screen overlay image, which allows you to draw over the splash screen.

    Draw the progress bar on top of that.