5

ボタン obj を取得するために anon 内部クラスを使用しました。

Button modButton = new Button("Modify");
modButton.addClickHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
        //TODO: link to a pop-up, and do a refresh on exit
    }
});

これを任意のサイズの GWT FlexTable (基本的に自動サイズ変更テーブル) で使用したいと考えています。

私がこのようなことをしたら:

currentTable.setText(3, 0, "elec3");
currentTable.setWidget(3, 2, modButton);

currentTable.setText(4, 0, "elec4");
currentTable.setWidget(4, 2, modButton);

ボタンは後者の場合にのみ表示されます (インスタンスが 1 つしかないため)。上記のテーブルはプログラムによって入力されるため、可能なインスタンスごとに新しいボタンを定義するのは実際的ではありません。

私はこれを次のように試しました:

currentTable.setText(4, 0, "elec4");
currentTable.setWidget(4, 2, new Button("Modify");
modButton.addClickHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
        //TODO: link to a pop-up, and do a refresh on exit
    }
});
);

ただし、これはまったくコンパイルされません (最初; 私が推測する)、少し迷っています - どうすればこの効果を達成できますか?

ありがとう

4

2 に答える 2

1

3 番目の例では構文が正しくありませんが、いずれにせよ、その場合に匿名クラスを使用することは不可能です。どの変数にも格納されていない、新しくインスタンス化されたオブジェクトで addClickHandler を呼び出そうとしています。理論的には、そのコードを匿名クラスのコンストラクターに入れ、その関数を「this」で呼び出すことができます。問題は、Java の (まったくひどい) 匿名クラス構文の特殊性のために、コンストラクターを定義できないことです (それは何と呼ばれますか?)。

あなたが達成しようとしていることを 100% 理解しているとは言えませんが、呼び出すたびに正しく構成された新しいボタン インスタンスを返す関数を定義できますか? 例えば、

private Button newModButton() {
    Button modButton = new Button("Modify");
    modButton.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            //TODO: link to a pop-up, and do a refresh on exit
        }
    });
    return modButton;
}

それからあなたは電話するでしょう

currentTable.setWidget(4, 2, newModButton());
于 2010-02-14T02:33:36.180 に答える
0

最も効率的な方法 (GWT とコード量の両方の観点から) は、クラスで実装ClickHandlerしてから、行ごとに新しい Button行を作成することです (同じものを DOM に 2 回追加することはできません)。Widget

class Foo extends Composite implements ClickHandler {

    public Foo() {
        FlexTable currentTable = new FlexTable();

        Button button = new Button("Button1");
        // Add this class as the ClickHandler
        button.addClickHandler(this);
        currentTable.setText(3, 0, "elec3");
        currentTable.setWidget(3, 2, button);

        button = new Button("Button2");
        // Add this class as the ClickHandler
        button.addClickHandler(this);
        currentTable.setText(4, 0, "elec4");
        currentTable.setWidget(4, 2, modButton);
    }


    public void onClick(ClickEvent event) {
        //TODO: link to a pop-up, and do a refresh on exit
    }

}

ここで行っていることに注意してください。匿名クラスはなく、ClickHandler インターフェイスを 1 回実装しています。これは、ボタンごとに匿名クラスを作成するよりも効率的です (すべてのボタンを同じように動作させたい場合)。そうしないと、GWT は追加するボタンごとに追加のコードを作成する必要があります。代わりに、ClickHandler が 1 か所に実装されます。すべてのボタンから参照されます。

PS: Eclipse のような IDE を ( Google Plugin for Eclipseと共に) 使用することを検討する必要があるかもしれません。GWT の開発が簡単になり、最後のコード スニペットのような構文エラーをキャッチできます。

于 2010-02-14T10:40:01.110 に答える