搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
NetBeans富客戶端编程权威教程
0.00    
图书来源: 浙江图书馆(由图书馆配书)
  • 配送范围:
    全国(除港澳台地区)
  • ISBN:
    9787302182030
  • 作      者:
    (美)Tim Boudreau,(美)Jaroslav Tulach,(美)Geertjan Wielenga著
  • 出 版 社 :
    清华大学出版社
  • 出版日期:
    2008
收藏
编辑推荐
  开源NetBeans平台是一个功能极其强大的架构,主要用于构建“只编写一次,就能到处运行”的富客户端应用程序。
  对于Java开发人员和架构师来说,现有的基本Swing组件已不再满足他们的开发需求。为了解决这一问题,这本有关NetBeans平台上富客户端程序开发的权威指南便应运而生,旨在帮助读者掌握NetBeans模块的开发,精通NetBeans的主要API,以及学会一些构建可靠桌面软件的技术与技巧。书中的每一章都给出了实际的例子,并按步骤详细说明了如何在NetBeans平台上创建功能完善的富客户端应用程序和NetBeans IDE的插件。
  本书主要内容:
  ·模块开发对于小、中和大型应用程序的重要意义
  ·使用NetBeans加快开发速度和提高效率
  ·利用NetBeans的各项生产率特性(从组件面板到代码完成)
  ·在自己开发的应用程序中利用NetBeans的模块体系结构
  ·实现松散耦合的交互,以提高代码的可维护性和健壮性
  ·管理用户配置和系统配置数据
  ·使用牢固的线程模块构建可重载的组件
  ·构造复杂的多窗口应用程序,并将富客户端数据结构显示给用户
  ·添加用户可配置的选项
  ·整合Web服务与NetBeans桌面应用程序
  ·自动化模块更新和为用户提供帮助
展开
作者简介
  Tim Boudreau是NetBeansTM:The Definitive Guide(由OReilly出版)一书的合著者,开源NetBeans核心团队的成员,一直致力于NetBeans项目的开发。
  Jaroslav Tulach是NetBeans项目的共同创始人之一,API项目的忠实拥护者。
  Geertjan Wielenga是资深的技术撰稿人,主要负责编写与模块开发和富客户端应用程序开发相关的NetBeans文档。
  译者简介
  叶亮,毕业于南京工业人学计算机专业,具有5年以上的Java开发经验。2006年加入Sun中国工程研究院,从事Java、NetBeans等技术的研究与推广,负责构建Sun中国技术社区,以及NetBeans中文官方网站(http://zh-cn.netbeans.org)。现从事对企业的技术咨询工作。此外,他通过了高级程序员、系统分析师、Sun认证Java程序员等认证,并在《程序员》杂志上主持“开源人下事”专栏。还曾多次在大型技术活动中发表技术演讲,同时担任北京交通人学软件学院的外聘Java讲师,具有丰富的开发与教学经验。已出版的著作有《GLASSFISH——开源的JAVA EE应用服务器》。
展开
内容介绍
  《NetBeans富客户端编程权威教程》是一本的关NeBeans富客户端应用程序开发的权威指南,内容涵盖了NetBeans 5.5和6.x版本,重点介绍了如何使用NetBeans平台作为框架,开发“一次编写,处处运行:”的富客户端应用程序。旨在帮助读者掌握NetBeans模块的开发,精通NetBeans的主要APl,以及学会一些构建可靠桌面软件的技术与技巧。
  《NetBeans富客户端编程权威教程》由三位顶级NetBeans专家联合编写,并由Sun中国的专家团队叶亮等人翻译和审校,是中国读者不可多得的NetBeans学刊用书,也是Sun中国技术社区推荐的NetBeans技术用书。
展开
精彩书评
  我访问过一次中国,只去了北京。此时,当我提笔写下这段文字时正是在2008年8月8日——奥林匹克运动会开幕的日了——这不禁让我想起那次印象深刻的北京之旅。在北京,我们见到了众多的Java开发者,他们非常热情,积极地与我们聊天和讨论。感谢叶亮让中国的开发者也能够看到这本书。对于各位读者,我想说:“这本书不仅关乎一个技术主题,它还包含一种我们努力创造的激情。”您在工作中很可能也会有这样的激情。如果这本书能够帮您点燃这种激情,那我们就会很满足。因为这意味着我们的工作非常有价值。
  ——Tim Boudreau
  在不久的将来,模块化应用程序会变得越来越重要。在本书中,我们尽力介绍了模块化所需的基础知识,并且洋细描述了如何存NetBeans中实现它。我衷心期望尊敬的读者们都能轻松地读完这本书,并且学到对今后的职业生涯都非常有用的知识。
  ——Jaroslav Tulach
  随着应用程序的规模和复杂程度不断增加,您会慢慢发现NetBeans平台所提供的服务极其有用。我希望这本书能够提供您所需的绝大多数知识,以及观察应用程序的新视角。最重要的是,我希望本书给您带来的不仅是有用的知识,还有快乐。
  ——Geertjan Wielenga
展开
精彩书摘
  24.6  将WAV编辑器转变为多视图编辑器
  本小节将介绍如何将WavComponent改为多视图组件。关于多视图的详细介绍,请参考第12章。
  WavOpenSupport需要返回的是一个多视图组件,而不是现在比较精简的WavComponent。
  
  protected CloneableTopComponent createCloneableTopComponent()
  {
  // Create an array of MV descriptors with only one view of the
  // data (the one weve already created - the waveform view)
  WavPanelMultiViewDescriptor main =
  new WavPanelMultiViewDescriptor();
  MultiViewDescription[] descArry = { main };
  
  // Initialize the view with data
  WavDataObject dobj = (WavDataObject)entry.getDataObject();
  main.setWavDataObject(dobj);
  
  // Create the multiview
  CloneableTopComponent tc = MultiViewFactory.
  createCloneableMultiView(descArry, main, new CloseHandler());
  tc.setDisplayName(dobj.getName());
  return tc;
  }
  
  这段代码引入了两个新类:CloseHandler 和WavPanelMultiViewDescriptor。CloseHandler的名称表明了自己的作用。它负责处理多视图组件的关闭。下面的实现会询问用户文件是否应该在关闭前保存。根据用户对此的选择,对每个元素调用ProceedAction或者DiscardAction。在没有看到其他不同的实现之前,这个实现应该是默认设置:
  
  private static class CloseHandler
  implements CloseOperationHandler, Serializable {
  private static final long serialVersionUID = 1L;
  public boolean resolveCloseOperation(
  CloseOperationState[] elements) {
  NotifyDescriptor nd = new NotifyDescriptor.Confirmation(
  "Save before closing?");
  DialogDisplayer.getDefault().notify(nd);
  
  if (nd.getValue().equals(NotifyDescriptor.YES_OPTION))
  {
  for (CloseOperationState element : elements)
  {
  element.getProceedAction().actionPerformed(
  new ActionEvent(this,
  ActionEvent.ACTION_PERFORMED, "xxx"));
  }
  return true;
  }
  else if (nd.getValue().equals(NotifyDescriptor.NO_OPTION))
  {
  for (CloseOperationState element : elements)
  {
  element.getDiscardAction().actionPerformed(
  new ActionEvent(this,
  ActionEvent.ACTION_PERFORMED, "xxx"));
  }
  return true;
  }
  else
  {
  // Cancel
  return false;
  }
  }
  }
  
  WavPanelMultiViewDescriptor除了作为MultiViewElement的工厂类之外,还为每个视图提供一些描述(名称、图标等):
  
  public class WavPanelMultiViewDescriptor
  implements MultiViewDescription, Serializable {
  private static final long serialVersionUID = 1L;
  public static Image ICON =
  Utilities.loadImage("org/foo/wavutils/sampleGraph.gif");
  private WavDataObject dobj;
  
  public int getPersistenceType() {
  return TopComponent.PERSISTENCE_ALWAYS;
  }
  
  public String getDisplayName() {
  return "Waveform";
  }
  
  public Image getIcon() {
  return ICON;
  }
  
  public HelpCtx getHelpCtx() {
  return null;
  }
  
  public String preferredID() {
  return "wavEditor";
  }
  
  public MultiViewElement createElement() {
  return new WavComponent(dobj);
  }
  
  public void setWavDataObject(WavDataObject wav) {
  dobj = wav;
  }
  
  private void writeObject(ObjectOutputStream out)
  throws IOException
  {
  out.defaultWriteObject();
  }
  }
  
  现在,把老的WavComponent转变为一个MultiViewElement。元素本身再也不必是一个TopComponent的实例(不过,即使是的话也无妨)。
  
  public class WavComponent implements MultiViewElement {
  
  private static final CloseOperationState CLOSE_OPERATION_STATE
  = createCloseOperationState();
  private transient WavPanel wavPanel;
  
  public WavComponent(DataObject dobj)
  {
  super();
  wavPanel = new WavPanel(dobj);
  }
  
  public Action[] getActions() {
  return new Action[0];
  }
  
  public Lookup getLookup() {
  return wavPanel.getWavDataObject().getNodeDelegate().
  getLookup();
  }
  
  public UndoRedo getUndoRedo() {
  return new UndoRedo.Manager();
  }
  
  public JComponent getVisualRepresentation() {
  return wavPanel;
  }
  
  public JComponent getToolbarRepresentation() {
  // We dont need any widgets on the toolbar
  return new JPanel();
  }
  
  public CloseOperationState canCloseElement() {
  if (wavPanel.getWavDataObject().isModified())
  {
  return CLOSE_OPERATION_STATE;
  }
  else
  {
  return CloseOperationState.STATE_OK;
  }
  }
  
  public void setMultiViewCallback(MultiViewElementCallback
  multiViewElementCallback) {
  // Dont need this
  }
  
  // Semantics similar to the equivalent methods in TopComponent
  public void componentDeactivated() {}
  public void componentActivated() {}
  public void componentHidden() {}
  public void componentShowing() {}
  public void componentClosed() {}
  public void componentOpened() {}
  
  public Object writeReplace() {
  return null;
  }
  
  private static CloseOperationState createCloseOperationState()
  {
  return MultiViewFactory.createUnsafeCloseState(
  "xxx", new ProceedAction(), new DiscardAction());
  }
  
  private static class ProceedAction extends NodeAction
  {
  protected void performAction(Node[] node) {
  try
  {
  if (node != null && node.length > 0)
  {
  SaveCookie sc =
  (SaveCookie)node[0].getCookie(SaveCookie.class);
  sc.save();
  }
  }
  catch(IOException ex)
  {
  ErrorManager.getDefault().notify(ex);
  }
  }
  
  protected boolean enable(Node[] node) {
  return true;
  }
  
  public String getName() {
  return "Save";
  }
  
  public HelpCtx getHelpCtx() {
  return null;
  }
  }
  
  private static class DiscardAction extends NodeAction
  {
  
  protected void performAction(Node[] node) {
  if (node != null && node.length > 0)
  {
  DataObject dobj =
  (DataObject)node[0].getCookie(DataObject.class);
  
  try
  {
  // Throw away whats in memory.
  // The DataObject will be recreated from disk.
  dobj.setValid(false);
  }
  catch (PropertyVetoException ex)
  {
  ErrorManager.getDefault().notify(ex);
  }
  }
  }
  
  protected boolean enable(Node[] node) {
  return true;
  }
  
  public String getName() {
  return "Discard";
  }
  
  public HelpCtx getHelpCtx() {
  return null;
  }
  }
  }
  
  此时,编辑器应该和前一小节中的完全一样,但它是在多视图窗口中,如图24-10所示。
  
  图24-10  只有一个视图的“多视图”WAV编辑器
  接下来定义一个扩展点,让其他模块可以在多视图窗口中插入新的视图。
  24.7  创建插入额外视图的API
  在NetBeans平台上创建API的第一步是新建一个独立的包(例如,org.foo.wavsupport.api))。依赖于wavsupport的模块应该只能访问这个包中的类。为了确保这一点,请在wavsupport的“项目属性”窗口中,把这个包指定为“公共包”。如图24-11所示。
  
  图24-11  一个公共的API包
  这个API的目的是让其他的模块可以提供它们自己的MultiViewDescriptions。这意味着至少能够从其他模块中收集MultiViewDescription的实例,然后把它们插入多视图窗口中。
  但是,为了让这些其他模块获得足够的信息以创建有意义的界面,它们需要访问WavDataObject。所以,在API包中创建一个子接口:
  
  public interface WavViewDescriptor
  extends MultiViewDescription, Serializable {
  void setWavDataObject(DataObject dobj);
  }
  
  请注意,setWavDataObject()方法接受一个通用的DataObject类型对象作为参数,而不是更加特殊的WavDataObject。这是因为WavDataObject并不在API包中。最好能够让客户模块需要的任何数据都能够在DataObject的cookie集找到。
  在API包中创建一个新的子接口,命名为WavCookie,将WavDataObject中所有公共常量都移到这个接口中。同时,再为所有希望WavDataObject对外公开的方法声明公共API方法:
  
  public interface WavCookie extends Node.Cookie {
  public static final String PROP_WAVEFORM = "waveform";
  
  AudioFormat getAudioFormat();
  WrappedAudioInputStream getAudioInputStream();
  void setAudioInputStream( WrappedAudioInputStream is );
  void addPropertyChangeListener(PropertyChangeListener l);
  void removePropertyChangeListener(PropertyChangeListener l);
  }
  
  然后,让WavDataObject实现这个接口:
  
  public class WavDataObject extends MultiDataObject
  implements WavCookie {
  ...
  }
  
  请注意,不需要像在执行打开和保存cookie操作时一样把WavDataObject显式式添加到它的cookie集中。这是一个特例。所有DataObject都会自动地加入到它们自己的cookie集中。目前WavOpenSupport类仅仅实例化WavPanelMultiViewDescriptor,然后把它放在一个单元素的数组中传递给MultiViewFactory。现在,将描述符放进一个未知大小的列表中,作为第一个元素,使用Lookup(有关Lookup的详细信息,请参阅第4章的4.3节)填充列表中的其他元素:
  
  WavViewDescriptor main = new WavPanelMultiViewDescriptor();
  
  List all = new ArrayList();
  all.add(main);
  
  Lookup.Template template =
  new Lookup.Template(WavViewDescriptor.class);
  Lookup.Result result = Lookup.getDefault().lookup(template);
  for (Object wvd : result.allInstances())
  {
  all.add((WavViewDescriptor)wvd);
  }
  
  然后把数据对象的引用传递给所有描述符:
  
  for (WavViewDescriptor wvd : all)
  {
  wvd.setWavDataObject(dobj);
  }
  
  最后,把列表转换成数组,传递给MultiViewFactory:
  
  WavViewDescriptor[] allArray = new WavViewDescriptor[all.size()];
  all.toArray(allArray);
  
  CloneableTopComponent tc =
  MultiViewFactory.createCloneableMultiView(allArray, main,
  new CloseHandler());
  
  至此,客户模块就可以实现公开的WavViewDescriptor接口,并使用WavCookie提供的信息在多视图窗口中提供一个新的标签页——这些都完全不需要编辑wavsupport模块的源代码。
  24.8  实现API,提供新视图
  现在是时候成为我们自己API的客户,创建一个新模块,为WAV文件提供一个不同的可视化视图。为了方便读者,wavutils模块包含了组件FFTGraph,它基于一个在网上找到的公开域FFT库(感谢来自宾夕法尼亚大学的Tsan-Kuang Lee!),可以绘制频率域视图。
  首先在模块套件中创建一个新模块,命名为fftview。别忘记将wavsupport 和wavutils加入到它依赖的模块集中。
  接着,创建API接口 WavViewDescriptor的实现:
  
  public class FFTViewDescriptor implements WavViewDescriptor {
  
  private static final long serialVersionUID = 1L;
  public static Image ICON =
  Utilities.loadImage("org/foo/wavutils/sampleGraph.gif");
  private DataObject dobj;
  
  public int getPersistenceType() {
  return TopComponent.PERSISTENCE_ALWAYS;
  }
  
  public String getDisplayName() {
  return "Frequency Domain";
  }
  
  public Image getIcon() {
  return ICON;
  }
  
  public HelpCtx getHelpCtx() {
  return null;
  }
  
  public String preferredID() {
  return "FFT";
  }
  
  public MultiViewElement createElement() {
  return new FFTComponent(dobj);
  }
  
  public void setWavDataObject(DataObject wav) {
  dobj = wav;
  }
  
  private void writeObject(ObjectOutputStream out)
  throws IOException
  {
  out.defaultWriteObject();
  }
  }
  
  然后,还要再创建一个类,提供真正的组件:
  
  public class FFTComponent implements MultiViewElement {
  
  private DataObject dobj;
  private final FFTGraph graph = new FFTGraph();
  
  public FFTComponent(DataObject dobj)
  {
  super();
  
  this.dobj = dobj;
  final WavCookie c =
  (WavCookie)dobj.getCookie(WavCookie.class);
  assert(c != null);
  
  graph.createGraph(c.getAudioInputStream());
  
  c.addPropertyChangeListener(new PropertyChangeListener() {
  public void propertyChange(PropertyChangeEvent evt) {
  if (evt.getPropertyName().
  equals(WavCookie.PROP_WAVEFORM))
  {
  WrappedAudioInputStream wais = c.getAudioInputStream();
  if (wais == null)
  graph.clearGraph();
  else
  graph.createGraph(wais);
  }
  }
  });
  }
  
  public JComponent getVisualRepresentation() {
  return graph;
  }
  
  public JComponent getToolbarRepresentation() {
  return new JPanel();
  }
  
  public void setMultiViewCallback(
  MultiViewElementCallback multiViewElementCallback) {
  // Do nothing (we dont need the callback)
  }
  
  public CloseOperationState canCloseElement() {
  // The main wav component handles asking the user to save.
  // _This_ component is OK, whatever the outcome.
  // If the main component needed to provide any visual
  // feedback before saving/closing, this component could
  // have its own Proceed/Discard actions
  return CloseOperationState.STATE_OK;
  }
  
  public void componentDeactivated() {}
  public void componentActivated() {}
  public void componentHidden() {}
  public void componentShowing() {}
  public void componentClosed() {}
  public void componentOpened() {}
  
  public Object writeReplace() {
  return null;
  }
  
  public Action[] getActions() {
  return new Action[0];
  }
  
  public Lookup getLookup() {
  return dobj.getNodeDelegate().getLookup();
  }
  
  public UndoRedo getUndoRedo() {
  return new UndoRedo.Manager();
  }
  }
  
  剩下的最后一步是发布这个实现,让WavOpenSupport中的Lookup代码知道在哪里能找到它。最简单的方法是在src/META-INF/services/org/foo/wavsupport/api/WavViewDescriptor中新建一个文件,其中包含下列内容:
  
  org.foo.fftview.FFTViewDescriptor
  
  现在运行应用程序,应该能够看到两个视图,如图24-12所示。
  
  图24-12  一个WAV文件的频率域视图
  在全局Lookup中查询作为API的接口的实例是非常有用的技术。特别是对于一些特殊情况就更加有帮助——例如,必须集成API经常改变的产品或库,或者集成相互竞争的厂家的多个产品。开发者定义的接口会成为一个稳定的“桥梁”,每一个客户模块都是一个接口的实现,它们内部可以使用不同特定厂家的API。
  例如,假设正在构建一个填写税务表格的软件,开发者可能拥有一个接口,用来向客户模块查询税率、法律和表格要求的格式。然后为不同的权限提供不同的模块。到第二年,只需要更新这些模块即可,而应用程序的核心照常工作,无需改变。
展开
目录
第1章  NetBeans平台入门
1.1  配置IDE
1.2  NetBeans IDE基础
1.2.1  创建模块
1.2.2  创建应用程序
1.2.3  使用文件模板
1.2.4  声明依赖关系
1.2.5  运行模块
1.2.6  定制应用程序
1.2.7  发布应用程序
第2章  模块化编程的优势
2.1  分布式开发
2.2  模块化应用
2.2.1  版本
2.2.2  次级版本信息
2.2.3  依赖管理
2.3  模块化编程宣言
2.4  使用NetBeans进行模块化编码
第3章  模块化的体系结构
3.1  模块—— 程序的装配单元
3.2  模块的类型
3.2.1  最终用户界面模块
3.2.2  简单程序库
3.2.3  多厂商支持
3.2.4  模块库
3.3  模块生命周期
3.4  模块群组
第4章  低耦合的交互
4.1  注册和查找
4.2  MetaInf服务
4.3  全局Lookup
4.4  编写扩展点
第5章  Lookup
5.1  拥有Lookup的对象
5.2  Lookup作为通信机制
5.3  Lookup和代理
5.4  Lookup和选择
5.5  编写Lookup敏感的操作
5.6  追踪全局选择
5.7  NetBeans API中遗留的Lookup模式变种
5.8  常见的Lookup模式
第6章  Filesytems
6.1  FileSystems 和FileObjects
6.2  需要处理什么类型的FileSystem
6.3  层次
6.4  XML文件系统
6.5  声明式注册二:系统文件系统
6.5.1  “系统文件系统”是如何工作的
6.5.2  “系统文件系统”是可读写的
6.5.3  使用“系统文件系统”的FileChangeEvents
6.5.4  探索系统文件系统——菜单
6.6  从FileObject到Java对象
6.6.1  使用工厂方法从.instance文件创建对象
6.6.2  通过代码访问“系统文件系统”
6.6.3  使用.settings文件
6.7  浏览“系统文件系统”
6.8  小结
第7章  线程、侦听者模式和MIME查找
7.1  创建模块和SPI
7.2  实现ListModelProvider
7.2.1  建立依赖
7.2.2  创建XmlListModelProvider
7.2.3  注册XmlListModelProvider
7.3  提供一个UI组件
7.3.1  MIME查找SPI和API
7.3.2  提供一个窗口组件显示列表模型
7.4  使用Pseudo Navigator
7.5  小结:Pseudo Navigator——这张图片有什么错误?
第8章  窗口系统
8.1  窗口系统的作用
8.2  “窗口系统API”中的类
8.3  使用TopComponent
8.4  在会话间持久化状态
8.5  窗口系统持久化数据
8.6  创建编辑器样式的TopComponent(以非声明的方式)
8.7  高级窗口系统配置:自定义Mode
8.8  使用TopComponent群组
第9章  Node、Explorer视图、Action和Presenter
9.1  Node API
9.2  Explorer API
9.2.1  explorer视图组件的类型
9.2.2  创建显示Node的TopComponent
9.2.3  添加详细视图
9.2.4  使用Explorer API添加另一个详细视图
9.3  Action
9.3.1  Presenter
9.3.2  Action API和NetBeans标准操作
9.3.3  在菜单、工具栏和快捷键中安装全局Action
9.3.4  上下文感知操作
9.4  Node属性
9.5  Node和DataObject:创建系统文件系统浏览器
9.6  小结:节点、表单属性和用户界面设计
第10章  DataObject和DataLoader
10.1  DataObject来自哪里?
10.2  添加对新文件类型的支持
10.2.1  为NetBeans添加对ManiFest文件的支持
10.2.2  由manifest文件提供Manifest对象
10.2.3  由ManifestDataObject和ManifestDataNode提供ManifestProvider
10.2.4  图标徽章
10.2.5  用JUnit测试ManifestDataObject
10.3  在内部使用自定义的文件类型
10.4  序列化对象和系统文件系统
第11章  图形用户界面
11.1  介绍
11.2  新建GUI窗体
11.3  在窗体中放置和排列组件
11.4  设置组件的大小和大小可调性
11.5  设定组件的行为和外观
11.6  生成事件侦听和处理方法
11.7  定制生成的代码
11.8  用可视化的方法构建浏览器视图
11.9  预览窗体
11.10  在窗体编辑器中使用自定义的Bean
11.11  使用不同的布局管理器
第12章  多视图编辑器
12.1  介绍
12.2  入门
12.3  理解多视图编辑器
12.4  创建编辑器的基础构架
12.5  创建源视图
12.5.1  描述源MultiViewElement
12.5.2  创建源编辑器
12.5.3  在多视图编辑器中加入源视图
12.6  创建可视化视图
12.7  完成示例
第13章  语法高亮显示
13.1  介绍
13.2  准备创建语法高亮支持
13.3  创建Token ID
13.4  创建词法分析器
13.5  扩展选项窗口
13.6  扩展选项窗口
13.7  完成
第14章  完成代码
14.1  介绍
14.2  理解代码完成
14.3  代码完成提示类型
14.4  准备使用CompletionProvider接口
14.5  实现CompletionProvider
14.6  实现CompletionItem
14.7  为CompletionProvider添加过滤器
14.8  为“代码完成提示框”加入文档
14.9  为“代码完成提示框”加入工具提示
第15章  组件面板
15.1  介绍
15.1.1  理解组件面板
15.1.2  创建第一个组件面板
15.2  向组件面板中添加元素
15.2.1  为第一个组件面板添加元素
15.2.2  让用户向组件面板中添加元素
15.3  拖放组件元素
15.3.1  定义放置目标
15.3.2  定义拖拽图像
15.3.3  定义放置事件
15.3.4  定义拖拽动作
15.4  将支持特性添加到组件面板中
15.4.1  为面板添加操作
15.4.2  添加过滤器并刷新面板
15.4.3  添加属性改变侦听器
15.4.4  设置面板属性
15.4.5  提供组件面板管理器
15.5  为文本编辑器创建组件面板
15.5.1  将组件面板与文本编辑器关联
15.5.2  在文本编辑器的组件面板中添加元素
15.5.3  在文本编辑器中格式化被放置的元素
15.5.4  让用户在文本编辑器的组件面板中添加元素
第16章  超链接
16.1  介绍
16.1.1  准备提供超链接
16.1.2  HyperlinkProvider类
16.1.3  快速开始
16.2  使用HyperlinkProvider类的准备工作
16.3  manifest文件中的超链接
16.3.1  识别超链接
16.3.2  设置超链接的长度
16.3.3  打开引用的文档
16.3.4  完成
第17章  标注
17.1  介绍
17.2  准备创建错误标注
17.3  创建错误标注
17.3.1  理解错误标注DTD
17.3.2  注册错误标注
17.3.3  安装错误标注
17.4  准备使用错误标注
17.5  使用错误标注
17.5.1  描述标注
17.5.2  挂载和分离标注
17.5.3  定义请求处理任务
17.5.4  标注某行的一部分
17.6  完成
第18章  选项窗口
18.1  介绍
18.2  查看“选项”窗口扩展文件
18.2.1  AdvancedOption类
18.2.2  OptionsPanelController类
18.2.3  可视化选项面板
18.3  创建主面板
18.3.1  第一个主面板
18.3.2  重新排序选项面板
18.4  向“选项”窗口中添加设置
第19章  Web框架
19.1  介绍
19.1.1  支持Web框架的准备工作
19.1.2  WebFrameworkProvider类
19.1.3  快速开始
19.1.4  示例:简单注册
19.2  准备使用WebFrameworkProvider类
19.3  为框架提供配置面板
19.3.1  创建配置面板
19.3.2  示例:在WebFramework Provider实现中添加配置面板
19.3.3  编写配置面板
19.4  创建源代码结构
19.4.1  准备使用extend()方法
19.4.2  示例:定义extend()方法
19.4.3  创建模板
19.4.4  创建Java文件的模板
19.4.5  准备:利用模板在程序中创建Java文件
19.4.6  利用模板在程序中创建Java文件
19.4.7  尝试使用框架支持模块
19.5  让用户在“框架”面板中选择库
19.6  “项目属性”对话框和Web框架
19.7  完成
第20章  Web服务
20.1  介绍
20.2  创建和测试Web服务客户端
20.3  集成Web服务客户端
第21章  JavaHelp文档
21.1  创建帮助集
21.2  删除IDE的帮助集
21.3  标记帮助集的默认文字
第22章  更新中心
22.1  介绍
22.2  添加IDE的更新中心功能
22.3  创建和分发自动更新描述符
22.3.1  用IDE创建自动更新描述符
22.3.2  上传自动更新描述符和NBM文件
22.4  分发自动更新描述符的URL
22.4.1  生成一个注册自动更新描述符的模块
22.4.2  让用户手动注册自动更新描述符
22.5  从更新中心下载NBM文件
22.6  将更新发布到现有模块
第23章  用例1:跟Jens Trapp学习NetBeans模块开发
23.1  介绍
23.2  调用外部工具
23.2.1  创建Tidy错误检测操作
23.2.2  获取文件名
23.2.3  运行HTML Tidy
23.2.4  解决依赖
23.2.5  运行示例
23.3  处理输出
23.3.1  打印输出
23.3.2  侦听输出
23.3.3  解析输出
23.3.4  在“源代码编辑器”中标注错误
23.4  配置工具
23.4.1  扩展“选项”窗口
23.4.2  持久化选项
23.5  格式化和转换文件
23.5.1  操作文件
23.5.2  查看区别
23.6  控制转换
23.6.1  创建向导
23.6.2  连接向导
第24章  用例2:Rich Unger应用程序开发
24.1  介绍
24.2  开始
24.3  创建audio/wav的 MIME类型支持
24.4  在WavDataObject中封装音频数据
24.5  创建查看WAV文件的组件
24.6  将WAV编辑器转变为多视图编辑器
24.7  创建插入额外视图的API
24.8  实现API,提供新视图
附录A  高级模块系统开发技术
附录B  NetBeans中的常见习惯和代码模式
附录C  性能
展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证