javax.Swing 使用GridBagLayout的程序栗子
总共两个文件,第一个是启动文件,第二个是一个基础面板类
1 package com;
2
3 import com.ren.BasePanel;
4 import javax.swing.*;
5 import java.awt.BorderLayout;
6 import java.awt.Toolkit;
7
8 public class SwingTest extends JFrame {
9 public static void main(String args[]) {
10 new SwingTest();
11 }
12
13 public SwingTest() {
14 super("SwingTextField 测试");
15 init();
16 setup();
17 this.setSize(800, 300);
18 this.setVisible(true);
19 this.setLocation
20 ( //定位框架位置
21 (int) (Toolkit.getDefaultToolkit().getScreenSize().
22 getWidth() - 400) / 2,
23 (int) (Toolkit.getDefaultToolkit().getScreenSize().
24 getHeight() - 300) / 2
25 );
26 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
27 }
28
29 BasePanel leftPanel;
30 BasePanel rightPanel;
31 JTextField country = new JTextField(16);
32 JButton search = new JButton("SEARCH");
33 JTextField latitude = new JTextField(40);
34 JTextField currentTime = new JTextField(40);
35 JTextField wind = new JTextField(40);
36 JTextField visibilityField = new JTextField(40);
37 JTextField skycondition = new JTextField(40);
38 JTextField dewpoint = new JTextField(40);
39 JTextField relativehumidity = new JTextField(40);
40 JTextField presure = new JTextField(40);
41
42 public void init() {
43 leftPanel = new BasePanel() {
44 public void initAllComponents() {
45 }
46
47 public void layoutAllComponents() {
48 addComponent(country, 0, 0, 1, 1, 10, 10);
49 addComponent(search, 1, 0, 1, 1, 10, 10);
50 }
51 };
52
53 rightPanel = new BasePanel() {
54 public void initAllComponents() {
55 }
56
57 public void layoutAllComponents() {
58 addComponent(latitude, 0, 0, 1, 1, 10, 10);
59 addComponent(currentTime, 1, 0, 1, 1, 10, 10);
60 addComponent(wind, 2, 0, 1, 1, 10, 10);
61 addComponent(visibilityField, 3, 0, 1, 1, 10, 10);
62 addComponent(skycondition, 4, 0, 1, 1, 10, 10);
63 addComponent(dewpoint, 5, 0, 1, 1, 10, 10);
64 addComponent(relativehumidity, 6, 0, 1, 1, 10, 10);
65 addComponent(presure, 7, 0, 1, 1, 10, 10);
66 }
67 };
68 }
69
70 public void setup() {
71 this.setLayout(new BorderLayout());
72 this.add(leftPanel, BorderLayout.WEST);
73 this.add(rightPanel, BorderLayout.EAST);
74 }
75 }
以下是我以前的经验总结,比较有用的一个类,你可以好好研究一下
1 /**<p>
2 * =============================================================================
3 * <p>Copyright (c) 2008, Ren Java Studio
4 * <p>All rights reserved.<p>
5 * =============================================================================
6 * <p>文件名称:BasePanel.java
7 * <p>文件标识:见配置管理计划书
8 * <p>摘 要:抽象基础面板
9 * @version 2.0
10 * @author Ren
11 * <p>完成日期:2008年5月5日.<p>
12 =============================================================================*/
13 package com.ren;
14
15 import java.awt.*;
16 import javax.swing.*;
17
18 public abstract class BasePanel extends JPanel {
19 /*当前面板的容器*/
20 protected Container container;
21 /*网格布局器*/
22 protected GridBagLayout layout;
23 /*网格布局器的约束器*/
24 protected GridBagConstraints constraints;
25
26 public BasePanel() {
27 container = this;
28 layout = new GridBagLayout();
29 constraints = new GridBagConstraints();
30 container.setLayout(layout);
31 constraints.fill = constraints.BOTH; //在水平方向和垂直方向上同时调整组件大小
32 initAllComponents();
33 layoutAllComponents();
34 }
35
36 /**<p>
37 * =========================================================================
38 * <p>初始化所有GUI组件.<p>
39 =========================================================================*/
40 protected abstract void initAllComponents();
41
42 /**@todo 继承之子类完成所有组件的初始化工作 */
43
44 /**<p>
45 * =========================================================================
46 * <p>布局所有已经初始化了的GUI组件
47 *<p><blockquote><pre>
48 * 布局器,约束器必须已经初始化好
49 * 然后再调用布局子函数进行网格布局
50 *</pre></blockquote></p>
51 =========================================================================*/
52 protected abstract void layoutAllComponents();
53
54 /**@todo 继承之子类完成组件具体的布局 */
55
56 /**<p>
57 * =========================================================================
58 * <p> 工具函数:用于获取当前屏幕的分辨率
59 * @return Dimension 屏幕大小<p>
60 =========================================================================*/
61 public Dimension getScreenSize() {
62 return Toolkit.getDefaultToolkit().getScreenSize();
63 }
64
65 /**<p>
66 * ==========================================================================
67 * <p> 设置将本程序框架大小并将其定位于屏幕正中心
68 * @param container Container 要设置的容器
69 * @param width 本框架的宽度
70 * @param height 本框架的高度<p>
71 ==========================================================================*/
72 protected void putToCenter(Component container, int width, int height) {
73 container.setSize(width, height); //设置大小
74 container.setLocation
75 ( //定位框架位置
76 (int) (Toolkit.getDefaultToolkit().getScreenSize().
77 getWidth() - width) / 2,
78 (int) (Toolkit.getDefaultToolkit().getScreenSize().
79 getHeight() - height) / 2
80 );
81 }
82
83 /**<p>
84 * =========================================================================
85 * <P> 获取整个桌面的大小
86 * @return Rectangle 桌面大小.<p>
87 ==========================================================================*/
88 public java.awt.Rectangle getDesktopBounds() {
89 GraphicsEnvironment env =
90 GraphicsEnvironment.getLocalGraphicsEnvironment();
91 return env.getMaximumWindowBounds();
92 }
93
94 /**<p>
95 * =========================================================================
96 * <p> 设置将本程序框架大小并将其定位于屏幕(X,Y)坐标处宽和高为 width, height
97 * @param container Container 要设置的容器
98 * @param width int 宽度
99 * @param height int 高度
100 * @param startX int 放置位置的X坐标
101 * @param startY int 放置位置的Y坐标<p>
102 =========================================================================*/
103 protected void putToPlace(Container container, int width, int height,
104 int startX, int startY
105 ) {
106 container.setLocation(startX, startY);
107 container.setSize(width, height); //设置大小
108 }
109
110 /**<p>
111 * =========================================================================
112 * <p> 功能强大的工具函数:布局器
113 * <p> 具体功能:
114 * <p> 将 componentToAdd 组件安装到 container 容器中的
115 * <p> 第 row 行, 第 column 列,并在 container 容器中
116 * <p> 占据 height 行,width 列, 在X,Y方向分别可伸展x和y长
117 * <p> 备注:要能如此挑剔的地布局,container 必须预先设定为网格布局器:GridBagLayout,
118 * <p> 然后用 GridBagContstraints 协调布局
119 * <p>原函数来自"Java程序设计教程"第五版 P530页,函数有被我加强功能
120 * @param container Container 要布局的容器
121 * @param layout GridBagLayout 网格布局器
122 * @param constraints GridBagConstraints 约束器
123 * @param componentToAdd Component 要添加的目标组件
124 * @param row 目标组件要添加的行
125 * @param column 目标组件要添加的列
126 * @param height 目标组件占据的高度
127 * @param width 目标组件占据的宽度
128 * @param x 目标组件在水平方向的拉伸能力
129 * @param y 目标组件在垂直方向的拉伸能力<p>
130 =========================================================================*/
131 protected void addComponent(
132 Container container, GridBagLayout layout,
133 GridBagConstraints constraints,
134 Component componentToAdd, int row, int column, int height,
135 int width, int x, int y) {
136 constraints.gridx = column; //组件所在列
137 constraints.gridy = row; //组件所在行
138
139 constraints.gridwidth = width; //组件宽度
140 constraints.gridheight = height; //组件高度
141
142 constraints.weightx = x; //组件在水平方向的拉伸能力
143 constraints.weighty = y; //组件在垂直方向的拉伸能力
144
145 layout.setConstraints(componentToAdd, constraints); //设置目标组件的约束
146 container.add(componentToAdd); //在容器中添加目标组件
147 }
148
149 /**<p>
150 * =========================================================================
151 * <p> 功能强大的工具函数:布局器
152 * <p> 将指定组件安装到此 Panel 内
153 * @param componentToAdd Component 要添加的目标组件
154 * @param row 目标组件要添加的行
155 * @param column 目标组件要添加的列
156 * @param height 目标组件占据的高度
157 * @param width 目标组件占据的宽度
158 * @param x 目标组件在水平方向的拉伸能力
159 * @param y 目标组件在垂直方向的拉伸能力<p>
160 =========================================================================*/
161 protected void addComponent(Component componentToAdd,
162 int row, int column, int height,
163 int width, int xAblility, int yAblity) {
164 addComponent(container, layout, constraints, componentToAdd,
165 row, column, height, width, xAblility, yAblity);
166 }
167 }