[英]How can i solve the “Widget is disposed” Problem?
在我看來,我在循環中創建按鈕,並為每個按鈕分配一個圖像,我在視圖的構造函數中初始化兩個圖像。
這里是按鈕的代碼:
for (int i = 0; i < 5; i++) {
final OButton button = new OButton(compositeT1, SWT.PUSH);
button.setText("T1" + i);
button.setData("1"+i);
GridData gd = new GridData(50,30);
button.setButtonRenderer(RedButtonRenderer.getInstance());
button.setLayoutData(gd);
if(!tournees.contains(button.getData().toString())){
button.setToolTipText("Livraison");
button.setImage(imgCamion);
}else{
button.setToolTipText("Appel");
button.setImage(imgCasque);
}
button.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
int tourneeInt = Integer.parseInt(button.getData().toString());
if (button.getImage().equals(imgCasque)) {
openAppelEditor(button.getData().toString());
}else if(tourneeInt == 12 || tourneeInt == 13 || tourneeInt == 14){
openLivraisonEditor(String.valueOf(tourneeInt - 2),button.getData().toString());
}else if(tourneeInt == 10) {
openLivraisonEditor("43",button.getData().toString());
}else if (tourneeInt == 11 ){
openLivraisonEditor("44",button.getData().toString());
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
});
我還添加了 function dispose():
@Override
public void dispose() {
super.dispose();
this.imgCamion.dispose();
this.imgCasque.dispose();
}
問題是當我關閉視圖並重新打開它時,我收到錯誤:“小部件已處置”:
這是錯誤行:
.MESSAGE 無法創建視圖 ID....:/SelectionTourneePortefeuilleView: Widget 已釋放
!堆棧 0
org.eclipse.swt.SWTException: Widget is disposed
at org.eclipse.swt.SWT.error(SWT.java:4361)
at org.eclipse.swt.SWT.error(SWT.java:4276)
at org.eclipse.swt.SWT.error(SWT.java:4247)
at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:340)
at org.mihalis.opal.obutton.OButton.getImage(Unknown Source)
at org.mihalis.opal.obutton.AbstractButtonRenderer.createDisabledImage(Unknown Source)
at org.mihalis.opal.obutton.OButton.setImage(Unknown Source)
at com.croquegel.crm.vente.gestionportefeuille.view.SelectionTourneePortefeuilleView.createButtons(SelectionTourneePortefeuilleView.java:582)
at com.croquegel.crm.vente.gestionportefeuille.view.SelectionTourneePortefeuilleView.createPartControl(SelectionTourneePortefeuilleView.java:347)
at org.eclipse.ui.internal.ViewReference.createPartHelper(ViewReference.java:386)
at org.eclipse.ui.internal.ViewReference.createPart(ViewReference.java:240)
at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595)
at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:315)
at org.eclipse.ui.internal.ViewPane.setVisible(ViewPane.java:534)
at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:180)
at org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:270)
at org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:65)
at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:473)
at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1245)
at org.eclipse.ui.internal.PartStack.setSelection(PartStack.java:1198)
at org.eclipse.ui.internal.PartStack.showPart(PartStack.java:1597)
at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:643)
at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:570)
at org.eclipse.ui.internal.PartSashContainer.createControl(PartSashContainer.java:568)
at org.eclipse.ui.internal.PerspectiveHelper.activate(PerspectiveHelper.java:272)
at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:981)
at org.eclipse.ui.internal.WorkbenchPage.setPerspective(WorkbenchPage.java:3726)
at org.eclipse.ui.internal.WorkbenchPage.busySetPerspective(WorkbenchPage.java:1124)
at org.eclipse.ui.internal.WorkbenchPage.access$16(WorkbenchPage.java:1108)
at org.eclipse.ui.internal.WorkbenchPage$19.run(WorkbenchPage.java:3827)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.ui.internal.WorkbenchPage.setPerspective(WorkbenchPage.java:3825)
at org.eclipse.ui.internal.Workbench.showPerspective(Workbench.java:2875)
我怎么知道處理了哪個小部件?
我在重新打開視圖后調試,處理圖像的屬性是錯誤的。
由於我正在處理 RCP 應用程序,因此我在相應的透視圖中添加了視圖。
解決方案是將圖像分配給線程中的按鈕。
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
//yourCode
});
為我工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.