我有一個JNI函數,可能需要一段時間才能完成,並且我想要一個JProgress欄處於不確定模式,並在完成該函數時運行。我已閱讀了Oracle提供的教程,但其教程的性質似乎並沒有幫助我理解如何去做。我意識到我應該在後臺線程中運行這個函數,但我不太確定如何去做。JProgress Bar不確定模式不更新
這是相關的代碼。我有一個按鈕(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;
}
任何幫助,將不勝感激。
編輯:編輯嘗試做什麼kiheru建議,但仍然無法正常工作。
你在doInBackround()中運行它的假設是正確的。 SwindWorkers只需要一個'execute()'調用就可以開始運行,所以如果你事先準備好工作者,你可以在按鈕操作中調用它。或者,您可以創建SwingWorker並執行該操作。 – kiheru
你能否詳細說明你的意思是「提前準備工人」? –