Avatar billede jesperbaldur Nybegynder
07. oktober 2003 - 15:39 Der er 13 kommentarer og
1 løsning

JProgressBar og filkopiering .

Jeg har i et tidligere spm spurgt om hvordan man kan lave en progressBar som indikerer hvor langt i forløbet en filkopiering er nået. Dette fik jeg da også svar på, og det hele fungerede( i Intellij 3), men da jeg skulle tilføje koden til mit project i JBuilder opstod der dog problemer: Efter at have startet filkopieringen ved et tryk på en knap startede kopieringen, men JPorgressbar'en blev ikke opdateret før filen er færdigkopieret. Hvad gør jeg forkert?
Link til tidligere spm: http://www.eksperten.dk/spm/409572

Her følger koden jeg har brugt:

import java.awt.*;
import java.io.*;

import javax.swing.*;

public class CopyProgress extends JFrame {
    private JProgressBar pbar;
    public CopyProgress() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        pbar = new JProgressBar();
        getContentPane().add(pbar, BorderLayout.CENTER);
        pack();
    }
    public void copy(String from, String to) {
        pbar.setMaximum((int)(new File(from)).length());
        pbar.setValue(0);
        pbar.setStringPainted(true);
        try {
            InputStream is = new FileInputStream(from);
            OutputStream os = new FileOutputStream(to);
            int total = 0;
            byte[] b = new byte[1000];
            int n;
            while((n = is.read(b)) >= 0) {
                os.write(b, 0, n);
                total += n;       
                pbar.setValue(total);
            }
            is.close();
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        CopyProgress cp = new CopyProgress();
        cp.show();
        cp.copy("C:\\z.1", "C:\\z.2");
    }
}
Avatar billede riversen Nybegynder
07. oktober 2003 - 15:46 #1
du skal køre det i hver sin tråd
Avatar billede arne_v Ekspert
07. oktober 2003 - 15:48 #2
Hm.

Det virker fint for mig i JB9 med java version 1.4.1_02-b06.

Men er det ikke ret ligegyldigt hvordan det virker i IDE - hvordan
virker det standalone ?
Avatar billede jesperbaldur Nybegynder
07. oktober 2003 - 16:23 #3
Den kode jeg har kopieret virker fint. Men når jeg eksekverer den fra en knap så virker den ikke.
Avatar billede jesperbaldur Nybegynder
07. oktober 2003 - 16:23 #4
hverken i intellij eller Jbuilder
Avatar billede arne_v Ekspert
07. oktober 2003 - 16:26 #5
Så har riversen ret !

Knapper bliver kørt i Swings egen tråd og den skal man ikke
sætte til at lave noget langvarigt.

Start en tråd.
Avatar billede jesperbaldur Nybegynder
07. oktober 2003 - 16:28 #6
ok. hvordan gør man det?
Avatar billede arne_v Ekspert
07. oktober 2003 - 16:33 #7
Her er lidt kode der bruger en tråd (som dog ike bliver startet fra en knap):

package test;

import java.awt.*;
import java.io.*;

import javax.swing.*;

public class CopyProgress extends JFrame {
    public JProgressBar pbar;
    public CopyProgress() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        pbar = new JProgressBar();
        getContentPane().add(pbar, BorderLayout.CENTER);
        pack();
    }
    public static void main(String[] args) {
        CopyProgress cp = new CopyProgress();
        cp.show();
        CopyThread cpthread = new CopyThread("C:\\z.1", "C:\\z.2", cp.pbar);
        cpthread.start();
    }
}

class CopyThread extends Thread {
    private String from;
    private String to;
    private JProgressBar  pbar;
    public CopyThread(String from, String to, JProgressBar pbar) {
        this.from = from;
        this.to = to;
        this.pbar = pbar;
    }
    public void run() {
        pbar.setMaximum((int)(new File(from)).length());
        pbar.setValue(0);
        pbar.setStringPainted(true);
        try {
            InputStream is = new FileInputStream(from);
            OutputStream os = new FileOutputStream(to);
            int total = 0;
            byte[] b = new byte[1000];
            int n;
            while((n = is.read(b)) >= 0) {
                os.write(b, 0, n);
                total += n;
                pbar.setValue(total);
            }
            is.close();
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede jesperbaldur Nybegynder
07. oktober 2003 - 16:52 #8
det virker. skal dog lige have lidt tid til at forstå koden inden jeg accepterer :-)
Avatar billede arne_v Ekspert
07. oktober 2003 - 16:55 #9
Det er faktisk præcis samme kode som før.

Den køres bare i sin egen tråd.
Avatar billede jesperbaldur Nybegynder
07. oktober 2003 - 17:09 #10
Ja det kan jeg godt se. Men hvad er det der styrer at den bliver kørt i en ny tråd? Er det at man extender "Thread"?  Og hvad kalder "public void run" metoden?
Avatar billede arne_v Ekspert
07. oktober 2003 - 17:13 #11
Der er flere måder at starte en tråd på i Java.

Min foretrukne er:

lav en klasse som extender Thread og har en public void run og
en constructor som gemmer alle nødvendige data

construct en instans og kald start metoden

[start kaldet starter en tråd og kører run i den]
Avatar billede jesperbaldur Nybegynder
07. oktober 2003 - 17:14 #12
ok. Mange tak for hjælpen.
Avatar billede jesperbaldur Nybegynder
07. oktober 2003 - 17:55 #13
skriv lige et svar :-)
Avatar billede arne_v Ekspert
07. oktober 2003 - 18:01 #14
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester