2013-03-08 48 views
0

這是我的createButtonsForButtonsBar方法。createButton - SWT.PUSH與OK

protected void createButtonsForButtonBar(Composite parent) { 
    Button okButton = createButton(parent, SWT.PUSH, "Close Aplot", true); 
    okButton.setEnabled(true); 
    okButton.addSelectionListener(new SelectionAdapter() { 
    public void widgetSelected(SelectionEvent e) { 
     viewer = null; 
     getShell().setVisible(false); 
    } 
    }); 
} 

我不得不改變

Button okButton = createButton(parent, OK, "Close Aplot", true); 

Button okButton = createButton(parent, SWT.PUSH, "Close Aplot", true); 

由於OK版本,在這條線

getShell().setVisible(false); 

錯誤大致拋出一個運行空指針錯誤:

在com.test.BaseDialog $ 7.widgetSelected(BaseDialog.java:277

未處理的事件循環異常顯示java.lang.NullPointerException

問:

是什麼OKSWT.PUSH之間的區別?

爲什麼會OK導致上述錯誤?

回答

2

因爲OK是一個系統按鈕ID,指示某些行爲。特別是,按下OK按鈕將關閉對話框。同時,您添加了一個按鈕選擇偵聽器,試圖關閉對話框。可以理解的是,這會失敗。

但是,您在這裏完成的操作是創建一個不是系統默認按鈕並且沒有關聯的默認行爲的按鈕。但是你已經將SWT.PUSH - 一個風格常數 - 與一個按鈕ID混淆了。如果您想提供自己的按鈕ID,則需要使用大於IDialogConstants.CLIENT_ID的ID。

你可能想要在這裏做的只是讓系統關閉你的對話框,完全刪除你的選擇監聽器。如果在對話框關閉時出現了某種情況 - 比如說清理一些句柄 - 則應該簡單地覆蓋close()

+0

通過你的回答,我發現我的問題更多的是設計缺陷。你已經回答了這個問題。我可能需要打開另一個關於最佳實踐的問題來隱藏對話框。 – jkteater 2013-03-11 15:28:28

0

愛德華提到的是正確的。您應該在該方法中傳遞按鈕ID。但是,按鈕樣式在org.eclipse.jface.dialogs.Dialog.createButton(Composite, int, String, boolean)中已經是SWT.PUSH樣式。請仔細檢查。你也應該調用/覆蓋org.eclipse.jface.dialogs.Dialog.okPressed()句柄關閉操作的對話框。希望這也有幫助。