0

Back/ボタンを備えたナビゲーションパネルがありForwardます (機能は重要ではありません。GWT ページの内外でパネルを交換することに頭を悩ませたいだけです)

ナビゲーション ボタン パネル

public class NavigationButtonsPanel extends HTMLPanel
        {
            private Button btnA = new Button("Go back");
            private Button btnB = new Button("Go forward");

            public NavigationButtonsPanel( )
            {
                super("Navigation Panel");
                add(btnA);
                add(btnB);
            }

            public void setBackHandler( ClickHandler handler )
            {
                btnA.addClickHandler(handler);
            }

            public void setForwardHandler( ClickHandler handler )
            {
                btnB.addClickHandler(handler);
            }
        }

次に、これを使用する 3 つの基本パネル AB と C があります。ABC から BA に戻るナビゲーションは問題なく動作します。ここで、ユーザーがパネル B に移動する前に何かを変更する様子をシミュレートします。この場合は、PanelB のラベルです。私の最終的なアプリは明らかにこれよりも複雑になりますが、これはアプリがどのように機能するかの典型的なものでしょうか. 同じパネルまたは別のパネルでのユーザー インタラクションによってパネル内のいくつかのフィールドを変更したり、新しいパネルをロードしたり、さらにインタラクションを行ったり、別のパネルにロードしたりしますか? 特定のパネルへのパスが 1 つだけになるように、非常に明確に定義されたナビゲーション パスをユーザーに使用してもらいたいだけです。

パネルA

public class PanelA extends HTMLPanel
{
    private static PanelA panel;            
    private PanelA()
    {
        super("Panel A");
        final RootPanel rootPanel = RootPanel.get();

        NavigationButtonsPanel btnPanel = new NavigationButtonsPanel();
        btnPanel.setForwardHandler(new ClickHandler() {
            public void onClick(ClickEvent event) 
            {
                rootPanel.clear();
                PanelB.setMessageFromPreviousPage("Message set in Panel AAAAA");
                rootPanel.add( PanelB.getInstance() );
            }
        });

        add( btnPanel );
    }

    public static PanelA getInstance()
    {
        if (panel == null)
        {
            panel = new PanelA();
        }
        return panel;
    }
}

パネルB

    public class PanelB extends HTMLPanel
{
    private static PanelB panel; 
    private static String messageFromPreviousPage;

    private PanelB()
    {
        super("Panel B");
        final RootPanel rootPanel = RootPanel.get();

        Label messageLabel = new Label(messageFromPreviousPage);


        NavigationButtonsPanel btnPanel = new NavigationButtonsPanel();
        btnPanel.setBackHandler(new ClickHandler() {
            public void onClick(ClickEvent event) 
            {
                rootPanel.clear();
                rootPanel.add( PanelA.getInstance() );
            }
        });

        btnPanel.setForwardHandler(new ClickHandler() {
            public void onClick(ClickEvent event) 
            {
                rootPanel.clear();
                rootPanel.add( PanelC.getInstance() );
            }
        });

        add( btnPanel );
        add(messageLabel);
    }

    public static PanelB getInstance()
    {
        if (panel == null)
        {
            panel = new PanelB();
        }
        return panel;
    }

    public static void setMessageFromPreviousPage(
            String message)
    {
        messageFromPreviousPage = message;


}
    }

パネルC

public class PanelC extends HTMLPanel
        {
            private static PanelC panel;            
            private PanelC()
            {
                super("Panel C");
                final RootPanel rootPanel = RootPanel.get();

                NavigationButtonsPanel btnPanel = new NavigationButtonsPanel();
                btnPanel.setBackHandler(new ClickHandler() {
                    public void onClick(ClickEvent event) 
                    {
                        rootPanel.clear();
                        PanelB.setMessageFromPreviousPage("Message set in Panel CCCCCC");
                        rootPanel.add( PanelB.getInstance() );
                    }
                });

                add( btnPanel );
            }

            public static PanelC getInstance()
            {
                if (panel == null)
                {
                    panel = new PanelC();
                }
                return panel;
            }
        }
4

1 に答える 1

0
Any idea why Panel B does not update its UI? 

を使用して初めてPanelBインスタンスを作成したときPanelB.getInstance()、次に messageLabel作成し、値も設定したためです。メッセージを変更した後、PanelC から同じメソッドを 2 回呼び出している間、そのとき、PanelB新しいオブジェクトの代わりに同じインスタンスを使用しています。コーディングに従って、messageFromPreviousPageラベルテキストの代わりに変数の値を変更しています。そのため、UI に変更はありませんでした。

ラベル テキストを変更する場合はmessageLabel、globel 変数 static として宣言し、ラベルを変更します。すなわち

 private static Label messageLabel;
 private PanelB() 
{
//your code
}
 public static PanelB getInstance()
{
    if (panel == null)
    {
        panel = new PanelB();
    }
    else
    {
        messageLabel.setText(messageFromPreviousPage); //Require to set Text Again
    }
    return panel;
}
于 2013-01-07T17:04:49.027 に答える