Input/Output Stream werte in Label anzeigen.

nimda

Mitglied
Hey

hab ein kleines Problem, ich würde gerne wie unten angegeben eine Methode zum download von Dateien in ein OnlineDatei System integrieren. Was Cloud mäßiges aber ne ganze ecke einfacher...

Funktioniert prima nur das ich ausserhalb der Console nicht sehe wieviel ich gerade runtergeladen habe ... imo eigentlich nicht so schlimm da ich nur kleine pdfs rumliegen habe aber sollte doch iwann richtig Funktionieren.

Also was ich versucht habe anstelle von:

System.out.println(String.format("%d bytes gegalden", x));

würde ich gerne was wie

Java:
GUI gui = new GUI();
gui.setLabel1(String.format("%d bytes gegalden", x));
gui.rePaint();
machen.

tuts aber leider nicht :/ hab es so auch mit threads versucht, Wobei meine GUI ein thread ist den ich unter Main starte und meine download Funktion der 2te Thread die ich in einem ActionListener der GUI klasse Starte.

tat es aber auch nicht.

Hat hier wer evtl. einen Vorschlag wie ich mir meinen Download Status in der Gui anzeigen lassen kann?

Java:
public class loader{ 
	
	
        public void download(String url_str, OutputStream os) 
            throws IllegalStateException, MalformedURLException, 
            ProtocolException, IOException { 

        HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
        conn.setRequestMethod("GET"); 
        conn.connect(); 
        int responseCode = conn.getResponseCode(); 
        if (responseCode == HttpURLConnection.HTTP_OK) { 
            byte tmp_buffer[] = new byte[4096]; 
            InputStream is = conn.getInputStream(); 
            int n,x=0; 
            while ((n = is.read(tmp_buffer)) > 0) { 
                os.write(tmp_buffer, 0, n); 
                os.flush(); 
                x+=n;
                System.out.println(String.format("%d bytes gegalden", x));
            } 

        } else { 
            throw new IllegalStateException("HTTP response: " + responseCode); 
        }
    }
 

anti-held

Bekanntes Mitglied
Da GUI-Änderungen werden erst übernommen, wenn dein Thread terminiert ist.
Deiner terminiert erst, wenn alles geladen wurde.

-> Erstelle für die Änderungen einen neuen Thread.

Sth like
Java:
		final GUI gui = new GUI();
        while ((n = is.read(tmp_buffer)) > 0) {
            os.write(tmp_buffer, 0, n);
            os.flush();
            x+=n;
            new Thread(){
            	public void run() {
            		gui.setLabel1(String.format("%d bytes gegalden", x));
            		gui.rePaint();
            	};
            }.start();
           System.out.println(String.format("%d bytes gegalden", x));
       }

natürlich nur, wenn deine GUI auch passend implementiert ist.
 

nimda

Mitglied
Da GUI-Änderungen werden erst übernommen, wenn dein Thread terminiert ist.
Deiner terminiert erst, wenn alles geladen wurde.

-> Erstelle für die Änderungen einen neuen Thread.

Sth like
Java:
		final GUI gui = new GUI();
        while ((n = is.read(tmp_buffer)) > 0) {
            os.write(tmp_buffer, 0, n);
            os.flush();
            x+=n;
            new Thread(){
            	public void run() {
            		gui.setLabel1(String.format("%d bytes gegalden", x));
            		gui.rePaint();
            	};
            }.start();
           System.out.println(String.format("%d bytes gegalden", x));
       }


natürlich nur, wenn deine GUI auch passend implementiert ist.

danke, habs gestern mal auf die schnelle so versucht aber ich bekam es mit den Threads nicht hin... außer für das Standard Test Beispiel habe ich Threads noch nie benutzt.

Mein Problem imo evtl. verstehe ich die Thread Sache auch falsch:

Ich erstelle den Thread tGui in meiner Main Klasse und starte den auch da. Beim Start wird das ausgeführt was in der Run Methode steht bis diese abgearbeitet ist, also bis ich die Gui beende ? Da die Gui als Thread gestartet wurde, werden anderer Threads nebenläufig abgearbeitet. soweit korrekt, oder?

In einem Action Listener der Gui erstelle und starte ich einen Thread tDownloader die in der Methode download Starte und erstelle ich einen neuen Thread wie im Bsp. von Antiheld. So sollte es sein oder?
Zu erst hab ich tDownloader nicht als Thread erstellt, so lief dann zwar alles aber mein Label wird erst aktualisiert wenn der download durch ist.

Wenn das was ich mir bei den Threads gedacht habe also wo und wann die erstellt werden müssen, hänge ich wohl nur noch an einer Kleinigkeit... Wertübergabe an Threads, in die Run Methode kann ich nichts übergeben, bzw. wenn ich die Methode überlade kann ich beim starten den threads mit .Start(); keine werte angeben. Also habe ich die Variablen global in der Klasse loader deklariert und dann im Konstruktur die Wertübergabe gemacht... nur zerflückt es mir irgend wo auf dem weg meine Werte.

Kann mir wer sagen ob das soweit wie geplant korrekt ist und ob ich beim übergeben von werten keine möglichkeit habe die direkt in die Runmethode zu übergeben?

thx
 

dzim

Top Contributor
Als erstes würde ich das Laden der Daten wie in den beiden oben von mir genannten Links machen.
Und wegen des Threadings, sollte dir unter Swing das hier so ungefähr helfen

Java:
private void loadData() {
    Thread dlThread = new Thread(new Runnable() {
        public void run() {
            // hier nun dein Prozess zum herunterladen der Daten
            // hier nur mein Beispiel:
            HttpClient httpclient = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(urltofetch);
            HttpResponse response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                long len = entity.getContentLength();
                InputStream inputStream = entity.getContent();
                // write the file to whether you want it.
                // oder lese - wie du es schon gemacht hast - nur die Anzahl der Bytes (aus dem Stream)
            }
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    // yourLabel.setText("Success! Yehaa!");
                }
            });
        }
    });
    dlThread.start();
}

Achtung: Der Code ist eher als Pseudocode zu verstehen - ich habe ihn nicht geprüft! Und er verwendet das Beispiel des zweiten Links, also Apache HttpClient.
 

nimda

Mitglied
danke soweit, ich hatte es mir wohl an anderer stelle geschossen ... beim übergeben der Werte zu kopliziert gedacht. Naja imo läuft es. @ dzim nicht falsch verstehen bin froh das du die links geposted hast aber weil es erst einmal nichts direkt mit meinem Problem zu tun hatte, file Übertragung funktionierte, hatte ich das ein wenig ignoriert. Werde ich mir aber noch anschauen!

Den Thread als Innereklasse zu deklarieren hat nicht funktioniert, weil ich da nur Final Variablen verwenden kann und mein "x" ja variable sein soll... wahrscheinlich hätte man das zwar auch hinbekommen aber ich wusste nicht wie :( aber mit dem Thread als nicht innereKlasse klappts.
 

dzim

Top Contributor
danke soweit, ich hatte es mir wohl an anderer stelle geschossen ... beim übergeben der Werte zu kopliziert gedacht. Naja imo läuft es. @ dzim nicht falsch verstehen bin froh das du die links geposted hast aber weil es erst einmal nichts direkt mit meinem Problem zu tun hatte, file Übertragung funktionierte, hatte ich das ein wenig ignoriert. Werde ich mir aber noch anschauen!

Den Thread als Innereklasse zu deklarieren hat nicht funktioniert, weil ich da nur Final Variablen verwenden kann und mein "x" ja variable sein soll... wahrscheinlich hätte man das zwar auch hinbekommen aber ich wusste nicht wie :( aber mit dem Thread als nicht innereKlasse klappts.

Ok, das hatte ich dann wohl nicht so verstanden. Aber noch ein abschliessender Hinweis: Ich habe keine Innere, sondern eine Anonyme Klasse verwendet - das ist ein grosser Unterschied. Warum, fragst du? Nun - einer inneren Klasse kannst du problemlos einen Konstruktor geben und damit absolut flexibel - wie jede andere Klasse auch - machen. Schau dir das bei Gelegenheit noch mal an!

Erst einmal aber viel Erfolg beim proggn. ;-)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
raeuchertofu Input bei zwei jTextfields AWT, Swing, JavaFX & SWT 5
Hatsi09 GUI Input Farbe ändern AWT, Swing, JavaFX & SWT 0
F JavaFX Checken ob der Input einem festgelegten Format gleicht AWT, Swing, JavaFX & SWT 7
J Event Handling Input auf String testen, Fehlermeldung ausgeben AWT, Swing, JavaFX & SWT 4
L Input aus Sub-Fenster Startfenster übergeben AWT, Swing, JavaFX & SWT 5
P JOptionPane input und show Message Dialog AWT, Swing, JavaFX & SWT 5
R SWT TreeViewer neuen Input setzen AWT, Swing, JavaFX & SWT 3
L Swing Input Focus eines JTextFields in einer JList AWT, Swing, JavaFX & SWT 2
T Input-Check bei Textfeldern in Table AWT, Swing, JavaFX & SWT 5
DEvent Je nach Auswahl in Liste entsprechende Input-Elemente anzeig AWT, Swing, JavaFX & SWT 2
M swt - input message box AWT, Swing, JavaFX & SWT 4
bernd Input Dialog AWT, Swing, JavaFX & SWT 2
B Output GUI funktioniert nur beim ersten Mal richtig. AWT, Swing, JavaFX & SWT 4
F Output Stream / File Dateien / Speichern AWT, Swing, JavaFX & SWT 13
S XML Output String Format AWT, Swing, JavaFX & SWT 2
L Graphics.drawImage() - Output-Größe entspricht nicht Parametern AWT, Swing, JavaFX & SWT 10
A JProgressBar updaten abhängig vom Output eines externen Skripts AWT, Swing, JavaFX & SWT 2
S Eingeschränkte Ausgabe auf 2. Bildschirm? (Laptop VGA Output AWT, Swing, JavaFX & SWT 4
R Output in TextArea AWT, Swing, JavaFX & SWT 10
S Stream API, Anonyme Klasse AWT, Swing, JavaFX & SWT 8
P JavaFX Mit Stream-API (1.8) in Textdatei schreiben AWT, Swing, JavaFX & SWT 3
M html aus einem Stream Laden und Anzeigen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben