gpt4 book ai didi

java - SwingWorker,未调用 done() 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:14:09 24 4
gpt4 key购买 nike

这只是 SwingWorker 的一个实现:

class GuiWorker extends SwingWorker<Integer, Integer> {
private JFrame frame = new JFrame();
private JDialog dialog = new JDialog(frame, "Loadin data", true);
private JProgressBar progressBar = new JProgressBar();

private Statistics st = new Statistics();

public GuiWorker(GraphEditor editor, Statistics st) {
this.st = st;

Window mainWindow = SwingUtilities.windowForComponent(editor
.getGraphComponent().getParent());
dialog.setSize(400, 200);

int x = mainWindow.getX() + (mainWindow.getWidth() - dialog.getWidth())
/ 2;
int y = mainWindow.getY()
+ (mainWindow.getHeight() - dialog.getHeight()) / 2;
progressBar.setString("Have fun to wait some time...");
progressBar.setStringPainted(true);
progressBar.setIndeterminate(true);
dialog.add(progressBar);
dialog.setModal(true);
dialog.setLocation(x, y);
dialog.setVisible(true);
}

@Override
protected Integer doInBackground() throws Exception {
st.loadInitialData();
return 0;
}

@Override
protected void done() {
dialog.setVisible(false);
JLabel label = new JLabel("Task Complete");
dialog.getContentPane().remove(progressBar);
dialog.getContentPane().add(label);
dialog.getContentPane().validate();
dialog.setVisible(false);
}
}

diaglog 在我强行关闭它之前永远不会隐藏的问题(它必须在任务完成时隐藏)。我注意到 loadInitialData() 方法是一种从我的 DB 收集一些统计信息的方法,它需要几秒钟。

更新:我确信 done() 方法在我关闭 dialog 时被调用。

更新:我使用 GuiWorker 的地方在这里:

mainTabs.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
switch (mainTabs.getSelectedIndex()) {
case 0:
case 1:
case 2: // stats tab
GuiWorker gw = new GuiWorker(editor,st);
gw.execute();
break;
default:
break;
}
}
});

最佳答案

所有挥杆事件都在 Event Dispatch Thread 中运行.因此,您添加到 mainTabsChangeListener 在事件调度线程中运行。

在事件监听器中实例化 GuiWorker 并在该构造函数中调用 dialog.setVisible(true); 打开对话框。

您的 JDialog 实例是 modal 并且在模态对话框上调用 setVislbe(true) 将阻塞调用线程,在您的例子中是事件调度线程。因此,在对话框关闭之前,不会调用 gw.execute();。这就是为什么在关闭对话框之前不会调用 done 方法的原因。

为了让您的代码正常工作,您可以尝试不在构造函数中调用 setVisible(true),而是从 GuiWorker 中提供一个方法来设置对话框的可见性。然后在调用 gw.execute(); 之后调用 gw.setVisible(true)

要弄清楚,试试

class GuiWorker extends SwingWorker<Integer, Integer> {
private JFrame frame = new JFrame();
private JDialog dialog = new JDialog(frame, "Loadin data", true);
private JProgressBar progressBar = new JProgressBar();

private Statistics st = new Statistics();

public GuiWorker(GraphEditor editor, Statistics st) {
this.st = st;

Window mainWindow = SwingUtilities.windowForComponent(editor
.getGraphComponent().getParent());
dialog.setSize(400, 200);

int x = mainWindow.getX() + (mainWindow.getWidth() - dialog.getWidth())
/ 2;
int y = mainWindow.getY()
+ (mainWindow.getHeight() - dialog.getHeight()) / 2;
progressBar.setString("Have fun to wait some time...");
progressBar.setStringPainted(true);
progressBar.setIndeterminate(true);
dialog.add(progressBar);
dialog.setModal(true);
dialog.setLocation(x, y);
}

@Override
protected Integer doInBackground() throws Exception {
st.loadInitialData();
return 0;
}

@Override
protected void done() {
dialog.setVisible(false);
JLabel label = new JLabel("Task Complete");
dialog.getContentPane().remove(progressBar);
dialog.getContentPane().add(label);
dialog.getContentPane().validate();
dialog.setVisible(false);
}

public void setVisible(boolean visible) {
dialog.setVisible(visible);
}
}

mainTabs.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
switch (mainTabs.getSelectedIndex()) {
case 0:
case 1:
case 2: // stats tab
GuiWorker gw = new GuiWorker(editor,st);
gw.execute();
gw.setVisible(true);
break;
default:
break;
}
}
});

关于java - SwingWorker,未调用 done() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23195039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com