Question

At a point in my program, it opens a JDialog that displays information about what is going on as the program runs. It has several labels and a progress bar, but when the dialog window opens, it doesn't display anything.

Here's the custom dialog and its constructor:

public class DataMiner implements ActionListener
{
    private Hashtable<Integer, GISNode> nodeTable;
    private Hashtable<Integer, GISLink> linkTable;
    private int numLinesIgnored;
    private int numLinesProcessed;
    private int numNodes;
    private int numLinks;
    private int numDuplicates; 
    private int numFailedGeoCodingRequests;
    private boolean cancelled;

// window objects 
    private JDialog window;
    private JLabel LinesIgnored;
    private JLabel LinesProcessed;
    private JLabel Nodes;
    private JLabel Links;
    private JLabel Duplicates; // tracks the number of equivalent data entries found.
    private JLabel FailedGeoCodingRequests;
    private JProgressBar progressBar;
    private JButton cancelButton;

    public DataMiner(JFrame parentWindow)
    {
        nodeTable = new Hashtable<Integer, GISNode>(1000);
        linkTable = new Hashtable<Integer, GISLink>(1000);

        numLinesIgnored = 0;
        numLinesProcessed = 0;
        numNodes = 0;
        numLinks = 0;
        numDuplicates = 0; 
        numFailedGeoCodingRequests = 0;
        cancelled = false;

        LinesIgnored = new JLabel();
        LinesProcessed = new JLabel();
        Nodes = new JLabel();
        Links = new JLabel();
        Duplicates = new JLabel();
        FailedGeoCodingRequests = new JLabel();
        cancelButton = new JButton("Cancel");
        progressBar = new JProgressBar();

        updateLabels(); // assigns a formatted string to each JLabel
        cancelButton.addActionListener(this);

    // initialize window
        window = new JDialog(parentWindow);
        window.setResizable(false);
        window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        Container content = window.getContentPane();
        content.setLayout(new GridLayout(7,1));
        content.add(LinesProcessed);
        content.add(Nodes);
        content.add(Links);
        content.add(Duplicates);
        content.add(LinesIgnored);
        content.add(FailedGeoCodingRequests);
        content.add(progressBar);
        JPanel p1 = new JPanel();
        p1.add(new JLabel("")); // takes up space
        p1.add(cancelButton);
        content.add(p1);
        window.pack();
        window.setLocationRelativeTo(parentWindow);
        window.setVisible(true);
    }

    (rest of the class...)
}

Once this window opens, the rest of the program keeps executing as normal, just this window is blank. Am I missing anything?

Was it helpful?

Solution

Probably because you are blocking the EventDispatchThread, to the GUI can't repaint itself. Read the section from the Swing tutorial on Concurrency for more information.

Since you didn't provide a proper SSCCE we can't do any more than guess.

OTHER TIPS

That's really strange. This code works just fine for me meaning shows an empty main window (which is right) and "pop-ups" children frame window (which you are saying do not works for you). I've used NetBeans 6.8 and Java 1.6 under Ubuntu:

package javaapplication2;

import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

public class MainFrame extends javax.swing.JFrame {

    private int numLinesIgnored;
    private int numLinesProcessed;
    private int numNodes;
    private int numLinks;
    private int numDuplicates;
    private int numFailedGeoCodingRequests;
    private boolean cancelled;

// window objects
    private JDialog window;
    private JLabel LinesIgnored;
    private JLabel LinesProcessed;
    private JLabel Nodes;
    private JLabel Links;
    private JLabel Duplicates; // tracks the number of equivalent data entries found.
    private JLabel FailedGeoCodingRequests;
    private JProgressBar progressBar;
    private JButton cancelButton;

    /** Creates new form MainFrame */
    public MainFrame() {
        initComponents();

        JFrame parentWindow = this;


        numLinesIgnored = 0;
        numLinesProcessed = 0;
        numNodes = 0;
        numLinks = 0;
        numDuplicates = 0;
        numFailedGeoCodingRequests = 0;
        cancelled = false;

        LinesIgnored = new JLabel();
        LinesProcessed = new JLabel();
        Nodes = new JLabel();
        Links = new JLabel();
        Duplicates = new JLabel();
        FailedGeoCodingRequests = new JLabel();
        cancelButton = new JButton("Cancel");
        progressBar = new JProgressBar();

    // initialize window
        window = new JDialog(parentWindow);
        window.setResizable(false);
        window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        Container content = window.getContentPane();
        content.setLayout(new GridLayout(7,1));
        content.add(LinesProcessed);
        content.add(Nodes);
        content.add(Links);
        content.add(Duplicates);
        content.add(LinesIgnored);
        content.add(FailedGeoCodingRequests);
        content.add(progressBar);
        JPanel p1 = new JPanel();
        p1.add(new JLabel("")); // takes up space
        p1.add(cancelButton);
        content.add(p1);
        window.pack();
        window.setLocationRelativeTo(parentWindow);
        window.setVisible(true);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    // End of variables declaration

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