我有一个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;
}
任何帮助将不胜感激。
编辑:编辑试图做kiheru建议,但仍然无法正常工作。
答案 0 :(得分:0)
假设你有一个像这样的SwingWorker:
class Task extends SwingWorker<Void, Void>{
@Override
public Void doInBackground() {
// I'm not sure of the code snippets if you are already in a
// Foo instance; if this is internal to Foo then you obviously do
// not need to create another instance, but just call mainCpp().
Foo t = new Foo();
t.mainCpp();
return null;
}
@Override
public void done()
// Stop progress bar, etc
...
}
}
您可以将实例保存在包含对象的字段中,然后使用它将如下所示:
private void runButtonActionPerformed(java.awt.event.ActionEvent evt) {
// Start progress bar, disable the button, etc.
...
// Task task has been created earlier, maybe in the constructor
task.execute();
}
,或者您可以创建一个工作人员:
private void runButtonActionPerformed(java.awt.event.ActionEvent evt) {
// Start progress bar, disable the button, etc.
...
new Task().execute();
}