2012-04-07 2 views
1

Ich habe eine JDialog in NetBeans und einen benutzerdefinierten Konstruktor wie folgt erstellt:, Mein Problem istForce JDialog, um vor dem Verarbeiten von Daten sichtbar zu werden?

new AnimatedProgress(this, true, dataTable).setVisible(True); 

als Java den Konstruktor aufruft, alle Codes:

public AnimatedProgress(java.awt.Frame parent, boolean modal, JTable table) { 
    super(parent, modal); 
    initComponents(); 
    setLocationRelativeTo(parent); 
    progressLabel.setText("Collecting Table Data. . ."); 
    Object[][] data = getJTableData(table); // Simple method to collect data and store in Object[][] array 
    progressLabel.setText("Processing Data. . ."); 
    processData(data); 
    progressLabel.setText("Data Processed. . ."); 
} 

Jetzt habe ich diese JDialog wie genannt im Konstruktor wird zuerst ausgeführt und dann erscheint der Dialog mit dem Endergebnis.

Wie kann ich meinen JDialog zuerst erscheinen lassen und dann die Methoden verarbeiten: getTableData() und processData() ??

+4

Blockieren Sie nicht den EDT (Event Dispatch Thread) - die GUI wird "eingefroren", wenn das passiert. Statt '' 'Thread.sleep (n)' aufzurufen, implementieren Sie einen Swing 'Timer' für wiederkehrende Aufgaben oder einen' SwingWorker' für lang andauernde Aufgaben. Siehe [Parallelität in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) für weitere Details. –

+0

@AndrewThompson - Ja Das ist eigentlich das Hauptproblem. Nun, ich kenne 'swing.Timer' gut, aber es gibt nur zwei Prozesse, die sich definitiv nicht wiederholen, und ich weiß nicht, wie man' SwingWorker' hier anwendet. . . Kannst du bitte diese Frage mit 'SwingWorker' Code beantworten? – Asif

+2

@Asif: Bitte fragen Sie nicht nach Code - das liegt an Ihnen zu erstellen. Sehen Sie sich das Tutorial von Andrew Thompson an und versuchen Sie, Ihren eigenen Code zu erstellen. Dann, wenn Sie stecken bleiben, posten Sie Ihren Versuch hier. –

Antwort

4

Hier ein Beispiel Verwendung von SwingWorker:

public class BackgroundThread extends SwingWorker<Void, Void> 
{ 
    private JTable table; 

    public BackgroundThread(JTable table) 
    { 
     this.table = table; 
    } 

    @Override 
    public Void doInBackground() throws Exception 
    { 
     /* 
      If getJTableData() or processData() are not static, 
      pass a reference of your class which has these methods 
      and call them via that reference 
     */ 
     Object[][] data = getJTableData(table); 
     publish("Processing Data. . ."); 
     processData(data); 
     publish("Data Processed. . ."); 
     return null; 
    } 

    @Override 
    public void process(List<String> chunks) 
    { 
     for(String chunk : chunks) progressLabel.setText(chunk); 
    } 
} 

Dazu Konstruktor dies ändern:

public AnimatedProgress(java.awt.Frame parent, boolean modal, JTable table) 
{ 
    super(parent, modal); 
    initComponents(); 
    setLocationRelativeTo(parent); 
    setVisible(true); 
    new BackgroundThread(table).execute(); 
} 

ich es nicht getestet, aber ich hoffe, es funktioniert.

+0

Oh, vielen Dank, ich brauche nur einen Strukturcode, wie Sie geben :) Ich werde die Fehler behandeln, wenn irgendwelche auftreten. . :) – Asif

+0

@Asif, wenn 'getJTableData()' oder 'processData()' irgendeine Änderung auf der GUI enthält, versuche, sie in 'process()' Methode zu übertragen, nur um das Einfrieren der GUI zu vermeiden. –

+0

Ich habe diesen Fehler beim Deklarieren 'process()' Methode: 'Methode überschreibt oder implementieren eine Methode aus einem Supertype Name Konflikt: Prozess (java.util.List ) in BackgroundThread und Prozess (java.util.List ) in javax.swing.SwingWorker hat die gleiche Löschung, aber keiner überschreibt den anderen. – Asif

0

Der JDialog kann nicht sichtbar sein, bevor er erstellt wird ==> Der Konstruktor muss vollständig ausgeführt werden, bevor sich die Sichtbarkeit ändert.
Ich denke, Sie sollten eine myInitialize() -Methode erstellen, die die Datenfüllungen enthält. Zuerst machen Sie den Dialog sichtbar, indem Sie den Konstruktor als jetzt aufrufen und danach können Sie Ihre myIntialize() Methode aufrufen, um die Komponenten mit den richtigen Daten zu füllen.

+0

und wo soll ich diese 'myInitialize()' Methode aufrufen? – Asif

+0

Nach dem Konstruktoraufruf. AnimatedProgress Fortschritt = new AnimatedProgress (dies ist wahr, dataTable); progress.setVisible (wahr); progress.init(); – dexametason

+0

Tatsächlich wird der gesamte Code in den Methoden 'getTableData()' und 'processData()' zusammen mit der Animation in diesem 'JDailog' ausgeführt (ich überspringe jedoch den 'Timer' - Code hier), und ich kann diesen Code nicht mit dem Ereignis, von dem ich den 'JDialog' nannte ... ich hoffe, dass ich Ihnen klar bin :) – Asif

Verwandte Themen