Cambiar el cursor predeterminado a cursor ocupado no funciona como se esperaba
Después de muchos intentos tratando de hacer unJProgressBar
Trabajé como se esperaba, finalmente tuve éxito en lograr mi objetivo. Había usado@MadProgrammer'sConsejo y usé unSwingWorker
para finalmente hacer que el programa funcione como yo quiero.
Ahora, quiero que el cursor cambie aBUSY_CURSOR http://telcontar.net/Misc/screeniecursors/Cursor%20hourglass%20white.png cuando miJProgressBar
va del 0% al 100%. Busqué en Google y descubrí que
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Es el código para hacerlo. Lo he intentado pero no funciona como se esperaba.
Pieza de código relevante:
JProgressBar progress;
JButton button;
JDialog dialog; //Fields of my GUI class
progress=new JProgressBar(JProgressBar.HORIZONTAL,0,100);
button=new JButton("Done");
dialog=new JDialog(); //Done from methods
progress.setValue(0);
progress.setStringPainted(true);
progress.setBorderPainted(true); //Also done from methods
button.addActionListener(this); //Also done from methods
dialog.setLayout(new FlowLayout(FlowLayout.CENTER));
dialog.setTitle("Please wait...");
dialog.setBounds(475,150,250,100);
dialog.setModal(true); //Also done from methods
dialog.add(new JLabel("Loading..."));
dialog.add(progress); //Also done from methods
Y aquí está elactionPerformed
método:
public void actionPerformed(ActionEvent e)
{
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Task task=new Task();
task.addPropertyChangeListener(this);
task.execute();
dialog.setVisible(true);
}
lospropertyChange
método:
public void propertyChange(PropertyChangeEvent evt) {
if("progress" == evt.getPropertyName()){
int progressnum = (Integer) evt.getNewValue();
progress.setValue(progressnum);
}
}
y la clase anidadaTask
:
class Task extends SwingWorker<Void, Void> {
/*
* Main task. Executed in background thread.
*/
@Override
public Void doInBackground() {
int progressnum = 0;
setProgress(0);
while (progressnum < 100) {
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
System.err.println("An error occured:"+ex);
ex.printStackTrace();
}
progressnum ++;
setProgress(Math.min(progressnum, 100));
}
return null;
}
/*
* Executed in event dispatching thread
*/
@Override
public void done() {
//setCursor(null); //turn off the wait cursor
setCursor(Cursor.getDefaultCursor()); //Is this one or the one above it right?
dialog.dispose();
progress.setValue(progress.getMinimum());
}
}
Cuando presionobutton
, aparece el JDialog con el JProgressBar y el JProgressBar va del 0% al 100%. Durante este tiempo, el cursor debe cambiarse aBUSY_CURSOR http://telcontar.net/Misc/screeniecursors/Cursor%20hourglass%20white.png(cursor ocupado) y cuando JProgressBar alcanza el 100%, el cursor normal (NORMAL_CURSOR http://fc05.deviantart.net/fs70/i/2011/008/1/4/mouse_cursor_windows_by_mikima-d36oslj.png) necesita ser restaurado.
El problema es que cuando presionobutton
, el cursor cambia al cursor ocupado durante una fracción de segundo y luego vuelve a cambiar al cursor original. Quiero que el cursor esté ocupado hasta que JProgressBar llegue al 100%.
He agregado el código para convertir el cursor en un cursor ocupado en elactionPerformed
método y la restauración del cursor normal en eldone
método de la clase anidadaTask
. Tenga en cuenta que también he incluido los paquetes necesarios.
Debería usar
setCursor(null);
o
setCursor(Cursor.getDefaultCursor());
para restaurar el cursor?