Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

Locked History Actions

GWT/Widget/Layout

レイアウト

参考

Resizableなレイアウト

Eclipseの新規プロジェクト作成で自動生成されるサンプルではRootPanelにボタンを置いているが、こうしてしまうとそれは絶対位置になり、ブラウザ画面の大きさには追従しない。ブラウザ画面のリサイズに応じてレイアウトを変更するためには、RootLayoutPanelを使い、その中でLayoutPanelDockLayoutPanelを使う必要があるようだ。

LayoutPanel

子ウィジェットそれぞれについて、LayoutPanel全体領域のうちのどの部分を割り当てるかを指定する。 各子ウィジェットの割り当て領域は、他の子ウィジェットの割り当て領域とは無関係に指定できるため、以下のようなレイアウトになりうる。

  • LayoutPanelの全領域が子ウィジェットで覆われているとは限らない。

  • 子ウィジェットどうしがオーバーラップすることがありうる。

import static com.google.gwt.dom.client.Style.Unit.*;
import com.google.gwt.core.client.*;
import com.google.gwt.user.client.ui.*;

public class ImageViewer implements EntryPoint {
  public void onModuleLoad() {

    String leftStr = "";
    String centerStr = "";
    String rightStr = "";
    for (int y = 0; y < 300; y++) {
      for (int x = 0; x < 50; x++) {
        leftStr += "L " + x + "&nbsp;";
        rightStr += "R " + x + "&nbsp;";
        centerStr += "C " + x + "&nbsp;";
      }
      leftStr += "<br>";
      rightStr += "<br>";
      centerStr += "<br>";
    }

    LayoutPanel layoutPanel = new LayoutPanel();

    // 左0%位置から50%
    Widget left = new HTML(leftStr);
    layoutPanel.add(left);
    layoutPanel.setWidgetLeftWidth(left, 0, PCT, 50, PCT);

    // 右0%位置から50%
    Widget right = new HTML(rightStr);
    layoutPanel.add(right);
    layoutPanel.setWidgetRightWidth(right, 0, PCT, 50, PCT);

    // 上10%位置から下10%位置まで、左10%位置から右10%位置まで
    Widget center = new HTML(centerStr);
    layoutPanel.add(center);
    layoutPanel.setWidgetLeftRight(center, 10, PCT, 10, PCT);
    layoutPanel.setWidgetTopBottom(center, 10, PCT, 10, PCT);

    RootLayoutPanel rootPanel = RootLayoutPanel.get();
    rootPanel.add(layoutPanel);
  }
}

DockLayoutPanel

Swingで言うところのBorderLayout。指定方法は以下のサンプルで一目瞭然

import static com.google.gwt.dom.client.Style.Unit.*;
import com.google.gwt.core.client.*;
import com.google.gwt.user.client.ui.*;

public class ImageViewer implements EntryPoint {
  public void onModuleLoad() {

    String leftStr = "";
    String centerStr = "";
    String rightStr = "";
    for (int y = 0; y < 300; y++) {
      for (int x = 0; x < 50; x++) {
        leftStr += "L " + x + "&nbsp;";
        rightStr += "R " + x + "&nbsp;";
        centerStr += "C " + x + "&nbsp;";
      }
      leftStr += "<br>";
      rightStr += "<br>";
      centerStr += "<br>";
    }

    DockLayoutPanel layoutPanel = new DockLayoutPanel(PCT);

    // 左側20%
    Widget left = new HTML(leftStr);
    layoutPanel.addWest(left, 20);

    // 右側20%
    Widget right = new HTML(rightStr);
    layoutPanel.addEast(right, 20);

    // 残り
    Widget center = new HTML(centerStr);
    layoutPanel.add(center);
    
    RootLayoutPanel rootPanel = RootLayoutPanel.get();
    rootPanel.add(layoutPanel);
  }
}

SplitLayoutPanel

幅調節用のドラッグ可能なスプリッタが自動追加されるDockLayoutPanelただし、DockLayoutPanelではパーセント指定ができたのに、なぜかSplitLayoutPanelではピクセルサイズしか指定できない。

import static com.google.gwt.dom.client.Style.Unit.*;
import com.google.gwt.core.client.*;
import com.google.gwt.user.client.ui.*;

public class ImageViewer implements EntryPoint {
  public void onModuleLoad() {

    String leftStr = "";
    String centerStr = "";
    String rightStr = "";
    for (int y = 0; y < 300; y++) {
      for (int x = 0; x < 50; x++) {
        leftStr += "L " + x + "&nbsp;";
        rightStr += "R " + x + "&nbsp;";
        centerStr += "C " + x + "&nbsp;";
      }
      leftStr += "<br>";
      rightStr += "<br>";
      centerStr += "<br>";
    }

    SplitLayoutPanel layoutPanel = new SplitLayoutPanel();

    // 左側20ピクセル
    Widget left = new HTML(leftStr);
    layoutPanel.addWest(left, 20);

    // 右側20ピクセル
    Widget right = new HTML(rightStr);
    layoutPanel.addEast(right, 20);

    // 残り
    Widget center = new HTML(centerStr);
    layoutPanel.add(center);
    
    RootLayoutPanel rootPanel = RootLayoutPanel.get();
    rootPanel.add(layoutPanel);
  }
}

StackLayoutPanel

子ウィジェットを上下にスタックして、そのいずれか一つのみを表示する、いわばタブの変形。 各addで指定するサイズは、タブ部分の高さを指定するもの。

import static com.google.gwt.dom.client.Style.Unit.*;
import com.google.gwt.core.client.*;
import com.google.gwt.user.client.ui.*;

public class ImageViewer implements EntryPoint {
  public void onModuleLoad() {

    String topStr = "";
    String bottomStr = "";
    String middleStr = "";
    for (int y = 0; y < 300; y++) {
      for (int x = 0; x < 50; x++) {
        topStr += "T " + x + "&nbsp;";
        middleStr += "M " + x + "&nbsp;";
        bottomStr += "B " + x + "&nbsp;";
      }
      topStr += "<br>";
      middleStr += "<br>";
      bottomStr += "<br>";
    }

    StackLayoutPanel layoutPanel = new StackLayoutPanel(EM);

    Widget top = new HTML(topStr);
    layoutPanel.add(top, new HTML("TOP"), 2);
    

    Widget middle = new HTML(middleStr);
    layoutPanel.add(middle, new HTML("MIDDLE"), 2);

    Widget bottom = new HTML(bottomStr);
    layoutPanel.add(bottom, new HTML("BOTTOM"), 2);
    
    RootLayoutPanel rootPanel = RootLayoutPanel.get();
    rootPanel.add(layoutPanel);
  }
}

TabLayoutPanel

普通のタブ

import static com.google.gwt.dom.client.Style.Unit.*;
import com.google.gwt.core.client.*;
import com.google.gwt.user.client.ui.*;

public class ImageViewer implements EntryPoint {
  public void onModuleLoad() {

    String leftStr = "";
    String centerStr = "";
    String rightStr = "";
    for (int y = 0; y < 300; y++) {
      for (int x = 0; x < 50; x++) {
        leftStr += "L " + x + "&nbsp;";
        rightStr += "R " + x + "&nbsp;";
        centerStr += "C " + x + "&nbsp;";
      }
      leftStr += "<br>";
      rightStr += "<br>";
      centerStr += "<br>";
    }

    TabLayoutPanel layoutPanel = new TabLayoutPanel(4, EM);

    Widget left = new HTML(leftStr);
    layoutPanel.add(left, "left");
    
    Widget center = new HTML(centerStr);
    layoutPanel.add(center, "center");
    
    // 右側20ピクセル
    Widget right = new HTML(rightStr);
    layoutPanel.add(right, "right");

    
    RootLayoutPanel rootPanel = RootLayoutPanel.get();
    rootPanel.add(layoutPanel);
  }
}

その他のレイアウト

DeckLayoutPanel

カードデッキ(トランプの山)のように、複数の子ウィジェットを格納するが、表示するのはその中の一つのみ。 どれを表示するかはプログラム側で制御し、ユーザが直接操作することはできない。

import com.google.gwt.core.client.*;
import com.google.gwt.event.dom.client.*;
import com.google.gwt.user.client.ui.*;

public class ImageViewer implements EntryPoint {
  public void onModuleLoad() {

    RootLayoutPanel rootPanel = RootLayoutPanel.get();
    
    final DeckLayoutPanel deckLayoutPanel = new DeckLayoutPanel();    
    
    Panel layoutPanel1 = new AbsolutePanel();
    Panel layoutPanel2 = new AbsolutePanel();
    deckLayoutPanel.add(layoutPanel1);
    
    Button button1 = new Button("button1");
    button1.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        deckLayoutPanel.showWidget(1);
      }
    });
    layoutPanel1.add(button1);
    deckLayoutPanel.add(layoutPanel2);
    
    Button button2 = new Button("button2");
    button2.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        deckLayoutPanel.setWidget(null);
      }
    });
    layoutPanel2.add(button2);
    
    rootPanel.add(deckLayoutPanel);
    deckLayoutPanel.showWidget(0);
  }
}