Изменение курсора по умолчанию на занятый курсор не работает должным образом
После многих попыток сделатьJProgressBar
Работая как положено, я наконец-то добился успеха в достижении своей цели. Я использовал@MadProgrammer«sсовет и использовалSwingWorker
чтобы наконец заставить программу работать как я хочу.
Теперь я хочу, чтобы курсор изменился наBUSY_CURSOR http://telcontar.net/Misc/screeniecursors/Cursor%20hourglass%20white.png когда мойJProgressBar
идет от 0% до 100%. Я погуглил и узнал, что
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
код для этого Я пробовал, но это не работает, как ожидалось.
Соответствующий кусок кода:
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
И вотactionPerformed
метод:
public void actionPerformed(ActionEvent e)
{
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Task task=new Task();
task.addPropertyChangeListener(this);
task.execute();
dialog.setVisible(true);
}
propertyChange
метод:
public void propertyChange(PropertyChangeEvent evt) {
if("progress" == evt.getPropertyName()){
int progressnum = (Integer) evt.getNewValue();
progress.setValue(progressnum);
}
}
и вложенный классTask
:
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());
}
}
Когда я нажимаюbutton
, JDialog с JProgressBar появляется, и JProgressBar идет от 0% до 100%. В течение этого времени курсор должен быть изменен наBUSY_CURSOR http://telcontar.net/Misc/screeniecursors/Cursor%20hourglass%20white.png(занятый курсор) и когда JProgressBar достигает 100%, нормальный курсор (NORMAL_CURSOR http://fc05.deviantart.net/fs70/i/2011/008/1/4/mouse_cursor_windows_by_mikima-d36oslj.png) должен быть восстановлен.
Проблема в том, когда я нажимаюbutton
, курсор меняется на занятый курсор в течение доли секунды, а затем возвращается в исходный курсор. Я хочу, чтобы курсор был занят, пока JProgressBar не достигнет 100%.
Я добавил код для преобразования курсора в занятый курсор вactionPerformed
метод и восстановить нормальный курсор вdone
метод вложенного классаTask
, Обратите внимание, что я также включил необходимые пакеты.
Должен ли я использовать
setCursor(null);
или же
setCursor(Cursor.getDefaultCursor());
восстановить курсор?