Refrescar un jframe
Hola buenas tardes compañeros les comento:
Es un problema que ya llevo dos días y la verdad no puedo resolver espero me puedan ayudar.
Estoy realizando una aplicación que lee un archivo de texto bastante grande pero quiero agregar un JProgressBar para mostrarle al usuario cuanto tiempo tarda en procesar el archivo pero no logro mostrarlo de la manera correcta.
Mando a llamar desde el botón de la ventana principal a la clase donde tengo programado JProgressBar
private void btn_SalActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
this.setVisible(false);
BarraDeProceso frame = new BarraDeProceso();
frame.ini();
}
para que se ejecute un proceso donde mando a llamar jframe que muestra la barra de proceso pero no puedo mostrarlo de la manera correcta por que cuando lo mando a llamar si se muestra pero mal masta que termina el proceso while se muestra de la manera correcta no se porque este es el codigo de BarraDeProceso();
JProgressBar current;
public BarraDeProceso() {
super("Progress");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel pane = new JPanel();
pane.setLayout(new FlowLayout());
current = new JProgressBar(0, 100);
current.setValue(0);
current.setStringPainted(true);
pane.add(current);
setContentPane(pane);
}
public void iterate() {
int num = 0;
while (num <= 100) {
current.setValue(num);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
num += 50;
}
}
public void ini() {
BarraDeProceso frame = new BarraDeProceso();
frame.pack();
frame.setVisible(true);
frame.setBounds(0, 0, 400, 400);
frame.setLocationRelativeTo(null);
frame.iterate();
}
// public static void main(String[] arguments) {
// BarraDeProceso frame = new BarraDeProceso();
// frame.ini();
// }
//
}
y lo mas raro es que lo ejecuto desde public static void main(String[] arguments) y se ejecuta de manera correcta no se que pase.
adjunto unas imagenes haber de que pueden ayudar
.NOTA : lo que comento es que cuando esta en proceso while me muestra la imagen "error" cuando termina el proceso while me muestra la imagen "correcto" no se a que se deva pero lo ejecuto desde un main y se ejecuta de manera correcta el problema solo lo tengo desde el boton "btn"de la pantalla principal.
.
Adjunto | Tamaño |
---|---|
btn.png | 1.28 KB |
correcto.png | 5.39 KB |
error.png | 5.05 KB |
- Inicie sesión o regístrese para enviar comentarios
swingworker
Nunca bloquees el thread de eventos de swing. Tienes que hacer el trabajo en un thread aparte y sincronizar periódicamente con el thread de eventos de swing para actualizar la barra de progreso.
Revisa la clase SwingWorker, ahí vienen ejemplos de tareas largas que actualizan una barra de progreso periódicamente.
seguimiento de swingworker
Buenas tardes ezamudio te comento:
Ya revise la clase que me comentas swingworker ya la implemente pero sigo sin poder ejecutar como ami me gustaría el problema es el siguiente.
crea esta clase con la con la ayuda de swingworker
private JProgressBar progressBar;
private Task task;
int numero;
JFrame frame = new JFrame();
public ProgressBarDemo(int nu) {
super(new BorderLayout());
numero = nu;
progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
JPanel panel = new JPanel();
panel.add(progressBar);
add(panel, BorderLayout.PAGE_START);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
task = new Task();
task.addPropertyChangeListener(this);
task.execute();
}
class Task extends SwingWorker<Void, Void> {
/*
* Main task. Executed in background thread.
*/
@Override
public Void doInBackground() {
Random random = new Random();
int progress = 0;
setProgress(0);
while (progress < 100) {
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException ignore) {
}
progress += random.nextInt(numero);
setProgress(Math.min(progress, 100));
}
// frame.dispose();
return null;
}
@Override
public void done() {
Toolkit.getDefaultToolkit().beep();
setCursor(null); // turn off the wait cursor
}
}
/**
* Invoked when task's progress property changes.
*/
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
progressBar.setValue(progress);
}
}
/**
* Create the GUI and show it. As with all GUI code, this must run on the
* event-dispatching thread.
*/
public void createAndShowGUI() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new ProgressBarDemo(numero);
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
// frame.setLocationRelativeTo(null);
}
}
con esta clase logro ejecutar la barra de proceso desde un botón que en principio ese era mi problema ahora ya se ejecuta correctamente pero el problema viene cuando hago promero un primer un proceso y despues la llamo hace exactamente lo mismo que hacia cuando no me lo ejecutaba desde el boton AHORA LO QUE HACE ES QUE PRIMERO HACE EL PROCESO Y DESPUES SE EJECUTA AL ULTIMO NO SE QUE PASA DE VERDAD
Desde este boton la mando a llamar pero como te comento antes realizo un proceso que entra a un ciclo for y después lo ejecuta
Ventana ver = new Ventana();
Reportes ver2 = new Reportes();
Workbook workbook = null;
String nombre, nombre2, antesDeMedio, nombreMedio, nombre3, nombre4, nombre5;
Sheet sheet;
FileWriter nuevaescritura;
String n = null;
ProgressBar ver33 = new ProgressBar(20);//AQUÍ FUNCIONA
ver33.createAndShowGUI(); // AQUÍ FUNCIONA
//se maneja la excepcion de si encuantra el archivo o no
try {
workbook = Workbook.getWorkbook(new File(drc)); //Pasamos el excel que vamos a leer
sheet = workbook.getSheet(0); //Seleccionamos la hoja que vamos a leer
System.out.println("ver " + sheet.getRows());
// float calculo = sheet.getRows()/ 25;
// float calculo2 = 100 / calculo;
// int total = (int) Math.ceil(calculo2);
// ProgressBar ver33 = new ProgressBa(20); //AQUÍ YA NO FUNCIONA ENTRA AL CICLO Y DESPUÉS LO EJECUTA
// ver33.createAndShowGUI(); //AQUÍ YA NO FUNCIONA ENTRA AL CICLO Y DESPUÉS LO EJECUTA
for (int fila = 4; fila < sheet.getRows() - 2; fila++) { //recorremos las filas
//leemos las columnas solo las que necesitamos
nombre = sheet.getCell(0, fila).getContents() + "|";
nombre2 = sheet.getCell(1, fila).getContents() + "|";
antesDeMedio = sheet.getCell(2, fila).getContents() + "|";
nombreMedio = sheet.getCell(3, fila).getContents() + "|";
nombre3 = sheet.getCell(5, fila).getContents() + "|";
nombre4 = sheet.getCell(10, fila).getContents() + "|";
nombre5 = sheet.getCell(12, fila).getContents() + "|";
// System.out.print(nombre); // imprimir nombre
contador++;
n = nombre + nombre2 + antesDeMedio + nombreMedio + nombre3 + nombre4 + nombre5 + "\r\n";
System.out.println("————————————- " + contador);
//trabajamos con la excepcion de si no se puede escribir el archivo de txt
nuevaescritura = new FileWriter("C:\\12.txt", true);
for (int e = 0; e < n.length(); e++) {
nuevaescritura.write(n.charAt(e));
}
// se cierra el archivo
nuevaescritura.close();
}
} catch (IOException ex) {
Logger.getLogger(RepTim.class.getName()).log(Level.SEVERE, null, ex);
JOptionPane.showMessageDialog(null, "No se puede escribir temp" + ex.getMessage());
} catch (BiffException ex) {
Logger.getLogger(Ventana.class.getName()).log(Level.SEVERE, null, ex);
JOptionPane.showMessageDialog(null, "El archivo no se encuentra " + ex.getMessage());
}
Cual es la intención para que funcione de manera perfecta o como me gustaría que funcionara la JProgressBar o no se se lo puedo utilizar de otra manera pero al menos ami creo que así me funcionaria bien.
workbook = Workbook.getWorkbook(new File(drc)); //Pasamos el excel que vamos a leer
sheet = workbook.getSheet(0); //Seleccionamos la hoja que vamos a leer
System.out.println("ver " + sheet.getRows());//cuanto las filas que tiene el excel y calculo
// float calculo = sheet.getRows()/ 25; //25 porque pon las lineas que escribe por segundo mas o menos
// float calculo2 = 100 / calculo;//calculo
// int total = (int) Math.ceil(calculo2);// y ese calculo se lo paso para que el progress vaya creciendo hasta llegar a 100
// ProgressBar ver33 = new ProgressBa(20); //AQUÍ YA NO FUNCIONA ENTRA AL CICLO Y DESPUÉS LO EJECUTA
// ver33.createAndShowGUI();
ese es mi problema espero me puedas ayudar y la verdad ya llevo algo de tiempo invertido y estoy desesperado.
gracias
Respuesta
Hola compañeros que tal buenas tardes les comento:
Ya e resuelto mi problema la solución era correr dos hilos a la vez y sincronizarlos la verdad no conocía nada de hilos todas las aplicaciones que había resuelto eran monotarea pero e aprendido como funcionan las aplicaciones Multitarea
esto me sirvió
http://panamahitek.com/multiprocesos-en-java-como-usar-hilosthreads/
http://static1.1.sqspcdn.com/static/f/923743/14996314/1320602051103/Mult...
Solo necesitas un hilo
Solo se necesita un hilo(podria ser el
SwingWorker
); el cual ira refrescando los componentes(en este caso la barra de progreso).Y el hilo del proceso principal estara ejecutando la tarea principal.