Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Ayuda con la Barra de Progreso con la Copia de Archivos

Hola... yo tengo una clase que copia archivos y que copia capetas.... y quiero implementare una barra de progreso a ambos.... pero lo que quiero lograr es como hacer que la barra de progreso valla con la copia, es decir que si el tamaño te la carpeta es pesada la barra de progreso tiene tardar.... es decir tiene que ir acorde con la copia...

aca les muestro mi codigo que utilizao para la copia de archivos y carpetas...

//copiado de carpetas:
public void copyDirectory(File srcDir, File dstDir) throws IOException {
if (srcDir.isDirectory()) {
if (!dstDir.exists()) {
dstDir.mkdir();
}

String[] children = srcDir.list();
for (int i = 0; i < children.length; i++) {
copyDirectory(new File(srcDir, children[i]),
new File(dstDir, children[i]));
}
} else {
copy(srcDir, dstDir);
}
}


//copiado de archivos::

public void copy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);


byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}

agosto 23, 2013 | Unregistered CommenterSKZ

Utiliza SwingWorker: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

agosto 23, 2013 | Registered Commenterchoces

como puedo implementar eso del SwingWorker en mis metodos.... no tengo ni idea de como hacerlo...

agosto 23, 2013 | Unregistered CommenterSKZ

Para usar SwingWorker y actualizar un componente externo, como una JProgressBar, es necesario conocer el tipo de datos que se van a enviar a la barra de progreso.

Aquí tienes dos ejemplos de uso:

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/interim.html
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/interim.html

Básicamente, dentro del método doInBackground() se añade el código que se va a ejecutar en una tarea paralela al EDT de Swing; el proceso de copia, en tu caso.

Siguiendo el ejemplo del enlace, tendrás que añadir, dentro de doInBackground, una llamada a un método de Swingworker, publish(new FlipPair(heads, total)); que es quien envía los datos que quieras, al "exterior" de la tarea paralela.

Esos datos los recoge este método, también según el ejemplo:

protected void process(List<FlipPair> pairs) {
FlipPair pair = pairs.get(pairs.size() - 1);
headsText.setText(String.format("%d", pair.heads));
totalText.setText(String.format("%d", pair.total));
devText.setText(String.format("%.10g",
((double) pair.heads)/((double) pair.total) - 0.5));
}

que deberás crear dentro de la declaración de SwingWorker, que se ejecuta en el EDT, y donde puedes actualizar el JProgressBar, con los datos recibidos del publish anterior.

agosto 23, 2013 | Registered Commenterchoces

Te adjunto un esqueleto de código, que te pueda servir como guía:

SwingWorker<Void, Integer> worker = new SwingWorker<Void, Integer>() {
@Override
protected Void doInBackground() throws Exception {
int contador = 0;
publish(contador);
return null;
}

@Override
protected void process(List<Integer> datos) {
for (Integer contador : datos) {
// se actualiza el progress bar aquí
}
}

public void done() {
// se ejecuta en el EDT al finalizar doInBackground
}
};

worker.execute();

agosto 23, 2013 | Registered Commenterchoces

Gracias por sus respuesta.... ya pude implementarlo en mis clases...

ahora tengo una nueva pregunta... hay una forma de hacer acceso directo de un archivo mediante programación en java? si es así como podría implementarlo o si es necesario de otros archivos para lograrlo??

agosto 23, 2013 | Unregistered CommenterSKZ

Buenas,
No enseñas como ha quedado tu solución con el swingworker con el esqueleto que te ha propuesto choces? Como has implementado el algoritmo de calculo para hacer la actualización del estado?

Respecto a crear los accesos directos, eso es algo que no proporciona la API de java, ya que algo específico del entorno gráfico de MS Windows, y como sabes Java trata de ser portable entre sistemas.
En teoria deberias implementartelo en C++ y hacer uso de la API win32 para crear los accesos directos y luego invocar este componente por interfaz JNI. Tambien te puedes crear un script visual basic e invocarlo con Runtime.getRuntime.exec().
Sin embargo, la solucion es aún mas sencilla, ya que existe una libreria que implementa ya por ti la interfaz jni para crear los accesos: http://alumnus.caltech.edu/~jimmc/jshortcut/

Un saludo

agosto 23, 2013 | Unregistered CommenterUnoPorAhi

Utilice una estructura que enconter en internet:
http://chuwiki.chuidiang.org/index.php?title=Ejemplo_sencillo_con_SwingWorker

Solamente remplace mi metodo copy en metodo doInBackground()

Asi me quedo:

protected Double doInBackground() throws Exception {

for (int i = 0; i < 100; i++) {
try {

// copy(new File("C:/Users/Administrador/Downloads/codearmy.jpg"), new File("C:/Users/Administrador/Desktop/codearmy.jpg"));

} catch (Exception e) {
System.out.println("interrumpido");
}
publish(i + 1);
}
return 100.0;
}

retornando al de los acceos directo... como implemto JShortcut?? para la creacion de acceso directo

agosto 23, 2013 | Unregistered CommenterSKZ

¿Copias el mismo archivo 100 veces?.
¿Qué significa ese valor 100 que devuelves, y dónde lo usas?.
¿Y si quieres copiar más o menos archivos?.

Lo que deberías hacer es usar un contador, que se incremente por cada archivo que copias, y pasarle el valor al método progress.

Por esa razón puse un esqueleto, aparte de los enlaces a ejemplos de uso.
Copiar a ciegas un código cualquiera, no suele servir para otra cosa que para enredarse más.

agosto 23, 2013 | Registered Commenterchoces

Buenas,

Respecto a JShortcut, en el README tienes un ejemplo de uso. Como veras es muy sencillo de usar:
http://alumnus.caltech.edu/~jimmc/jshortcut/jshortcut/README.html

Un saludo

agosto 23, 2013 | Unregistered CommenterUnoPorAhi