Edward Eddy67716
Edward Eddy67716

Reputation: 69

JFrame with JProgressBar not showing components while reading file

I am writing code to read an Impulse Tracker module file into this object. It opens a JProgressBar while the file loads and displays which part of the file is being loaded.

The JFrame that displays the JProgressBar however is not showing any content (It gets called from another JPanel in a main JFrame) and if I put the JFrame's .setVisibility(true) method into an EventQueue.invokeLater() method, the frame doesn't show till the file is fully read and then it is too late for the bar to be useful.

An EventQueue.invokeAndWait() method will just throw a 'Cannot call invokeAndWait from the event dispatcher thread' exception.

How do I fix this that the JFrame sets up and shows the progress bar first, then the file is read and the progress bar is updated accordingly?

package Module.IT.Format;

import java.awt.BorderLayout;
import java.awt.Color;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

/**
 *
 * @author Edward Jenkins
 */
public class ITFile implements IModuleFile {

    // constants
    public static final int MOD_TYPE_ID = 4;

    // instance variables
    // it variables

    // constructor
    public ITFile(String file) {
        this.file = file;
    }
    
    // getters are here
    
    // method with issues
    @Override
    public boolean read() throws Exception {

        try {

            // progression bar
            JFrame progressFrame = new JFrame("Loading IT file...");
            JPanel loadPanel = new JPanel();
            JProgressBar fileLoader = new JProgressBar();
            fileLoader.setValue(0);
            fileLoader.setString("Loading Header...");
            fileLoader.setBounds(40, 40, 200, 20);
            fileLoader.setStringPainted(true);
            fileLoader.setVisible(true);

            // add progress bar to load panel
            loadPanel.add(fileLoader);

            // add load panel to frame
            progressFrame.setLocationRelativeTo(null);
            progressFrame.setResizable(false);
            progressFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
            progressFrame.setAlwaysOnTop(true);
            progressFrame.setSize(280, 80);
            progressFrame.add(loadPanel);

            java.awt.EventQueue.invokeLater(() -> {
                progressFrame.setVisible(true);
            });

            // read header
            boolean headerRead = readHeader();
            fileLoader.setValue(10);
            fileLoader.setString("Loading Instruments...");

            // read instruments
            boolean instrumentsRead = readInstruments();
            fileLoader.setValue(20);
            fileLoader.setString("Loading Samples...");

            // read samples
            boolean samplesRead = readSamples();
            fileLoader.setValue(90);
            fileLoader.setString("Loading Patterns...");

            // read patterms
            boolean patternsRead = readPatterns();
            fileLoader.setValue(100);
            fileLoader.setString("Done! ");
            progressFrame.dispose();

            return (headerRead && instrumentsRead && samplesRead && patternsRead);

        } catch (Exception e) {
            throw e;
        }
    }

    // write method

    // methods for reading each part of file using a DataInputStream.
}

Upvotes: 0

Views: 28

Answers (0)

Related Questions