SwingWorker doInBackground() 不起作用
SwingWorker doInBackground() doesn't work
我在数据库上执行某些任务时试图显示进度条。然而,进度条冻结了,我想在数据库上做的事情没有执行。我知道,为了保证 Swing 中的正确并发性,我需要在辅助线程上执行数据库任务。我也明白我的错误与 JOptionPane 有某种关系。但我无法想出解决方案来修复它。这是我的进度对话框的代码:
public class ProgressDialog extends JDialog {
/**
*
*/
private static final long serialVersionUID = 1L;
public ProgressDialog() {
setModal(true);
setTitle("Fortschritt");
setSize(200, 100);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JProgressBar pb = new JProgressBar();
pb.setIndeterminate(true);
pb.setValue(0);
add(pb);
setVisible(true);
}
}
这是我调用此构造函数的代码:
int result = JOptionPane.showConfirmDialog(GUIAutoTest.jtable,
"Schaden mit Testkonfig = " + index + " anlegen ?", "Bestätigen",
JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
new SwingWorker<Void, Void>() {
final ProgressDialog pd = new ProgressDialog();
@Override
protected Void doInBackground() throws Exception {
InitTestLauf itl;
try {
itl = new InitTestLauf(index);
StartTestLauf stl = new StartTestLauf(itl.getIdTstLauf());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void done() {
System.out.println("done");
pd.setVisible(false);
}
}.execute();
JOptionPane.showMessageDialog(GUIAutoTest.jtable,
"Schaden angelegt. " + "Schadennummer: " + StartTestLauf.getSchadenNr(),
"Schaden angelegt", JOptionPane.PLAIN_MESSAGE);
没关系,在 doInBackground()-block 内部发生的事情,甚至 System.out.println("print something") 都不起作用。我的错误在哪里?
提前致谢!
我做了一个例子,使用带有对话框和 swingworker 的进度条。
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import java.util.List;
/**
* Created on 13.06.17.
*/
public class DialogJunker {
static class ProgressDialog extends JDialog {
JProgressBar bar;
ProgressDialog(){
setModal(true);
bar = new JProgressBar();
add(bar);
pack();
}
void setProgress(int i){
bar.setValue(i);
}
}
public static void main(String[] args){
JFrame frame = new JFrame("diddly dialog");
JButton button = new JButton("start");
button.addActionListener(evt->{
ProgressDialog log = new ProgressDialog();
new SwingWorker<Void, Integer>(){
@Override
public Void doInBackground(){
for(int i = 0; i<100; i++){
try{
Thread.sleep(10);
publish(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
public void done(){
log.setVisible(false);
log.dispose();
}
@Override
protected void process(List<Integer> ints){
log.setProgress(ints.get(0));
}
}.execute();
log.setVisible(true);
});
frame.add(button);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
此示例将显示一个带有更新进度条的对话框,完成后关闭该对话框。
在仔细检查了您的代码后,我确实发现了问题。您正在 SwingWorker
class 中构建 ProgressDialog
,但您将进度对话框设置为可见, 块 。请注意,我已经解决了很多问题。
- 我在启动 swing worker 后调用 set visible。
- 我发布了结果,以便对话框实际得到更新。
- 我保留了对进度条的引用,所以它实际上可以更新。
我在数据库上执行某些任务时试图显示进度条。然而,进度条冻结了,我想在数据库上做的事情没有执行。我知道,为了保证 Swing 中的正确并发性,我需要在辅助线程上执行数据库任务。我也明白我的错误与 JOptionPane 有某种关系。但我无法想出解决方案来修复它。这是我的进度对话框的代码:
public class ProgressDialog extends JDialog {
/**
*
*/
private static final long serialVersionUID = 1L;
public ProgressDialog() {
setModal(true);
setTitle("Fortschritt");
setSize(200, 100);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JProgressBar pb = new JProgressBar();
pb.setIndeterminate(true);
pb.setValue(0);
add(pb);
setVisible(true);
}
}
这是我调用此构造函数的代码:
int result = JOptionPane.showConfirmDialog(GUIAutoTest.jtable,
"Schaden mit Testkonfig = " + index + " anlegen ?", "Bestätigen",
JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
new SwingWorker<Void, Void>() {
final ProgressDialog pd = new ProgressDialog();
@Override
protected Void doInBackground() throws Exception {
InitTestLauf itl;
try {
itl = new InitTestLauf(index);
StartTestLauf stl = new StartTestLauf(itl.getIdTstLauf());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void done() {
System.out.println("done");
pd.setVisible(false);
}
}.execute();
JOptionPane.showMessageDialog(GUIAutoTest.jtable,
"Schaden angelegt. " + "Schadennummer: " + StartTestLauf.getSchadenNr(),
"Schaden angelegt", JOptionPane.PLAIN_MESSAGE);
没关系,在 doInBackground()-block 内部发生的事情,甚至 System.out.println("print something") 都不起作用。我的错误在哪里?
提前致谢!
我做了一个例子,使用带有对话框和 swingworker 的进度条。
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import java.util.List;
/**
* Created on 13.06.17.
*/
public class DialogJunker {
static class ProgressDialog extends JDialog {
JProgressBar bar;
ProgressDialog(){
setModal(true);
bar = new JProgressBar();
add(bar);
pack();
}
void setProgress(int i){
bar.setValue(i);
}
}
public static void main(String[] args){
JFrame frame = new JFrame("diddly dialog");
JButton button = new JButton("start");
button.addActionListener(evt->{
ProgressDialog log = new ProgressDialog();
new SwingWorker<Void, Integer>(){
@Override
public Void doInBackground(){
for(int i = 0; i<100; i++){
try{
Thread.sleep(10);
publish(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
public void done(){
log.setVisible(false);
log.dispose();
}
@Override
protected void process(List<Integer> ints){
log.setProgress(ints.get(0));
}
}.execute();
log.setVisible(true);
});
frame.add(button);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
此示例将显示一个带有更新进度条的对话框,完成后关闭该对话框。
在仔细检查了您的代码后,我确实发现了问题。您正在 SwingWorker
class 中构建 ProgressDialog
,但您将进度对话框设置为可见, 块 。请注意,我已经解决了很多问题。
- 我在启动 swing worker 后调用 set visible。
- 我发布了结果,以便对话框实际得到更新。
- 我保留了对进度条的引用,所以它实际上可以更新。