国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

關(guān)于Eclipse插件開(kāi)發(fā)之定制向?qū)?圖)

2019-11-18 13:02:07
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  Invokatron的歷史
  
  首先,我們具體說(shuō)明一下Invokatron本身。在前面的文章中我們討論過(guò),Invokatron是一個(gè)生成java代碼的的圖形工具。你可以簡(jiǎn)單地通過(guò)拖放操作建立類的方法。拖入的方法被編輯的方法(也就是插件)"調(diào)用"。我們將讓數(shù)據(jù)來(lái)驅(qū)動(dòng)應(yīng)用程序的設(shè)計(jì)。在后面一篇文章中,我們將開(kāi)發(fā)這個(gè)GUI。現(xiàn)在我們需要做的是,找到插件將輸入和存儲(chǔ)的重要數(shù)據(jù)。它通常被稱為應(yīng)用程序的模型(model)。在設(shè)計(jì)這個(gè)系統(tǒng)的時(shí)候,我們需要考慮下面一些內(nèi)容:
  
  · 哪些細(xì)節(jié)數(shù)據(jù)需要保存?
  
  · 這些數(shù)據(jù)在內(nèi)存中用什么來(lái)表現(xiàn)?POJO、JavaBean還是EJB?
  
  · 這些數(shù)據(jù)的存儲(chǔ)格式是怎樣的?數(shù)據(jù)庫(kù)表、xml文件、屬性文件還是串行二進(jìn)制文件?
  
  · 輸入數(shù)據(jù)的方式有哪幾種?用"新建文件"向?qū)н€是在文檔屬性頁(yè)面上使用彈出對(duì)話框、用編輯器繪制、在文本編輯器中輸入的其它向?qū)В?br />  
  在我們繼續(xù)工作之前必須回答這些問(wèn)題。不可能有適合所有項(xiàng)目的答案;它完全依靠于你的需求。在我們的例子中,我做出了一些隨意的、可能有問(wèn)題的決定,如下所示:
  
  · 一個(gè)Java類,它包含類名、程序包、超類(superclass)和實(shí)現(xiàn)接口。我們以它為基礎(chǔ),在后面的文章中添加更多數(shù)據(jù)。
  
  · 我將把數(shù)據(jù)表現(xiàn)為擴(kuò)展  
  · 我將使用的格式是屬性文件,很輕易使用Properties類來(lái)分析它。
  
  · 在"新建文件"向?qū)е校覍⑾葘ふ覕?shù)據(jù),接著讓用戶改變屬性窗口或文本編輯器中的數(shù)據(jù)。這個(gè)步驟將在下一篇文章中完成。
  
  Document(文檔)類
  
  下一步是編寫(xiě)文檔類。建立一個(gè)新程序包(invokatron.model)和一個(gè)新類(InvokatronDocument)。下面是我們的文檔類的開(kāi)頭:
  
  public class InvokatronDocument
  extends Properties
  {
  public static final String PACKAGE = "package";
  public static final String SUPERCLASS = "superclass";
  public static final String INTERFACES = "interfaces";
  }
  
  使用Properties類可以更簡(jiǎn)單地分析和保存我們的數(shù)據(jù)。Getter和 setter不是必須的,但是假如你想要,也可以加上它們。這個(gè)類還沒(méi)有完成;我們將添加一個(gè)接口,在后面的部分中Ecl
ipse需要使用它。
  
  有了這個(gè)類之后,我們要獲取一個(gè)屬性就非常簡(jiǎn)單了:
  
  String package =document.getProperty(InvokatronDocument.PACKAGE);
  
  定制向?qū)?/b>
  
  請(qǐng)看一看前面的文章中所出現(xiàn)的向?qū)АD銘?yīng)該記得,我們可以通過(guò)點(diǎn)擊(我們自己添加的)工具條按鈕或者菜單項(xiàng)來(lái)訪問(wèn)它。圖1是它的界面:
  
 關(guān)于Eclipse插件開(kāi)發(fā)之定制向?qū)?圖)(圖一)
  圖1:舊的向?qū)?/center>
  
  它只有一個(gè)頁(yè)面,右上角沒(méi)有圖片。我們想輸入更多的信息,并提供一個(gè)很好的圖片。換句話說(shuō),我們希望定制這個(gè)向?qū)А?br />  
  我們來(lái)分析一下這個(gè)向?qū)АU?qǐng)打開(kāi)InvokatronWizard.java文件。請(qǐng)注重這個(gè)類是如何擴(kuò)展Wizard并實(shí)現(xiàn)INewWizard接口的。你應(yīng)該理解它里面的很多方法。為了定制向?qū)В覀兒?jiǎn)單地調(diào)用或重載其中的某些方法。下面是一些重要的方法:
  
  生命周期方法
  
  我們應(yīng)該重載這些方法,把初始化和析構(gòu)(destrUCtion)代碼插入向?qū)е校?br />  
  · Constructor(構(gòu)造函數(shù)):向?qū)?shí)例化的時(shí)候、在Eclipse給它傳遞信息之前調(diào)用。向?qū)У囊话愠跏蓟瘜?shí)現(xiàn)。通常你希望調(diào)用"美化方法"(后面有描述)并設(shè)置對(duì)話框的默認(rèn)值。
  
  · init(IWorkbench workbench, IStructuredSelection editorSelection): Eclipse調(diào)用它為向?qū)峁┕ぷ髋_(tái)的信息。請(qǐng)重載它,保存IWorkbench和對(duì)象的句柄供以后使用。假如它是一個(gè)編輯器向?qū)Ф皇切孪驅(qū)В覀冏詈冒旬?dāng)前的編輯器選項(xiàng)作為第二個(gè)參數(shù)。
  
  · dispose():Eclipse調(diào)用它執(zhí)行清理工作。重載它來(lái)清除向?qū)褂玫馁Y源。
  
  · finalize():清除代碼,可能使用dispose()代替。
  
  美化方法
  
  這些方法都是用于裝飾向?qū)Т绑w的。
  
  · setWindowTitle(String title):設(shè)置窗體的標(biāo)題行字符串。
  
  · setDefaultPageImageDescriptor(ImageDescriptor image):用于提供顯示在向?qū)У乃许?yè)面右上方的圖片。
  
  · setTitleBarColor(RGB color):指定標(biāo)題欄用什么顏色。
  
  按鈕方法
  
  這些方法控制著向?qū)О粹o的實(shí)用性和行為。
  
  · boolean canFinish():重載它用于指定Finish(完成)按鈕是否激活(根據(jù)向?qū)У臓顟B(tài))。
  
  · boolean performFinish():重載它來(lái)實(shí)現(xiàn)向?qū)У母镜臉I(yè)務(wù)邏輯。假如向?qū)](méi)有完成(錯(cuò)誤的條件),就返回false。
  
  · boolean performCancel():重載它,在用戶點(diǎn)擊Cancel(取消)按鈕的時(shí)候進(jìn)行清除操作。假如向?qū)Р荒芙K止,則返回false。
  
  · boolean isHelpAvailable():重載它用于指定Help(幫助)按鈕是否可視。
  
  · boolean needsPreviousAndNextButtons():重載它來(lái)指定Previous(前一步)和Next(后一步)按鈕是否可視。
  
  · boolean needsProgressMonitor():重載它來(lái)指定進(jìn)度條部件是否可視。當(dāng)點(diǎn)擊Finish按鈕調(diào)用performFinish()方法的時(shí)候,它就會(huì)出現(xiàn)。
  
  頁(yè)面方法
  
  這些方法控制著頁(yè)面的外觀。
  
  · addPages():向?qū)э@示的時(shí)候調(diào)用。重載它給向?qū)Р迦胄马?yè)面。
  
  · createPageControls(Composite pageContainer):Eclipse調(diào)用它來(lái)實(shí)例化所有的向?qū)ы?yè)面(用前面的addPages()方法已經(jīng)添加的頁(yè)面)。重載它給向?qū)砑映掷m(xù)可視的窗體小部件(除頁(yè)面之外的部件)。
  
  · IWizardPage getStartingPage():重載它來(lái)檢測(cè)哪個(gè)頁(yè)面是向?qū)У牡谝粋€(gè)頁(yè)面。
  
  · IWizardPage getNextPage(IWizardPage nextPage):在默認(rèn)情況下,點(diǎn)擊Next按鈕將進(jìn)入addPages()所提供的數(shù)組中的下一個(gè)頁(yè)面。你可能希望根據(jù)用戶選擇進(jìn)入不同的頁(yè)面。重載它來(lái)計(jì)算后一個(gè)頁(yè)面。
  
  · IWizardPage getPreviousPage(IWizardPage previousPage):與getNextPage()類似,用于計(jì)算前一個(gè)頁(yè)面。
  
  · int getPageCount():檢索addPages()添加的頁(yè)面的數(shù)量。在典型情況下,你不必重載它,除非你希望顯示頁(yè)面的數(shù)量和形式。
  
  其它有用的方法
  
  這些都是有用的輔助方法:
  
  · setDialogSettings(IDialogSettings settings):你可以載入對(duì)話框的狀態(tài),并通過(guò)在init()中調(diào)用這個(gè)方法來(lái)設(shè)置這些值。在典型情況下,這些設(shè)置可以作為向?qū)ё侄蔚哪J(rèn)值。請(qǐng)查看DialogSettings類了解更具體的信息。
  
  · IDialogSettings getDialogSettings():當(dāng)我們需要數(shù)據(jù)的時(shí)候,就調(diào)用這個(gè)方法來(lái)檢索它。在performFinish()的對(duì)話框的末尾,你再次可以把數(shù)據(jù)保存到文件中。
  
  · IWizardContainer getContainer():對(duì)于檢索Shell、運(yùn)行的后臺(tái)線程、刷新窗口等非常有用。
  
  向?qū)ы?yè)面方法
  
  你已經(jīng)看到了,向?qū)怯梢粋€(gè)或多個(gè)頁(yè)面組成的。這些頁(yè)面擴(kuò)展了WizardPage類,并實(shí)現(xiàn)了IWizardPage接口。為了定制單獨(dú)的頁(yè)面,你必須了解很多方法。下面是一些重要的方法:
  
  · Constructor:用于實(shí)例化頁(yè)面。
  
  · dispose():重載它用于實(shí)現(xiàn)清除代碼。
  
  · createControl(Composite parent):重載它來(lái)給頁(yè)面添加控件。
  
  · IWizard getWizard():用于獲取父向?qū)?duì)象。對(duì)于調(diào)用getDialogSettings()是有用處的。
  
  · setTitle(String title):調(diào)用它來(lái)設(shè)置顯示在向?qū)?biāo)題區(qū)域中的字符串。
  
  · setDescription(String description):調(diào)用它來(lái)提供標(biāo)題下面顯示的文本內(nèi)容。
  
  · setImageDescriptor(ImageDescriptor image):調(diào)用它來(lái)提供頁(yè)面右上方出現(xiàn)的圖片(用于代替默認(rèn)的圖片)。
  
  · setMessage(String message):調(diào)用它來(lái)顯示描述字符串下方的消息文本。這些文本是用于警告或提示用戶的。
  
  · setErrorMessage(String error):調(diào)用它來(lái)高亮度顯示描述字符串下方的消息文本。它一般意味著向?qū)Р荒芾^續(xù),除非錯(cuò)誤被修正。
  
  · setPageComplete(boolean complete):假如為true,Next按鈕就可視。
  
  · performHelp():重載它來(lái)提供內(nèi)容敏感的幫助信息。當(dāng)點(diǎn)擊Help按鈕的時(shí)候向?qū)?huì)調(diào)用它。
  
  編寫(xiě)向?qū)У拇a
  
  有了這些方法之后,我們就能夠開(kāi)發(fā)出具有極大的靈活性的向?qū)Я恕N覀儸F(xiàn)在修改以前建立的Invokatron向?qū)Вo它添加一個(gè)頁(yè)面來(lái)請(qǐng)求用戶輸入初始的文檔數(shù)據(jù)。我們還給向?qū)砑恿艘粋€(gè)圖片。新代碼是粗體的:
  
  public class InvokatronWizard extends Wizard
  implements INewWizard {
  private InvokatronWizardPage page;
  private InvokatronWizardPage2 page2;
  private ISelection selection;
  
  public InvokatronWizard() {
  super();
  setNeedsProgressMonitor(true);
  ImageDescriptor image =AbstractUIPlugin.imageDescriptorFromPlugin("Invokatron", "icons/InvokatronIcon32.GIF");
  setDefaultPageImageDescriptor(image);
  }
  
  public void init(IWorkbench workbench,IStructuredSelection selection) {
  this.selection = selection;
  }
  
  在構(gòu)造函數(shù)中,我們打開(kāi)了進(jìn)度條,并設(shè)置了向?qū)У膱D片。你可以下載并保存下面的圖片:
  
 關(guān)于Eclipse插件開(kāi)發(fā)之定制向?qū)?圖)(圖二)

  請(qǐng)把這個(gè)圖片保存在Invokatron/icons文件夾之下。為了更輕易載入這個(gè)圖片,我們使用了便捷的AbstractUIPlugin.imageDescriptorFromPlugin()方法。
  
  請(qǐng)注重:你應(yīng)該知道,盡管這個(gè)向?qū)荌NewWizard類型的,但是并非所有的向?qū)Ф际怯糜诮⑿挛臋n的。你可以參考其它一些資料來(lái)了解如何建立"獨(dú)立的"向?qū)У男畔ⅰ?br />  
  下面是addPages()方法:
  
  public void addPages() {
  page=new InvokatronWizardPage(selection);
  addPage(page);
  page2 = new InvokatronWizardPage2(selection);
  addPage(page2);
  }
  
  在這個(gè)方法中,我們添加了一個(gè)新頁(yè)面(InvokatronWizardPage2),我們?cè)诤竺婢庉嬎O旅媸怯脩酎c(diǎn)擊向?qū)У?完成"按鈕的時(shí)候執(zhí)行的一些方法:
  
  public boolean performFinish() {
  //首先把所有的頁(yè)面數(shù)據(jù)保存在變量中
  final String containerName = page.getContainerName();
  final String fileName =page.getFileName();
  final InvokatronDocument properties = new InvokatronDocument();
  properties.setProperty(InvokatronDocument.PACKAGE,page2.getPackage());
  properties.setProperty(InvokatronDocument.SUPERCLASS,page2.getSuperclass());
  properties.setProperty(InvokatronDocument.INTERFACES,page2.getInterfaces());
  
  //現(xiàn)在調(diào)用完成(finish)方法
  IRunnableWithProgress op =new IRunnableWithProgress() {
  public void run(IProgressMonitor monitor)
  throws InvocationTargetException {
  try {
  doFinish(containerName, fileName,properties,monitor);
  } catch (CoreException e) {
  throw new InvocationTargetException(e);
  } finally {
  monitor.done();
  }
  }
  };
  try {
  getContainer().run(true, false, op);
  } catch (InterruptedException e) {
  return false;
  } catch (InvocationTargetException e) {
  Throwable realException =e.getTargetException();
  MessageDialog.openError(getShell(),"Error",realException.getMessage());
  return false;
  }
  return true;
  }
  
  為了保存數(shù)據(jù),我們必須做一個(gè)后臺(tái)事務(wù)。該事務(wù)是由向?qū)У娜萜鳎‥clipse工作臺(tái))來(lái)執(zhí)行的,并且必須實(shí)現(xiàn)IRunnableWithProgress接口,包含(唯一)一個(gè)run()方法。傳遞進(jìn)來(lái)的IProgressMonitor答應(yīng)我們報(bào)告事務(wù)的進(jìn)度。實(shí)際的數(shù)據(jù)保存工作在一個(gè)輔助方法(doFinish())中進(jìn)行:
  
  private void doFinish(String containerName,String fileName, Properties properties,
  IProgressMonitor monitor)
  throws CoreException {
  // 建立一個(gè)示例文件
  monitor.beginTask("Creating " + fileName, 2);
  IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
  IResource resource = root.findMember(new Path(containerName));
  if (!resource.exists() !(resource instanceof IContainer)) {
  throwCoreException("Container /"" + containerName + "/" does not exist.");
  }
  IContainer container =(IContainer)resource;
  final IFile iFile = container.getFile(new Path(fileName));
  final File file =iFile.getLocation().toFile();
  try {
  OutputStream os = new FileOutputStream(file, false);
  properties.store(os, null);
  os.close();
  } catch (IOException e) {
  e.printStackTrace();
  throwCoreException("Error writing to file " + file.toString());
  }
  
  //確保項(xiàng)目已經(jīng)刷新了,該文件在Eclipse API 之外建立
  container.refreshLocal(IResource.DEPTH_INFINITE, monitor);
  
  monitor.worked(1);
  
  monitor.setTaskName("Opening file for editing...");
  getShell().getDisplay().asyncExec(new Runnable() {
  public void run() {
  IWorkbenchPage page =PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
  try {
  IDE.openEditor(page,iFile,true);
  } catch (PartInitException e) {
  }
  }
  });
  monitor.worked(1);
  }
  
  我們還做了很多工作:
  
  · 我們檢索了自己希望保存文件的位置(用Eclipse的IFile類)。
  
  · 我們還獲取了該File。
  
  · 我們把屬性保存到了這個(gè)位置。
  
  · 接著我們讓Eclipse工作臺(tái)刷新項(xiàng)目,這樣就可以顯示該文件了。
  
  · 我們最后調(diào)度了一個(gè)事務(wù),它在以后執(zhí)行。這個(gè)事務(wù)包括在編輯器中打開(kāi)那個(gè)新文件。
  
  · 在整個(gè)過(guò)程中,我們通過(guò)調(diào)用IProgressMonitor對(duì)象(它是作為參數(shù)傳遞進(jìn)來(lái)的)的方法來(lái)提示用戶目前的進(jìn)展情況。
  
  最后一個(gè)方法是一個(gè)輔助的方法,當(dāng)該文件保存失敗的時(shí)候,它在向?qū)е酗@示錯(cuò)誤信息:
  
  private void throwCoreException(String message) throws CoreException {
  IStatus status =new Status(IStatus.ERROR,"Invokatron",IStatus.OK,message,null);
  throw new CoreException(status);
  }
  }
  
  向?qū)Э梢圆蹲紺oreException異常,接著可以把它所包含的Status對(duì)象顯示給用戶看。向?qū)Р粫?huì)被關(guān)閉。
  
  編寫(xiě)新的向?qū)ы?yè)面的代碼
  
  下一步,我們編寫(xiě)InvokatronWizardPage2。它的整個(gè)類都是全新的:
  
  public class InvokatronWizardPage2 extends WizardPage {
  private Text packageText;
  private Text superclassText;
  private Text interfacesText;
  
  private ISelection selection;
  
  public InvokatronWizardPage2(ISelection selection) {
  super("wizardPage2");
  setTitle("Invokatron Wizard");
  setDescription("This wizard creates a new"+" file with *.invokatron extension.");
  this.selection = selection;
  }
  
  private void updateStatus(String message) {
  setErrorMessage(message);
  setPageComplete(message == null);
  }
  
  public String getPackage() {
  return packageText.getText();
  }
  public String getSuperclass() {
  return superclassText.getText();
  }
  public String getInterfaces() {
  return interfacesText.getText();
  }
  
  上面的構(gòu)造函數(shù)設(shè)置了頁(yè)面的標(biāo)題(在標(biāo)題欄下方高亮度顯示)和描述(在頁(yè)面標(biāo)題的下方顯示)。我們還有一些輔助方法。 updateStatus處理頁(yè)面特定的錯(cuò)誤信息的顯示。假如沒(méi)有錯(cuò)誤信息,就意味著頁(yè)面完成了;因此,"下一步"按鈕就可以使用了。還有數(shù)據(jù)字段內(nèi)容的getter(獲取)方法。下面是createControl()方法,它建立了頁(yè)面的所有可視化組件
  
  public void createControl(Composite parent) {
  Composite controls =new Composite(parent, SWT.NULL);
  GridLayout layout = new GridLayout();
  controls.setLayout(layout);
  layout.numColumns = 3;
  layout.verticalSpacing = 9;
  
  Label label =new Label(controls, SWT.NULL);
  label.setText("&Package:");
  
  packageText = new Text(controls,SWT.BORDER SWT.SINGLE);
  GridData gd = new GridData(GridData.FILL_HORIZONTAL);
  packageText.setLayoutData(gd);
  packageText.addModifyListener(
  new ModifyListener() {
  public void modifyText(ModifyEvent e) {
  dialogChanged();
  }
  });
  
  label = new Label(controls, SWT.NULL);
  label.setText("Blank = default package");
  
  label = new Label(controls, SWT.NULL);
  label.setText("&Superclass:");
  
  superclassText = new Text(controls,SWT.BORDER SWT.SINGLE);
  gd = new GridData(GridData.FILL_HORIZONTAL);
  superclassText.setLayoutData(gd);
  superclassText.addModifyListener(new ModifyListener() {
  public void modifyText(ModifyEvent e) {
  dialogChanged();
  }
  });
  
  label = new Label(controls, SWT.NULL);
  label.setText("Blank = Object");
  
  label = new Label(controls, SWT.NULL);
  label.setText("&Interfaces:");
  
  interfacesText = new Text(controls,SWT.BORDER SWT.SINGLE);
  gd = new GridData(GridData.FILL_HORIZONTAL);
  interfacesText.setLayoutData(gd);
  interfacesText.addModifyListener(
  new ModifyListener() {
  public void modifyText(ModifyEvent e) {
  dialogChanged();
  }
  });
  
  label = new Label(controls, SWT.NULL);
  label.setText("Separated by ','");
  
  dialogChanged();
  setControl(controls);
  }
  
  為了編寫(xiě)這段代碼,你必須了解SWT(請(qǐng)你自己查看一些這方面的資料)。基本上,這個(gè)方法建立了標(biāo)簽和字段,并把它們放置到網(wǎng)格布局上。字段發(fā)生改變的時(shí)候,就調(diào)用dialogChanged()來(lái)驗(yàn)證它的數(shù)據(jù):
  
  private void dialogChanged() {
  String aPackage = getPackage();
  String aSuperclass = getSuperclass();
  String interfaces = getInterfaces();
  
  String status = new PackageValidator().isValid(aPackage);
  if(status != null) {updateStatus(status);
  return;
  }
  
  status = new SuperclassValidator().isValid(aSuperclass);
  if(status != null) {updateStatus(status);
  return;
  }
  
  status = new InterfacesValidator().isValid(interfaces);
  if(status != null) {updateStatus(status);
  return;
  }
  
  updateStatus(null);
  }
  
  }
  
  這個(gè)工作是在三個(gè)工具類--PackageValidator、SuperclassValidator和 InterfacesValidator的幫助下完成的。接下來(lái)我們編寫(xiě)這些類。
  
  驗(yàn)證類
  
  驗(yàn)證可以在插件的用戶輸入數(shù)據(jù)的任何部分中進(jìn)行。因此,把驗(yàn)證代碼放入可重復(fù)使用的類中是有意義的,這樣就不用把它復(fù)制到多個(gè)位置。下面是一個(gè)驗(yàn)證類的例子。
  
  public class InterfacesValidator implements ICellEditorValidator
  {
  public String isValid(Object value)
  {
  if( !( value instanceof String) )
  return null;
  
  String interfaces = ((String)value).trim();
  if( interfaces.equals(""))
  return null;
  
  String[] interfaceArray = interfaces.split(",");
  for (int i = 0; i < interfaceArray.length; i++)
  {
  IStatus status = JavaConventions.validateJavaTypeName(interfaceArray[i]);
  if (status.getCode() != IStatus.OK)
  return "Validation of interface " + interfaceArray[i] + ": " + status.getMessage();
  }
  return null;
  }
  }
  
  其它的驗(yàn)證類與它非常類似。
  
  Eclipse類庫(kù)中的另外一個(gè)極好的類是JavaConventions,它為我們驗(yàn)證數(shù)據(jù)!它包含了很多驗(yàn)證方法,例如:
  
  · validateJavaTypeName() 檢查類和接口的名稱。
  
  · validatePackageName() 檢查程序包的名稱。
  
  · validateFieldName() 檢查數(shù)據(jù)成員的名稱。
  
  · validateMethodName() 檢查方法的名稱。
  
  · validateIdentifierName() 檢查變量的名稱。
  
  現(xiàn)在我們不需要ICellEditorValidator接口,但是在以后的文章中,我們是需要它的。
  
  結(jié)果
  
  到目前為止,我們擁有了一個(gè)可以工作的向?qū)В鼡碛幸粡垐D片和兩個(gè)頁(yè)面,第二個(gè)頁(yè)面建立了原來(lái)的Invokatron文檔。圖2顯示了結(jié)果:
  
 關(guān)于Eclipse插件開(kāi)發(fā)之定制向?qū)?圖)(圖三)

  2:定制的向?qū)?br />  
  閃亮的發(fā)明
  
  我們可以看到,通常是數(shù)據(jù)驅(qū)動(dòng)應(yīng)用程序的。外表(Presentation)也是很重要的。丑陋的發(fā)明難以出售,但是閃亮的發(fā)明可能輕易出售。但是數(shù)據(jù)是我們這些程序員實(shí)現(xiàn)的非常本質(zhì)的東西。
  
  在本文中,我們首先決定了自己將處理的數(shù)據(jù)。然后,我們以定制向?qū)У姆绞絹?lái)獲取這些數(shù)據(jù)。下一篇文章將繼續(xù)講解顯示的問(wèn)題,包括定制的編輯器和屬性頁(yè)面。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 阿克| 大关县| 泽库县| 和龙市| 高淳县| 沙湾县| 崇义县| 仁布县| 揭东县| 喀喇沁旗| 盐津县| 河池市| 吴忠市| 达州市| 彭水| 福泉市| 津市市| 湖州市| 宣城市| 昌吉市| 永川市| 郑州市| 华阴市| 黔西| 故城县| 舒兰市| 贡觉县| 麻阳| 东海县| 永定县| 江西省| 南部县| 桓仁| 宜章县| 龙井市| 湖北省| 留坝县| 新民市| 宝清县| 屏南县| 南涧|