SWTException:尝试从向导页面中的面板内调用updateButtons()时发生无效的线程访问

时间:2011-11-10 10:28:15

标签: java multithreading

我需要启用/停用Finish上的WizardDialog按钮,具体取决于位于WizardPage内的面板中的某些字段。

以下是打开向导对话框的代码:

UserWizardDialog dialog = new UserWizardDialog(window.getShell(), new UserWizard(window.getShell()));
dialog.open();

在此UserWizard中,有WizardPage名为CustomerWizardPageCustomerPanel。在此面板中,我有一个客户PIN字段,根据其值,我必须启用/禁用Finish上的UserWizardDialog按钮。

在面板中该字段的ItemListener事件中,我添加以下代码:

parent.getWizard().getContainer().updateButtons();

但它给出了例外:

org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3884)
at org.eclipse.swt.SWT.error(SWT.java:3799)
at org.eclipse.swt.SWT.error(SWT.java:3770)
at org.eclipse.swt.widgets.Widget.error(Widget.java:463)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355)
at org.eclipse.swt.widgets.Control.setEnabled(Control.java:2923)
at org.eclipse.jface.wizard.WizardDialog.updateButtons(WizardDialog.java:1257)
at com.noi.rac.dhl.eco.util.components.CustomerPanel$4.itemStateChanged(CustomerPanel.java:304)

1 个答案:

答案 0 :(得分:1)

在非UI线程中修改UI组件时会发生“无效的线程访问”。

要避免此异常,您应该修改UI线程中的UI组件。在您的源代码中,我认为您应该在UI线程中更新您的按钮。

例如:

Display.getDefault().asyncExec(new Runnable() {
    @Override
    public void run() {
        parent.getWizard().getContainer().updateButtons();
    }
});

您可以根据需要使用syncExec()或asyncExec()。

希望这会对你有所帮助。