2012-01-04 72 views
6

目前我正在编程基于Vaadin的Web应用程序。我对学习周期以及如何设计简单UI的方式感到非常满意。Vaadin替代重负载UI

在Vaadin的一般长处是:

  • “原生” 的用户界面的Java用户(组件层次/事件监听器/拖&滴/验证)的编程。
  • 开箱即用的好组件(树/表/列表/ ...)。

的短处是:

  • 大而复杂的HTML输出。这会减慢浏览器的响应时间(也提到了herethere),并导致浏览器和浏览器呈现一些渲染特性。
  • 处理大量组件时遇到困难(请参阅Can CustomLayout handle 5000 components?)。
  • 如果您使用第三方组件,则需要重新编译小部件集。

我对社会问题是:

什么Web框架最适合下列要求:与事件/动作处理程序演示的

  • 分离。
  • 开箱常用组件(具有高级功能,如表栏拖动&拖放,延迟加载)。
  • 布局支持(没有填充和组件对齐的头痛)。
  • 事件传播到服务器端和服务器端事件处理。
  • 可以生成您的HTML(如果框架不是基于HTML的)并且捕获它的事件(例如鼠标点击)。
  • 可以注册关键stoke回调(例如Ctrl-S)。
  • Java开发人员的学习曲线很短。

合理的方法组合也适合。请提供“Hello World”应用程序的链接,根据您建议的框架实施。我正在考虑Apache Wicket/Echo2/Tapestry/Click/GWT,但很难做出选择而不打几个月(希望没有太大的失望)。

+0

“你会选择什么Web框架”几乎可以保证这个问题会被关闭。 – skaffman 2012-01-04 20:30:38

+0

@skaffman只是出于好奇,为什么这句话使它不适合论坛?我认为这将是使用其他框架的开发人员有趣的听力点。我自己使用Vaadin,并没有其他框架的经验,并且真的想阅读有关替代方案的意见。 – AndroidHustle 2012-01-05 11:29:17

+2

@AndroidHustle:http://stackoverflow.com/faq#dontask – skaffman 2012-01-05 11:33:08

回答

3

我完全同意你所提到的所有缺点,不能说非常反对。因为我在GWT方面很新,所以我只能分享我过去两个月收集的其他经验。

  • 分离与事件/动作处理程序的介绍。

我认为UiBinder的与注释@UiHandler( “closeButton”)@UiField在GWT 2.0和更高是完全分离的HTML表单代码和处理程序。此外,事件总线MVP模式是GWT团队的完美回答。

  • 对Java开发人员来说,学习曲线很短。

我不懂事,我不认为这是有可能获得高质量的结果只用java知识不理解Web技术。

我已阅读和阅读的大多数GWT UI框架引入了比解决方案更多的问题。它们以某种方式管理着一个或几个优点,并限制你从新版本的GWT中引入的其他功能。我选择不使用vaadin,因为我觉得它会迫使我以他们的方式进行webapp开发,我同意这很容易理解,但不知何故受到限制。我喜欢通过选择没有花哨控件的经典GWT来获得一些自由。

另外我也觉得GWT UI组件是有限的,没有质量的选择。这里不对劲。我认为谷歌团队必须在这方面做点什么。

问候RemisB

+0

意见+1。需要多少时间才能实现我在GWT中提到的那个界面? – 2012-01-06 00:51:00

3

可以使用Vaadin表,解决了原来的问题,或多或少是这样。诀窍是创建一个Vaadin容器并将其作为数据放入其中。在文本方面,在VerticalLayout中包装一个标签,然后添加一个点击监听器。这样可以显示XHTML文本的“段落”,检测相对位置的点击,并且仍然能够处理大量的段落。

您可能需要修改styles.css以允许在表格行中包装文本,这样会得到不整齐的行。

package com.soletta.clickytable; 

import com.vaadin.Application; 
import com.vaadin.data.util.IndexedContainer; 
import com.vaadin.event.LayoutEvents.LayoutClickEvent; 
import com.vaadin.event.LayoutEvents.LayoutClickListener; 
import com.vaadin.terminal.Sizeable; 
import com.vaadin.terminal.gwt.server.WebApplicationContext; 
import com.vaadin.ui.Button; 
import com.vaadin.ui.Label; 
import com.vaadin.ui.Table; 
import com.vaadin.ui.VerticalLayout; 
import com.vaadin.ui.Window; 
import com.vaadin.ui.Window.CloseEvent; 
import com.vaadin.ui.Window.CloseListener; 

public class ClickytableApplication extends Application { 
    @Override 
    public void init() { 
     Window mainWindow = new Window("Clickytable 2 Application"); 
     setMainWindow(mainWindow); 
     mainWindow.addListener(new CloseListener(){ 
      public void windowClose(CloseEvent e) { 
       WebApplicationContext context = (WebApplicationContext) getContext(); 
       context.getHttpSession().invalidate(); 
       close(); 
      }}); 

     IndexedContainer container = new IndexedContainer(); 
     container.addContainerProperty("text", VerticalLayout.class, new VerticalLayout()); 
     container.addContainerProperty("edit", Button.class, new Button("Edit")); 

     for (int i = 0; i < 10; i++) { 
      final int index = i; 
      Object item = container.addItem(); 
      Label lbl = new Label("Text Content " + i); 
      VerticalLayout vl = new VerticalLayout(); 
      vl.setWidth(100, Sizeable.UNITS_PERCENTAGE); 
      vl.addComponent(lbl); 
      vl.addListener(new LayoutClickListener() { 
       public void layoutClick(LayoutClickEvent event) { 
        System.out.println(String.format("Clicked on text %,d at client(%,d,%,d), relative(%,d %,d)\n", index, event.getClientX(), event.getClientY(), event.getRelativeX(), event.getRelativeY())); 
       } 
      }); 

      container.getItem(item).getItemProperty("text").setValue(vl); 
      container.getItem(item).getItemProperty("edit").setValue(new Button("Button " + i)); 
     } 

     Table table = new Table("ClickyTable 2", container); 
     table.setColumnExpandRatio("text", 1); 
       table.setColumnExpandRatio("edit", 0); 
     table.setSizeFull(); 

     VerticalLayout fl = new VerticalLayout(); 
     fl.setSizeFull(); 
     fl.addComponent(table); 

     mainWindow.setContent(fl); 
    } 
} 

有了一些风格的变化,结果会是这个样子:

ClickTable Screen Shot http://www.soletta.com/images/ClickyTable.PNG

+0

感谢您的评论。我可以问你把零件的数量从10增加到700(在for循环中,还有表格中的数字或可见行)?如果我加载3Mb的XHTML数据(将其拆分为段落,每行1段),那么会不会使用表格?这是我需要的最低限度。也许你还可以推荐如何从屏幕截图实现UI?如果Vaadin难以实现,那么...... – 2012-01-06 15:06:31

+0

我修改了700个项目 - 速度没有区别。我插入了几段文字,而不是一个简单的标签,并且速度保持良好。你需要做一些自定义的CSS - 基本上你需要覆盖“whitespace:normal”,并在几个地方删除溢出:hiddens。 Vaadin在内部自动完成所有分页。 – 2012-01-06 15:36:39

+0

感谢您的好主意。 +1努力。难点在于我每段有几个链接,应该很大(例如10),通常它是“文本链接文本链接” - 总共20个链接。在这种情况下,我需要'Horizo​​ntalLayout'填充... VerticalLayout +每个块的标签!我对吗?如果是这样,我可以想象会是HTML的大小。另一方面,我可以尝试在每一行使用['ClickableCustomLayout'](http://vaadin.com/directory#addon/clickable-custom-layout) - 这是更糟糕的尝试。 – 2012-01-06 16:55:19

1

如果你发现自己把数百个组件的Vaadin网页上,你或许应该重新考虑你的应用结构。为什么不实现一个自定义小部件的UI部分需要这么多的小部件?这只是GWT,因此很容易。然后,您可以拥有两全其美的优势 - 在客户端完全控制HTML5的Vaadin的简单性。

+0

** Joonas **,感谢您的评论。也感谢您在Vaadin论坛上的帮助。重新考虑用户界面非常简单。考虑下面的例子:我想显示带有许多链接的HTML页面,并在链接点击时,我想显示带有消息“Link was clicked”的弹出窗口。你将如何实现这一点?也许我会采用['ClickableCustomLayout'](https://vaadin.com/directory#addon/clickable-custom-layout)中实现的解决方案。然而,东西不能很好地扩展并导致JS超时。顺便说一句,你会如何推荐在屏幕截图上实现UI? – 2012-01-08 18:47:27

+0

虽然我同意这一点,但这个问题确实取决于你的情况。我目前发现自己创建了一个只有160行,但是有52列的表格,我的数据集在这个表格中生成了大约1600个按钮。这并不容易被优化。首先,您需要学习一项新技术(GWT),然后如何制作一张“更好”的桌子,然后是核心Vaadin专家?我确实注意到古怪。当我向上/向下滚动。并备份。 Vaadin似乎再次加载相同的数据,而且它没有在浏览器中缓存。无论如何,Joonas,你在论坛上的帮助和这里一如既往的伟大! – 2013-07-19 01:38:31