2010-11-21 26 views
0

Programımın bir noktasında, program çalışırken neler olup bittiğine dair bilgileri görüntüleyen bir JDialog açılır. Birkaç etiket ve bir ilerleme çubuğu vardır, ancak diyalog penceresi açıldığında hiçbir şey göstermez. Bu pencere açılırÖzel JDialog görünür, ancak boş

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...) 
} 

sonra, programın geri kalan kısmı normal olarak, sadece bu pencere boştur yürütme tutar:

Burada, özel iletişim ve yapıcı bu. Ben bir şey eksik miyim?

+0

İletişim Kutusu hiç gösteriliyor mu? Değilse, önce JDialog'un setSize() yöntemini kullanmayı deneyin. –

+0

@pouncep: Görünüşe göre, hiçbir şey olmadan. – Max

+0

['invokeLater'] 'ı (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html), event-dispatch iş parçacığından' window.setVisible (true) 'olarak adlandırmayı deneyin. – casablanca

cevap

1

Eğer GUI için EventDispatchThread, engelliyor, çünkü kendisini yeniden çizilecek olamaz. Daha fazla bilgi için Concurrency numaralı Swing öğreticisinden bölümü okuyun.

Uygun bir SSCCE sağlamadığınız için, tahmin edemeyiz.

+0

Teşekkürler. Bu ihtiyacım olan şeye benziyor. – Max

+0

Hata ayıklama yaparken, kodunuz boyunca SwingUtilities.isEventDispatchThread() çağrılarını serpmek yararlı olur. –

0

Bu gerçekten garip. Bu kod benim için iyi çalışıyor, yani boş bir ana pencere (sağda) ve “pop-up” çocuk çerçevesi penceresi (ki sizin için işe yaramadığını) gösteriyor. Ben Ubuntu altında NetBeans 6.8 ve Java 1.6 kullandım: Muhtemelen

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 

} 
+0

Bir önsezede, iletişim ekranından sonra kalan programın geri kalanını yorumladım ve doğru şekilde çalıştı. Bunun olmasının bir sebebi var mı? – Max

+0

Aklıma gelen ilk fikir, bir şekilde 'içerik' veya 'window' nesnelerini kullanmanızdır. – shybovycha

İlgili konular