Fenster lädt nicht

Nck256

Mitglied
Kurzer Einblick: Klickt man auf ein Button, lädt das Programm neue Daten aus dem Internet. Dabei öffnet sich ein Fenster, auf welchem Bitte Warten steht. Dieses Fenster lädt aber nicht korrekt. Heisst: Der Text bleibt weiß, bis es fertig geladen hat. Erst dann erscheint auch der Text.
 
Dann läuft die ganze Aktion "lädt das Programm neue Daten aus dem Internet" vermutlich auf dem EDT.
Wenn der blockiert ist kann die GUI nichtmehr aktualisiert werden.
=> lange Berechnungen immer in nem extra thread ausführen
 
Also mein Button-Aufruf sieht so aus:
Java:
Wait W = new Wait();
 W.setTitle("Bitte Warten...");
 W.setVisible(true);
 DLThread thread1 = new DLThread();
 thread1.start();
W.dispose;

Läuft, aber immer noch dasselbe Problem.
 
[Java]class DLThread {
void start() {
try
{

final URL url = new URL("***");
final URLConnection conn = url.openConnection();
final InputStream is = new BufferedInputStream(conn.getInputStream());
final OutputStream os =
new BufferedOutputStream(new FileOutputStream("data\\newfile.jar"));
byte[] chunk = new byte[1024];
int chunkSize;
while ((chunkSize = is.read(chunk)) != -1) {
os.write(chunk, 0, chunkSize);
}
os.flush();
os.close();
is.close();
BufferedReader in = new BufferedReader(new FileReader("data\\version "));
String Version = in.readLine();
in.close();
JOptionPane.showMessageDialog(null, "Update der Programmdaten auf " + Version + "erfolgreich!", "Erfolgreich", JOptionPane.OK_OPTION);
}
catch (Exception f)
{
JOptionPane.showMessageDialog(null, "Update Fehlgeschlagen! Keine Internet-Verbindung?\r\n" + f, "Erfolgreich", JOptionPane.OK_OPTION);
}
}

}[/Java]

und

[Java]package biber.tool;

import java.awt.BorderLayout;
import javax.swing.GroupLayout;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.LayoutStyle;

import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit Cloud Garden (Java Resources) for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class Wait extends javax.swing.JFrame {
private JLabel WaitLable;

/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Wait inst = new Wait();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}

public Wait() {
super();
initGUI();
}

private void initGUI() {
try {
GroupLayout thisLayout = new GroupLayout((JComponent)getContentPane());
getContentPane().setLayout(thisLayout);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
{
WaitLable = new JLabel();
WaitLable.setText("Bitte warten ...");
}
thisLayout.setVerticalGroup(thisLayout.createSequentialGroup()
.addContainerGap(17, Short.MAX_VALUE)
.addComponent(WaitLable, GroupLayout.PREFERRED_SIZE, 34, GroupLayout.PREFERRED_SIZE)
.addContainerGap());
thisLayout.setHorizontalGroup(thisLayout.createSequentialGroup()
.addContainerGap(72, 72)
.addComponent(WaitLable, GroupLayout.PREFERRED_SIZE, 106, GroupLayout.PREFERRED_SIZE)
.addContainerGap(82, Short.MAX_VALUE));
pack();
this.setSize(276, 101);
} catch (Exception e) {
//add your error handling code here
e.printStackTrace();
}
}

}
[/code]
 
Nur weil deine Klasse "Thread" im Namen hat ist das aber noch lange keiner 😉
Sobald du start() aufrufst ist der EDT blockiert.
Mache also aus der DLThread Klasse einen richtigen Thread, dann ist dein Problem gelöst.
dispose() rufst du dann auf sobald der Thread mit seiner Arbeit fertig ist.
 
Nur weil deine Klasse "Thread" im Namen hat ist das aber noch lange keiner 😉
Sobald du start() aufrufst ist der EDT blockiert.
Mache also aus der DLThread Klasse einen richtigen Thread, dann ist dein Problem gelöst.
dispose() rufst du dann auf sobald der Thread mit seiner Arbeit fertig ist.

dispose direkt danach ist Unfug. Auf den Thread warten auch (Wozu dann der Thread?).

Was passiert bei new DLThread() wäre die goldfrage.
 
Hey Danke, hat geklappt! Nur wie mache ich das mit dem Dispose? Wenn ich das am Ende des Threads mache kommt ne Fehlermeldung und wenn ich die Frame-Klasse importiere, gehts auch nicht. (Das ist die mit dem Button)

Und ich hätte noch ne andere Frage. Soll ich die noch hier reinposten oder nen neuen Thread aufmachen?
 
Um das für den TO nochmal klar zu machen:
Java:
		final Wait wait = new Wait();
		wait.setTitle("Bitte Warten...");
		wait.setVisible(true);
		
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				Downloader dl = new Downloader(); // muss jetzt kein Thread mehr sein, läuft schon async zum EDT
				dl.startDownload();
				wait.dispose; // wartefenster schließen
			}
		});
So oder so ähnlich solltest du das machen.
Wichtig ist dass der Downloadvorgang nicht auf dem EDT läuft.

EDIT:
grade deinen Beitrag gelesen.
Dein Thread braucht ne referenz auf den Wait-dialog, dann kannst du darauf dispose() aufrufen.

Wenn die Frage hiermit zu tun hat dann poste die ruhig hier. Wenns Themenfremd is dann mach lieber nen neuen Thread auf.
 
Ich tue mir grade ein wenig schwer mit der Refernez 😀 Denke mal ist einfach etwas zu spät.

Was ich noch fragen wollte: Wie mache ich eine Progressbar? Ich habe die Tuts nie wirklich verstanden 😀
 
Seine bisherige Herangehensweise tut das doch auch, nur das durch das dispose() das Fenster schnell geschlossen ist. Etwas anderes als der DL soll doch nicht stattfinden oder??

Naja, es ist pät.
 
Seine bisherige Herangehensweise tut das doch auch, nur das durch das dispose() das Fenster schnell geschlossen ist. Etwas anderes als der DL soll doch nicht stattfinden oder??
Nein, sein Code oben hat den EDT blockiert. Das sollteste nicht machen..
 
Der Button
[Java] final Wait wait = new Wait();
wait.setTitle("Bitte Warten...");
wait.setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
@Override

public void run() {
Download dl = new Download();
dl.startDownload();
wait.dispose();[/code]

Wait-Fenster
[Java]
public class Wait extends javax.swing.JFrame {

/** Creates new form Wait */
public Wait() {
initComponents();
}

/** 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() {

jProgressBar1 = new javax.swing.JProgressBar();
jLabel1 = new javax.swing.JLabel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));
setFocusable(false);
setFocusableWindowState(false);
setResizable(false);

jProgressBar1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jProgressBar1.setIndeterminate(true);

jLabel1.setText("Bitte warten...");

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(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGap(48, 48, 48)
.addComponent(jLabel1)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 25, Short.MAX_VALUE)
.addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);

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 Wait().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JProgressBar jProgressBar1;
// End of variables declaration
}
[/code]
 
Und wenn du Wait startest bewegt sich die ProgressBar nicht?
Oder testest du das ganze nur mit deinem Downloader? Wenn sich dann nichts bewegt, dann blockierst du immernoch irgendwo den EDT.
 
Hab einmal nur Wait gestartet und einmal das ganze Programm und den Downloadbutton gedrückt. Wenn ich nur Wait starte, bewegt sich die Progressbar. Beim Download allerdings nur, nachdem der Download fertig ist.
 
Du hast bisher die Wait Klasse gezeigt, ok.
Zusätzlich noch nen unvollständigen schnipsel ohne irgendeinen Kontext.

Poste doch bitte die Komplette Methode in der der Wait Dialog aufgerufen wird.
 
Java:
   private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        final Wait wait = new Wait();
        wait.setTitle("Bitte Warten...");
        wait.setVisible(true);
                SwingUtilities.invokeLater(new Runnable() {
            @Override
                    
            public void run() {
                Download dl = new Download(); 
                dl.Download();
                wait.dispose();
            }
[/Java]
 

Zurück
Oben