У меня есть функция JNI, выполнение которой может занять некоторое время, и я хочу, чтобы панель JProgress работала в неопределенном режиме, пока она завершает выполнение функции. Я прочитал учебные пособия, предоставленные Oracle, но характер их учебных пособий, похоже, не помогает мне понять, как это сделать. Я понимаю, что мне следует запускать эту функцию в фоновом потоке, но я не совсем уверен, как это сделать.
Вот соответствующий код. У меня есть кнопка (runButton), которая при нажатии вызывает функцию mainCpp():
public class Foo extends javax.swing.JFrame
implements ActionListener,
PropertyChangeListener{
@Override
public void actionPerformed(ActionEvent ae){
//Don't know what goes here, I don't think it is necessary though because I do not intend to use a determinate progress bar
}
@Override
public void propertyChange(PropertyChangeEvent pce){
//I don't intend on using an determinate progress bar, so I also do not think this is necassary
}
class Task extends SwingWorker<Void, Void>{
@Override
public Void doInBackground{
Foo t = new Foo();
t.mainCpp();
System.out.println("Done...");
}
return null;
}
/*JNI Function Declaration*/
public native int mainCpp(); //The original function takes arguments, but I have ommitted them for simplicity. If they are part of the problem, I can put them back in.
...//some codes about GUI
private void runButtonActionPerformed(java.awt.event.ActionEvent evt) {
ProgressBar.setIndeterminate(true);
Task task = new Task();
task.execute();
ProgressBar.setIndeterminate(false);
}
/*Declarations*/
private javax.swing.JButton runButton;
}
Любая помощь будет оценена по достоинству.
EDIT: отредактировано в попытке сделать то, что предложил kiheru, но все еще не работает.
execute()
, чтобы начать работу, поэтому, если вы заранее подготовите работника, вы можете просто вызвать его в действии кнопки. В качестве альтернативы вы можете создать SwingWorker на месте и выполнить его. - person kiheru   schedule 06.08.2013