原文: http://zetcode.com/gui/javagnome/layoutII/

在本章中,我们将继续使用 Java Gnome 工具箱中的布局。

新建文件夹

以下代码示例将创建一个新的文件夹对话框。

newfolder.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Alignment;
  4. import org.gnome.gtk.Button;
  5. import org.gnome.gtk.Entry;
  6. import org.gnome.gtk.Gtk;
  7. import org.gnome.gtk.HBox;
  8. import org.gnome.gtk.Label;
  9. import org.gnome.gtk.TextView;
  10. import org.gnome.gtk.VBox;
  11. import org.gnome.gtk.Widget;
  12. import org.gnome.gtk.Window;
  13. import org.gnome.gtk.WindowPosition;
  14. /**
  15. * ZetCode Java Gnome tutorial
  16. *
  17. * This program creates a new
  18. * folder window.
  19. *
  20. * @author jan bodnar
  21. * website zetcode.com
  22. * last modified March 2009
  23. */
  24. public class GNewFolder extends Window {
  25. public GNewFolder() {
  26. setTitle("New Folder");
  27. initUI();
  28. connect(new Window.DeleteEvent() {
  29. public boolean onDeleteEvent(Widget source, Event event) {
  30. Gtk.mainQuit();
  31. return false;
  32. }
  33. });
  34. setDefaultSize(270, 290);
  35. setPosition(WindowPosition.CENTER);
  36. showAll();
  37. }
  38. public void initUI() {
  39. VBox vbox = new VBox(false, 10);
  40. Label label = new Label("Name:");
  41. Entry entry = new Entry();
  42. HBox hbox1 = new HBox(false, 5);
  43. hbox1.packStart(label, false, false, 0);
  44. hbox1.packStart(entry, true, true, 0);
  45. vbox.packStart(hbox1, false, false, 0);
  46. TextView tw = new TextView();
  47. vbox.packStart(tw);
  48. HBox hbox2 = new HBox(true, 5);
  49. Button ok = new Button("OK");
  50. Button close = new Button("Close");
  51. close.setSizeRequest(65, 30);
  52. hbox2.packStart(ok);
  53. hbox2.packStart(close);
  54. Alignment halign = new Alignment(1, 0, 0, 0);
  55. halign.add(hbox2);
  56. vbox.packStart(halign, false, false, 0);
  57. add(vbox);
  58. setBorderWidth(10);
  59. }
  60. public static void main(String[] args) {
  61. Gtk.init(args);
  62. new GNewFolder();
  63. Gtk.main();
  64. }
  65. }

这是 Java Gnome 中的新文件夹窗口。

  1. VBox vbox = new VBox(false, 10);

垂直框是基础容器。

  1. HBox hbox1 = new HBox(false, 5);
  2. hbox1.packStart(label, false, false, 0);
  3. hbox1.packStart(entry, true, true, 0);
  4. vbox.packStart(hbox1, false, false, 0);

标签和输入小部件放置在水平框中。 标签应保留其默认大小,条目窗口小部件可水平扩展。

  1. TextView tw = new TextView();
  2. vbox.packStart(tw);

文本视图占据了大部分区域。 它可以水平和垂直扩展。

  1. hbox2.packStart(ok);
  2. hbox2.packStart(close);

单击确定和关闭按钮进入水平框。

  1. Alignment halign = new Alignment(1, 0, 0, 0);
  2. halign.add(hbox2);
  3. vbox.packStart(halign, false, false, 0);

上面提到的水平框已添加到对齐小部件中。 这将使按钮向右对齐,并使它们保持默认大小。

Java Gnome 中的布局管理 II - 图1

图:新文件夹

窗口

接下来,我们将创建一个更高级的示例。 我们显示一个窗口,可以在 JDeveloper IDE 中找到它。

windows.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Color;
  3. import org.gnome.gdk.Event;
  4. import org.gnome.gtk.Alignment;
  5. import org.gnome.gtk.Button;
  6. import org.gnome.gtk.Gtk;
  7. import org.gnome.gtk.HBox;
  8. import org.gnome.gtk.Label;
  9. import org.gnome.gtk.StateType;
  10. import org.gnome.gtk.TextView;
  11. import org.gnome.gtk.VBox;
  12. import org.gnome.gtk.Widget;
  13. import org.gnome.gtk.Window;
  14. import org.gnome.gtk.WindowPosition;
  15. public class GWindows extends Window {
  16. public GWindows() {
  17. setTitle("Windows");
  18. initUI();
  19. connect(new Window.DeleteEvent() {
  20. public boolean onDeleteEvent(Widget source, Event event) {
  21. Gtk.mainQuit();
  22. return false;
  23. }
  24. });
  25. setDefaultSize(350, 300);
  26. setPosition(WindowPosition.CENTER);
  27. showAll();
  28. }
  29. public void initUI() {
  30. VBox vbox = new VBox(false, 9);
  31. // first row
  32. Label windows = new Label("Windows");
  33. windows.setAlignment(0, 0);
  34. vbox.packStart(windows, false, false, 5);
  35. // second row
  36. HBox hbox1 = new HBox(false, 9);
  37. TextView view = new TextView();
  38. hbox1.packStart(view);
  39. VBox vbox2 = new VBox(false, 5);
  40. Button activate = new Button("Activate");
  41. activate.setSizeRequest(80, 30);
  42. Alignment align2 = new Alignment(0, 0, 0, 0);
  43. align2.add(activate);
  44. Button close = new Button("Close");
  45. close.setSizeRequest(80, 30);
  46. Alignment align3 = new Alignment(0, 0, 0, 0);
  47. align3.add(close);
  48. vbox2.packStart(align2, false, false, 0);
  49. vbox2.packStart(align3, false, false, 0);
  50. hbox1.packStart(vbox2, false, false, 0);
  51. vbox.packStart(hbox1);
  52. // third row
  53. HBox hbox2 = new HBox(true, 0);
  54. Button help = new Button("Help");
  55. help.setSizeRequest(80, 30);
  56. Alignment alignHelp = new Alignment(0, 0, 0, 0);
  57. alignHelp.add(help);
  58. Button ok = new Button("OK");
  59. ok.setSizeRequest(80, 30);
  60. Alignment alignOk = new Alignment(1, 0, 0, 0);
  61. alignOk.add(ok);
  62. hbox2.packStart(alignHelp);
  63. hbox2.packStart(alignOk);
  64. vbox.packStart(hbox2, false, false, 0);
  65. add(vbox);
  66. setBorderWidth(9);
  67. }
  68. public static void main(String[] args) {
  69. Gtk.init(args);
  70. new GWindows();
  71. Gtk.main();
  72. }
  73. }

我们将窗口布局分为几个部分。 主容器是垂直盒。 我们在此垂直框中放入三行。 第一个是简单的标签小部件。 第二个是水平框,由视图小部件和一个附加的垂直框组成。 最后,第三行是具有两个按钮的水平框。

  1. VBox vbox = new VBox(false, 9);

这是主要的垂直框。

  1. Button activate = new Button("Activate");
  2. activate.setSizeRequest(80, 30);
  3. Alignment align2 = new Alignment(0, 0, 0, 0);
  4. align2.add(activate);

激活按钮的大小已调整为80x30像素。 它放置在Alignment小部件内,因此它不会缩小或增长。

  1. Button ok = new Button("OK");
  2. ok.setSizeRequest(80, 30);
  3. Alignment alignOk = new Alignment(1, 0, 0, 0);
  4. alignOk.add(ok);

确定按钮右对齐。

Java Gnome 中的布局管理 II - 图2

图:窗口

查找/替换窗口

在以下示例中,我们将创建一个窗口,您可以在 Eclipse IDE 中找到该窗口。

replace.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Alignment;
  4. import org.gnome.gtk.AttachOptions;
  5. import org.gnome.gtk.Button;
  6. import org.gnome.gtk.CheckButton;
  7. import org.gnome.gtk.Frame;
  8. import org.gnome.gtk.Gtk;
  9. import org.gnome.gtk.HBox;
  10. import org.gnome.gtk.Label;
  11. import org.gnome.gtk.Table;
  12. import org.gnome.gtk.TextComboBox;
  13. import org.gnome.gtk.VBox;
  14. import org.gnome.gtk.Widget;
  15. import org.gnome.gtk.Window;
  16. import org.gnome.gtk.WindowPosition;
  17. /**
  18. * ZetCode Java Gnome tutorial
  19. *
  20. * This program creates a complicated
  21. * layout. It uses both box and table
  22. * containers.
  23. *
  24. * @author jan bodnar
  25. * website zetcode.com
  26. * last modified March 2009
  27. */
  28. public class GReplace extends Window {
  29. public GReplace() {
  30. setTitle("Replace/Find");
  31. initUI();
  32. connect(new Window.DeleteEvent() {
  33. public boolean onDeleteEvent(Widget source, Event event) {
  34. Gtk.mainQuit();
  35. return false;
  36. }
  37. });
  38. setPosition(WindowPosition.CENTER);
  39. showAll();
  40. }
  41. public void initUI() {
  42. VBox vbox = new VBox(false, 10);
  43. Label findLabel = new Label("Find");
  44. Label replaceLabel = new Label("Replace With");
  45. TextComboBox combo1 = new TextComboBox();
  46. combo1.appendText("");
  47. TextComboBox combo2 = new TextComboBox();
  48. combo2.appendText("");
  49. HBox hbox1 = new HBox(false, 10);
  50. hbox1.packStart(findLabel, false, false, 0);
  51. hbox1.packStart(combo1);
  52. HBox hbox2 = new HBox(false, 10);
  53. hbox2.packStart(replaceLabel, false, false, 0);
  54. hbox2.packStart(combo2);
  55. vbox.packStart(hbox1, false, false, 0);
  56. vbox.packStart(hbox2, false, false, 0);
  57. // second row
  58. Frame direction = new Frame("Direction");
  59. VBox v1 = new VBox(true, 0);
  60. v1.setBorderWidth(5);
  61. CheckButton cb1 = new CheckButton("Forward");
  62. CheckButton cb2 = new CheckButton("Backward");
  63. v1.packStart(cb1);
  64. v1.packStart(cb2);
  65. direction.add(v1);
  66. Frame scope = new Frame("Scope");
  67. VBox v2 = new VBox(true, 0);
  68. v2.setBorderWidth(5);
  69. CheckButton cb3 = new CheckButton("All");
  70. CheckButton cb4 = new CheckButton("Selected Lines");
  71. v2.packStart(cb3);
  72. v2.packStart(cb4);
  73. scope.add(v2);
  74. HBox framesBox = new HBox(true, 5);
  75. framesBox.packStart(direction);
  76. framesBox.packStart(scope);
  77. vbox.packStart(framesBox, false, false, 0);
  78. // third row
  79. Frame options = new Frame("Options");
  80. Table table1 = new Table(3, 2, false);
  81. CheckButton cb5 = new CheckButton("Case Sensitive");
  82. CheckButton cb6 = new CheckButton("Whole World");
  83. CheckButton cb7 = new CheckButton("Regular Expressions");
  84. CheckButton cb8 = new CheckButton("Wrap Search");
  85. CheckButton cb9 = new CheckButton("Incremental");
  86. table1.attach(cb5, 0, 1, 0, 1, AttachOptions.FILL,
  87. AttachOptions.FILL, 0, 0);
  88. table1.attach(cb6, 0, 1, 1, 2, AttachOptions.FILL,
  89. AttachOptions.FILL, 0, 0);
  90. table1.attach(cb7, 0, 1, 2, 3, AttachOptions.FILL,
  91. AttachOptions.FILL, 0, 0);
  92. table1.attach(cb8, 1, 2, 0, 1, AttachOptions.FILL,
  93. AttachOptions.FILL, 0, 0);
  94. table1.attach(cb9, 1, 2, 1, 2, AttachOptions.FILL,
  95. AttachOptions.FILL, 0, 0);
  96. table1.setBorderWidth(5);
  97. options.add(table1);
  98. vbox.packStart(options, true, true, 0);
  99. // fourth row
  100. Table table2 = new Table(2, 2, true);
  101. Button find = new Button("Find");
  102. Button replace = new Button("Replace");
  103. Button replaceFind = new Button("Replace/Find");
  104. Button replaceAll = new Button("Replace All");
  105. table2.attach(find, 0, 1, 0, 1);
  106. table2.attach(replace, 0, 1, 1, 2);
  107. table2.attach(replaceFind, 1, 2, 0, 1);
  108. table2.attach(replaceAll, 1, 2, 1, 2);
  109. vbox.packStart(table2, false, false, 0);
  110. // fifth row
  111. Button close = new Button("Close");
  112. close.setSizeRequest(80, -1);
  113. Alignment halign = new Alignment(1, 0, 0, 0);
  114. halign.add(close);
  115. vbox.packStart(halign);
  116. add(vbox);
  117. setBorderWidth(15);
  118. }
  119. public static void main(String[] args) {
  120. Gtk.init(args);
  121. new GReplace();
  122. Gtk.main();
  123. }
  124. }

这个例子看起来很复杂。 但是,如果将布局分为几部分,它将变得更加容易。 在本例中,我们将布局分为五行。

  1. HBox hbox1 = new HBox(false, 10);
  2. hbox1.packStart(findLabel, false, false, 0);
  3. hbox1.packStart(combo1);

在第一行中,我们创建两个标签和两个组合框。 在上面的代码中,标签保留其位置和大小。 当我们调整窗口大小时,组合框会扩展和增长。 所有这些都由expandfill参数控制。

在第二行中,我们有两个框架。 每个框架都有两个复选框。

  1. VBox v1 = new VBox(true, 0);
  2. v1.setBorderWidth(5);
  3. CheckButton cb1 = new CheckButton("Forward");
  4. CheckButton cb2 = new CheckButton("Backward");
  5. v1.packStart(cb1);
  6. v1.packStart(cb2);
  7. direction.add(v1);

我们为框架小部件设置一个垂直框。 在此框内,我们放置复选按钮。

  1. HBox framesBox = new HBox(true, 5);
  2. framesBox.packStart(direction);
  3. framesBox.packStart(scope);
  4. vbox.packStart(framesBox, false, false, 0);

这两个框架放在水平框内。 然后水平盒放入基本的垂直盒容器中。

第三行是框架,它在水平和垂直方向都可以扩展。 这次,我们在框架内放置了五个复选框。 为此,我们使用表容器。

第四行包含四个按钮。 它们都是相同的大小。 表格小部件非常适合这种布局。

  1. Button close = new Button("Close");
  2. close.setSizeRequest(80, -1);
  3. Alignment halign = new Alignment(1, 0, 0, 0);
  4. halign.add(close);

最后,最后一行。 我们使用Alignment小部件将按钮右对齐。 Alignment小部件还使按钮保留其初始值。 换句话说,它不会增长或收缩。

Java Gnome 中的布局管理 II - 图3

图:查找/替换窗口

在 Java Gnome 教程的这一部分中,我们创建了一些更复杂的布局。