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

在本章中,我们将展示如何在窗口或对话框中布置窗口小部件。

在设计应用的 GUI 时,我们决定要使用哪些小部件以及如何在应用中组织这些小部件。 为了组织小部件,我们使用专门的不可见小部件,称为布局容器。 在本章中,我们将提到AlignmentFixedVBoxHBoxTable

Fixed

Fixed容器将子窗口小部件放置在固定位置并具有固定大小。 此容器不执行自动布局管理。 在大多数应用中,我们不使用此容器。 我们在某些专业领域使用它。 例如游戏,使用图表的专用应用,可以移动的可调整大小的组件(如电子表格应用中的图表),小型教育示例。

fixed.java

  1. package com.zetcode;
  2. import java.io.FileNotFoundException;
  3. import org.gnome.gdk.Color;
  4. import org.gnome.gdk.Event;
  5. import org.gnome.gdk.Pixbuf;
  6. import org.gnome.gtk.Fixed;
  7. import org.gnome.gtk.Gtk;
  8. import org.gnome.gtk.Image;
  9. import org.gnome.gtk.StateType;
  10. import org.gnome.gtk.Widget;
  11. import org.gnome.gtk.Window;
  12. import org.gnome.gtk.WindowPosition;
  13. /**
  14. * ZetCode Java Gnome tutorial
  15. *
  16. * This program shows how to use
  17. * the Fixed container.
  18. *
  19. * @author jan bodnar
  20. * website zetcode.com
  21. * last modified March 2009
  22. */
  23. public class GAbsolute extends Window {
  24. private Pixbuf rotunda;
  25. private Pixbuf bardejov;
  26. private Pixbuf mincol;
  27. public GAbsolute() {
  28. setTitle("Absolute");
  29. initUI();
  30. connect(new Window.DeleteEvent() {
  31. public boolean onDeleteEvent(Widget source, Event event) {
  32. Gtk.mainQuit();
  33. return false;
  34. }
  35. });
  36. setDefaultSize(300, 280);
  37. setPosition(WindowPosition.CENTER);
  38. showAll();
  39. }
  40. public void initUI() {
  41. modifyBackground(StateType.NORMAL, new Color(15000, 15000, 15000));
  42. try {
  43. bardejov = new Pixbuf("bardejov.jpg");
  44. rotunda = new Pixbuf("rotunda.jpg");
  45. mincol = new Pixbuf("mincol.jpg");
  46. } catch (FileNotFoundException e) {
  47. System.out.println("Could not load images.");
  48. System.out.println(e.getMessage());
  49. }
  50. Image image1 = new Image(bardejov);
  51. Image image2 = new Image(rotunda);
  52. Image image3 = new Image(mincol);
  53. Fixed fix = new Fixed();
  54. fix.put(image1, 20, 20);
  55. fix.put(image2, 40, 160);
  56. fix.put(image3, 170, 50);
  57. add(fix);
  58. }
  59. public static void main(String[] args) {
  60. Gtk.init(args);
  61. new GAbsolute();
  62. Gtk.main();
  63. }
  64. }

在我们的示例中,我们在窗口上显示了三个小图像。 我们明确指定放置这些图像的 x,y 坐标。

  1. modifyBackground(StateType.NORMAL, new Color(15000, 15000, 15000));

为了获得更好的视觉体验,我们将背景色更改为深灰色。

  1. bardejov = new Pixbuf("bardejov.jpg");

我们将图像从磁盘加载到Pixbuf对象。

  1. Image image1 = new Image(bardejov);
  2. Image image2 = new Image(rotunda);
  3. Image image3 = new Image(mincol);

Image是用于显示图像的小部件。 它在构造器中使用Pixbuf对象。

  1. Fixed fix = new Fixed();

我们创建Fixed容器。

  1. fix.put(image1, 20, 20);

我们将第一个图像放置在x = 20y = 20坐标处。

  1. add(fix);

最后,我们将Fixed容器添加到窗口中。

Java Gnome 中的布局管理 - 图1

图:固定

Alignment

Alignment容器控制其子窗口小部件的对齐方式和大小。

alignment.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.Gtk;
  6. import org.gnome.gtk.HBox;
  7. import org.gnome.gtk.Label;
  8. import org.gnome.gtk.VBox;
  9. import org.gnome.gtk.Widget;
  10. import org.gnome.gtk.Window;
  11. import org.gnome.gtk.WindowPosition;
  12. /**
  13. * ZetCode Java Gnome tutorial
  14. *
  15. * This program places two buttons
  16. * in the right bottom corner of
  17. * the window.
  18. *
  19. * @author jan bodnar
  20. * website zetcode.com
  21. * last modified March 2009
  22. */
  23. public class GAlignment extends Window {
  24. public GAlignment() {
  25. setTitle("Alignment");
  26. initUI();
  27. connect(new Window.DeleteEvent() {
  28. public boolean onDeleteEvent(Widget source, Event event) {
  29. Gtk.mainQuit();
  30. return false;
  31. }
  32. });
  33. setDefaultSize(260, 150);
  34. setPosition(WindowPosition.CENTER);
  35. showAll();
  36. }
  37. public void initUI() {
  38. VBox vbox = new VBox(false, 5);
  39. HBox hbox = new HBox(true, 3);
  40. vbox.packStart(new Label(""));
  41. Button ok = new Button("OK");
  42. ok.setSizeRequest(70, 30);
  43. Button close = new Button("Close");
  44. hbox.add(ok);
  45. hbox.add(close);
  46. Alignment halign = new Alignment(1, 0, 0, 0);
  47. halign.add(hbox);
  48. vbox.packStart(halign, false, false, 3);
  49. add(vbox);
  50. setBorderWidth(5);
  51. }
  52. public static void main(String[] args) {
  53. Gtk.init(args);
  54. new GAlignment();
  55. Gtk.main();
  56. }
  57. }

在代码示例中,我们在窗口的右下角放置了两个按钮。 为此,我们使用一个水平框和一个垂直框以及一个对齐容器。

  1. vbox.packStart(new Label(""));

该行将在垂直框中放置一个空标签。 标签水平和垂直扩展。 这将使附加到垂直框的下一个小部件出现在窗口底部。

  1. Button ok = new Button("OK");
  2. ok.setSizeRequest(70, 30);
  3. Button close = new Button("Close");
  4. hbox.add(ok);
  5. hbox.add(close);

这两个按钮将添加到水平框中。

  1. Alignment halign = new Alignment(1, 0, 0, 0);
  2. halign.add(hbox);

水平框将添加到对齐小部件。 对齐小部件将使按钮向右对齐。 我们必须记住,对齐容器仅包含一个子窗口小部件。 这就是为什么我们必须使用盒子。

  1. vbox.packStart(halign, false, false, 3);

对齐小部件包装在垂直框中。

Java Gnome 中的布局管理 - 图2

图:对齐

Table

Table小部件按行和列排列小部件。

calculator.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Button;
  4. import org.gnome.gtk.Entry;
  5. import org.gnome.gtk.Gtk;
  6. import org.gnome.gtk.Label;
  7. import org.gnome.gtk.Menu;
  8. import org.gnome.gtk.MenuBar;
  9. import org.gnome.gtk.MenuItem;
  10. import org.gnome.gtk.Table;
  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. /**
  16. * Java Gnome tutorial
  17. *
  18. * This program creates a calculator skeleton
  19. * with the Table container widget.
  20. *
  21. * @author jan bodnar
  22. * website zetcode.com
  23. * last modified March 2009
  24. */
  25. public class GCalculator extends Window {
  26. public GCalculator() {
  27. setTitle("Calculator");
  28. initUI();
  29. connect(new Window.DeleteEvent() {
  30. public boolean onDeleteEvent(Widget source, Event event) {
  31. Gtk.mainQuit();
  32. return false;
  33. }
  34. });
  35. setDefaultSize(250, 230);
  36. setPosition(WindowPosition.CENTER);
  37. showAll();
  38. }
  39. public void initUI() {
  40. VBox vbox = new VBox(false, 2);
  41. MenuBar mb = new MenuBar();
  42. Menu filemenu = new Menu();
  43. MenuItem file = new MenuItem("File");
  44. file.setSubmenu(filemenu);
  45. mb.append(file);
  46. vbox.packStart(mb, false, false, 0);
  47. Table table = new Table(5, 4, true);
  48. table.attach(new Button("Cls"), 0, 1, 0, 1);
  49. table.attach(new Button("Bck"), 1, 2, 0, 1);
  50. table.attach(new Label(""), 2, 3, 0, 1);
  51. table.attach(new Button("Close"), 3, 4, 0, 1);
  52. table.attach(new Button("7"), 0, 1, 1, 2);
  53. table.attach(new Button("8"), 1, 2, 1, 2);
  54. table.attach(new Button("9"), 2, 3, 1, 2);
  55. table.attach(new Button("/"), 3, 4, 1, 2);
  56. table.attach(new Button("4"), 0, 1, 2, 3);
  57. table.attach(new Button("5"), 1, 2, 2, 3);
  58. table.attach(new Button("6"), 2, 3, 2, 3);
  59. table.attach(new Button("*"), 3, 4, 2, 3);
  60. table.attach(new Button("1"), 0, 1, 3, 4);
  61. table.attach(new Button("2"), 1, 2, 3, 4);
  62. table.attach(new Button("3"), 2, 3, 3, 4);
  63. table.attach(new Button("-"), 3, 4, 3, 4);
  64. table.attach(new Button("0"), 0, 1, 4, 5);
  65. table.attach(new Button("."), 1, 2, 4, 5);
  66. table.attach(new Button("="), 2, 3, 4, 5);
  67. table.attach(new Button("+"), 3, 4, 4, 5);
  68. vbox.packStart(new Entry(), false, false, 0);
  69. vbox.packStart(table, true, true, 0);
  70. add(vbox);
  71. }
  72. public static void main(String[] args) {
  73. Gtk.init(args);
  74. new GCalculator();
  75. Gtk.main();
  76. }
  77. }

我们使用Table小部件创建一个计算器框架。

  1. Table table = new Table(5, 4, true);

我们创建一个具有 5 行 4 列的表小部件。 第三个参数是同质参数。 如果设置为true,则表中的所有小部件都具有相同的大小。 所有窗口小部件的大小等于表容器中最大的窗口小部件。

  1. table.attach(new Button("Cls"), 0, 1, 0, 1);

我们在表格容器上附加一个按钮。 到表格的左上方单元格。 前两个参数是单元格的左侧和右侧,后两个参数是单元格的顶部和左侧。 换句话说,它到达表容器的第一个单元格。 在0, 0

  1. vbox.packStart(new Entry(), false, false, 0);

我们首先打包Entry小部件。

  1. vbox.packStart(table, true, true, 0);

然后,我们添加表格小部件。 我们使其扩展所有剩余空间。

Java Gnome 中的布局管理 - 图3

图:计算机骨架

fillexpand

下面的示例说明Box容器的fillexpand参数之间的关系。

boxes.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Button;
  4. import org.gnome.gtk.Gtk;
  5. import org.gnome.gtk.HBox;
  6. import org.gnome.gtk.VBox;
  7. import org.gnome.gtk.Widget;
  8. import org.gnome.gtk.Window;
  9. import org.gnome.gtk.WindowPosition;
  10. /**
  11. * ZetCode Java Gnome tutorial
  12. *
  13. * This program explains the
  14. * relationship between the fill
  15. * and expand parameters of the Box
  16. * container.
  17. *
  18. * @author jan bodnar
  19. * website zetcode.com
  20. * last modified March 2009
  21. */
  22. public class GBoxes extends Window {
  23. public GBoxes() {
  24. setTitle("Boxes");
  25. initUI();
  26. connect(new Window.DeleteEvent() {
  27. public boolean onDeleteEvent(Widget source, Event event) {
  28. Gtk.mainQuit();
  29. return false;
  30. }
  31. });
  32. setDefaultSize(250, 150);
  33. setPosition(WindowPosition.CENTER);
  34. showAll();
  35. }
  36. public void initUI() {
  37. VBox vbox = new VBox(false, 5);
  38. HBox hbox1 = new HBox(false, 0);
  39. HBox hbox2 = new HBox(false, 0);
  40. HBox hbox3 = new HBox(false, 0);
  41. Button button1 = new Button("Button");
  42. Button button2 = new Button("Button");
  43. Button button3 = new Button("Button");
  44. hbox1.packStart(button1, false, false, 0);
  45. hbox2.packStart(button2, true, false, 0);
  46. hbox3.packStart(button3, true, true, 0);
  47. vbox.packStart(hbox1, false, false, 0);
  48. vbox.packStart(hbox2, false, false, 0);
  49. vbox.packStart(hbox3, false, false, 0);
  50. add(vbox);
  51. setBorderWidth(8);
  52. }
  53. public static void main(String[] args) {
  54. Gtk.init(args);
  55. new GBoxes();
  56. Gtk.main();
  57. }
  58. }

在我们的代码示例中,我们有一个垂直的基本框和另外三个水平的框。 我们有三个按钮。 我们将看到expandfill参数的组合将如何影响布局。

我们在垂直框内放置三个按钮。 packStart()方法的第一个参数是小部件,我们将其放入容器中。 第二个参数是扩展,第三个参数是填充,最后一个参数是填充。

  1. hbox1.packStart(button1, false, false, 0);

在这种情况下,expandfill均为假。 该按钮不会增长,并保持其初始位置。

  1. hbox2.packStart(button2, true, false, 0);

在这里,expand参数设置为true。 此按钮窗口小部件将获得额外的空间,但窗口小部件不会增大或缩小。 因此,在我们的例子中,按钮将水平居中并保持其初始大小。

  1. hbox3.packStart(button3, true, true, 0);

最后,我们将两个参数都设置为true。 这将导致按钮占用分配给它的所有水平空间。

Java Gnome 中的布局管理 - 图4

图:展开和填充参数

这是 Java Gnome 中布局管理的第一部分。