Question

I am trying to display an indeterminate progress bar when the user clicks certain buttons in my swing app. I have written a generic class for the progress bar that am simply calling everytime those few buttons are clicked. The progress bar window is shown in the taskbar but not on the screen. Why is that happening and how can I fix it?

Thanks for any help.

EDIT:

SSCE for my application: Progress Bar class

package mainform;

public class ProgressBarIndeterminate extends javax.swing.JFrame {
public ProgressBarIndeterminate() {
    initComponents();
}


private void initComponents() {

    jProgressBar1 = new javax.swing.JProgressBar();

    setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    setAlwaysOnTop(true);
    setBackground(new java.awt.Color(255, 255, 255));
    setUndecorated(true);
    setResizable(false);

    jProgressBar1.setBackground(new java.awt.Color(255, 255, 255));
    jProgressBar1.setForeground(new java.awt.Color(153, 255, 0));
    jProgressBar1.setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));
    jProgressBar1.setFocusable(false);
    jProgressBar1.setIndeterminate(true);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
    );

    pack();
}
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new ProgressBarIndeterminate().setVisible(true);
        }
    });
}                        
private javax.swing.JProgressBar jProgressBar1;
}

Class ViewRec:

package mainform;
public class ViewRec extends javax.swing.JFrame {
public ViewRec() {
    initComponents();
    try{
        Thread.sleep(10000);
    }
    catch(Exception e){}
}  

private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();

    setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    setBackground(new java.awt.Color(255, 255, 255));
    setResizable(false);

    jTable1.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {

        },
        new String [] {
            "E-Mail ID", "Customer Name", "City", "State", "Industry", "Priority"
        }
    ) {
        Class[] types = new Class [] {
            java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
        };
        boolean[] canEdit = new boolean [] {
            false, false, false, false, false, false
        };

        public Class getColumnClass(int columnIndex) {
            return types [columnIndex];
        }

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit [columnIndex];
        }
    });
    jScrollPane1.setViewportView(jTable1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 912, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
    );

    pack();
}                            
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;    
}

Class ComposeMail:

package mainform;
public class ComposeMail extends javax.swing.JFrame {
ProgressBarIndeterminate pbi=new ProgressBarIndeterminate();

public ComposeMail() {                
        initComponents();            
}


private void initComponents() {

    jButton4 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

    jButton4.setText("View Recipients");
    jButton4.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton4ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()

                    .addComponent(jButton4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGroup(layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addGap(10, 10, 10)
    ))))));
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(11, 11, 11)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(3, 3, 3)                        
                .addComponent(jButton4))                
    )));
    pack();
}

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    pbi.setVisible(true);
    new ViewRec().setVisible(true);
    pbi.dispose();
}                                        
public static void main(String[] args){        
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new ComposeMail().setVisible(true);
        }
    });
}


private javax.swing.JButton jButton4;             
}

Compile and run ComposeMail to recreate my issue.

Was it helpful?

Solution

Your progress bar would be shown - if only Swing were thread safe.

Remove pbi.dispose(), and you should see your progress bar.

You are setting it visible, but immediately afterwards you create an instance of ViewRec - and ViewRec is going to block the thread for it's actions. After ViewRec is constructed, setVisible() is going to be called, and again immediately, you dispose your progress bar.

You can find information about how to use progress bars in the official Tutorials offered by Oracle.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top