我需要启用/停用Finish
上的WizardDialog
按钮,具体取决于位于WizardPage
内的面板中的某些字段。
以下是打开向导对话框的代码:
UserWizardDialog dialog = new UserWizardDialog(window.getShell(), new UserWizard(window.getShell()));
dialog.open();
在此UserWizard
中,有WizardPage
名为CustomerWizardPage
且CustomerPanel
。在此面板中,我有一个客户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)
答案 0 :(得分:1)
在非UI线程中修改UI组件时会发生“无效的线程访问”。
要避免此异常,您应该修改UI线程中的UI组件。在您的源代码中,我认为您应该在UI线程中更新您的按钮。
例如:
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
parent.getWizard().getContainer().updateButtons();
}
});
您可以根据需要使用syncExec()或asyncExec()。
希望这会对你有所帮助。