最近在開發一款Eclipse中的驗證插件,對於我這個新手來說,在遇到問題的時候只能通過搜索資料來彌補知識不足帶來的問題。在學習實踐中發現國內對於插件知識的講解真的很少,並且還很雜亂。因此這邊分享一下我在開發中遇到的問題及解決方法,通過總結希望可以幫助到有需要的夥伴們。後續有時間我也會整理一些插件講解進行分享。PS:以下內容純粹是個人想法,若有不足的地方希望同道中人一起討論學習進步。
好了下面講重點:
(1)如何添加視圖?
視圖在eclipse中對應的擴展點爲org.eclipse.ui.views,我們可以通過如圖界面進行擴展點的添加
其中關聯的class(TableResultView)是一個繼承與ViewPart的類,在該類中的createPartControl方法中可以自定義顯示的佈局,這邊代碼粘貼可以參考一下:
public class TableResultView extends ViewPart {
TableItem item;
@Override
public void createPartControl(Composite arg0) {
// TODO Auto-generated method stub
Composite composite = new Composite(arg0,SWT.NONE);
composite.setLayout(new FillLayout(SWT.HORIZONTAL));
CheckboxTableViewer checkboxTableViewer = CheckboxTableViewer.newCheckList(composite, SWT.BORDER | SWT.FULL_SELECTION);
Table table = checkboxTableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
// 創建表頭的字符串數組
String[] tableHeader = {"編號", "類名", "方法名", "驗證結果","錯誤信息","備註"};
for (int i = 0; i < tableHeader.length; i++)
{
TableColumn tableColumn = new TableColumn(table, SWT.NONE);
tableColumn.setText(tableHeader[i]);
// 設置表頭可移動,默認爲false
tableColumn.setMoveable(true);
}
//添加一行數據
item = new TableItem(table, SWT.NONE);
item.setText(new String[]{"0", " ww" , " tt" , " ok" , "yy " , " 60"});
// 重新佈局表格
for (int i = 0; i < tableHeader.length; i++)
{
table.getColumn(i).pack();
}
}
@Override
public void setFocus() {
// TODO Auto-generated method stub
}
//更新視圖數據
public void updateData(String[] data) {
this.item.setText(data);
}
}
這樣我們就通過擴展點成功的給eclipse新增了一個視圖,我們可以在window--》show view--》other--》other下找到我們添加的視圖,如圖所示:
最後點擊展示出來的界面,類似於圖片格式:
(2)如何在另外一個java中主動打開視圖
這邊需要用到我們定義好的id,來指定對應的視圖
//打開視圖.
try {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("com.ylz.plugin.test.main.TableResultView");
} catch (PartInitException e) {
e.printStackTrace();
}
(3)如何在另一個java文件中傳遞數據給視圖文件TableResultView,並刷新界面數據
這邊原先我想着只要在TableResultView定義一個updateData方法,然後在要傳值的java文件中實例化TableResultView,然後調用updateData的形式來處理數據傳遞及刷新。發現數據是成功傳入,但是 this.item.setText(data); 中的item對象一直是空指針異常,這個問題自己納悶了很久,完全沒啥頭緒。後來突發奇想,想着可能TableResultView也像是安卓開發中的控件一樣,需要通過指針來實例化,試驗了一下竟然成功了,開心。具體實現代碼如下:
//獲取視圖.此處傳入的是視圖ID.並不是包路徑
IViewPart part =(IViewPart)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView("com.ylz.plugin.test.main.TableResultView");
TableResultView view = (TableResultView)part;
view.updateData(data);