7

現在、私はVaadinに基づいて Web アプリケーションをプログラミングしています。学習サイクルと、いかに簡単に UI を設計できるかに非常に満足しています。

Vaadin の一般的な利点は次のとおりです。

  • Java ユーザー向けの「ネイティブ」UI プログラミング (コンポーネント階層 / イベント リスナー / ドラッグ アンド ドロップ / 検証)。
  • コンポーネントのすぐに使用可能な素敵なコレクション (ツリー / テーブル / リスト / ...)。

マイナスは次のとおりです。

  • 大きくて複雑な HTML 出力。これにより、ブラウザーの応答時間が遅くなり (あちこちで言及されてます)、ブラウザーごとにレンダリングの特性が異なります。
  • 多数のコンポーネントを処理するのが難しい ( CustomLayout は 5000 個のコンポーネントを処理できますか?を参照してください)。
  • サードパーティのコンポーネントを使用する場合、ウィジェット セットを再コンパイルする必要があります。

コミュニティへの私の質問は次のとおりです。

次の要件に最適な Web フレームワークはどれですか:

  • イベント/アクション ハンドラーによるプレゼンテーションの分離。
  • すぐに使用できる一般的なコンポーネント (テーブル列のドラッグ & ドロップ、遅延読み込みなどの高度な機能を備えています)。
  • レイアウトのサポート (コンポーネントのパディングと配置に悩まされることはありません)。
  • サーバーへのイベントの伝播とサーバー側のイベント処理。
  • HTML を生成し (フレームワークが HTML ベースでない場合)、そのイベント (マウス クリックなど) をキャプチャすることもできます。
  • キーストロークのコールバック (例: Ctrl-S) を登録できることはプラスです。
  • Java 開発者の学習曲線が短いことはプラスです。

アプローチの賢明な組み合わせも同様に適合します。あなたが提案するフレームワークに基づいて実装された「Hello World」アプリケーションのリンクを提供してください。Apache Wicket / Echo2 / Tapestry / Click / GWTを検討していますが、2、3 か月プレイせずに選択するのは困難です (願わくば大きな失望がなければ)。

4

5 に答える 5

3

私はあなたが言及したすべてのマイナス点に完全に同意し、あまり反対することはできません. 私は GWT にまったく慣れていないので、過去 2 か月間で収集した小さな経験しか共有できません。

  • イベント/アクション ハンドラーによるプレゼンテーションの分離。

GWT 2.0以降でアノテーション @UiHandler("closeButton") @UiField を付けたUiBinderは、まさにHTMLフォームコードとハンドラーを分離するためのものだと思います。また、イベント バスを使用した MVP パターンは、GWT チームからの完璧な回答です。

  • Java 開発者の学習曲線が短いことはプラスです。

私は世間知らずではなく、WEB 技術を理解せずに Java の知識だけで質の高い結果を得ることができるとは思いません。

私がレビューして読んだ GWT UI フレームワークのほとんどは、解決策よりも多くの問題をもたらします。それらは何らかの形で 1 つまたはいくつかの利点を実現し、GWT の新しいリリースに含まれる他の機能を制限します。私は vaadin を使用しないことを選択しました。なぜなら、それは私が彼らのやり方で webapp 開発を行うことを余儀なくされると感じたからです。派手なコントロールのない古典的な GWT を選択することで、いくらかの自由を得たいと思っています。

また、GWT の UI コンポーネントは限られていると感じており、質の高い代替品はありません。ここは何かがおかしい。Google チームはこの部分で何かをしなければならないと思います。

よろしくRemisB

于 2012-01-05T18:13:49.723 に答える
3

Vaadin Table を使用して、多かれ少なかれこのように元の問題を解決できます。コツは、Vaadin Container を作成し、その中にコンポーネントをデータとして配置することです。テキスト側では、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 スクリーン ショット http://www.soletta.com/images/ClickyTable.PNG

于 2012-01-06T14:58:06.347 に答える
1

Vaadin の Web ページに何百ものコンポーネントを配置していることに気付いた場合は、おそらくアプリケーションの構造を再考する必要があります。膨大な数のウィジェットを必要とする UI の部分にカスタム ウィジェットを実装しないのはなぜですか? これは単なる GWT であるため、かなり簡単です。次に、クライアント側で HTML5 を完全に制御できる Vaadin のシンプルさという、両方の長所を活用できます。

于 2012-01-06T23:26:40.880 に答える