javax.Swing 使用GridBagLayout的程序栗子

摘自https://zhidao.baidu.com/question/110748776.html 

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 }
原文地址:https://www.cnblogs.com/LiuYanYGZ/p/6156223.html