控制台程序。

java.awt.GridBagLayout管理器比前面介绍的其他布局管理器灵活得多,因此使用起来也比较复杂。基本机制就是在随意的矩形网格中布局组件,但网格的行和列不一定拥有相同的高度和宽度。

GridBagLayout中的每个组件都有自己的约束,在把组件添加到容器中之前,这些约束在GridBagConstrains类型的对象中指定,这种对象将关联到每个组件上。每个组件的位置、相对大小以及在网格中占据的区域都由与之关联的GridBagConstrains对象决定。

 import javax.swing.*;
import java.awt.*;
import javax.swing.border.Border; public class TryGridBagLayout { public static void createWindow(){
JFrame aWindow = new JFrame("This is the Window Title");
Toolkit theKit = aWindow.getToolkit(); // Get the window toolkit
Dimension wndSize = theKit.getScreenSize(); // Get screen size // Set the position to screen center & size to half screen size
aWindow.setSize(wndSize.width/2, wndSize.height/2); // Set window size
aWindow.setLocationRelativeTo(null); // Center window
aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); GridBagLayout gridbag = new GridBagLayout(); // Create a layout manager
GridBagConstraints constraints = new GridBagConstraints();
aWindow.getContentPane().setLayout(gridbag); // Set the container layout mgr // Set constraints and add first button
constraints.weightx = constraints.weighty = 10.0;
constraints.fill = GridBagConstraints.BOTH; // Fill the space
addButton(" Press ", constraints, gridbag, aWindow); // Add the button // Set constraints and add second button
constraints.gridwidth = GridBagConstraints.REMAINDER; // Rest of the row
addButton("GO", constraints, gridbag, aWindow); // Create and add button aWindow.setVisible(true); // Display the window
} static void addButton(String label,
GridBagConstraints constraints,
GridBagLayout layout,
JFrame window) {
// Create a Border object using a BorderFactory method
Border edge = BorderFactory.createRaisedBevelBorder(); JButton button = new JButton(label); // Create a button
button.setBorder(edge); // Add its border
layout.setConstraints(button, constraints); // Set the constraints
window.getContentPane().add(button); // Add button to content pane
} public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createWindow();
}
});
}
}

当调用setConstrains()方法,使GridBagConstrains对象关联按钮对象时,会为传送为参数的constrains对象传送副本,并把对副本的引用存储在布局中,而不是存储对所创建对象的引用。这样就可以修改创建的constrains对象,将它用于第二个按钮,而不会影响用于第一个按钮的约束。

可以将第二个按钮的宽度设置为第一个的一半:

 // Set constraints and add second button
constraints.weightx = 5.0; // Weight half of first
constraints.insets = new java.awt.Insets(10, 30, 10, 20); // Left 30 & right 20
constraints.gridwidth = GridBagConstraints.RELATIVE; // Rest of the row
addButton("GO", constraints, gridbag, aWindow); // Create and add button

现在,第二个按钮在x方向上占据了1/3的空间-对应于x方向上总可用空间的5/(5+10)。
假定要添加第三个按钮,宽度与Press按钮相同并且放在Press按钮的下面。可以在第二个按钮的下面添加如下代码:

 // Set constraints and add third button
constraints.insets = new java.awt.Insets(0,0,0,0); // No insets
constraints.gridx = 0; // Begin new row
constraints.gridwidth = 1; // Width as "Press"
addButton("Push", constraints, gridbag, aWindow); // Add button to content pane

把gridx约束重置为0,从而把按钮放在下一行的开头。

如果GO按钮的高度是Press和Push按钮的高度之和,效果会更好。为此,需要使GO按钮的高度是另外两个按钮的高度的两倍。

  // Set constraints and add second button
constraints.weightx = 5.0; // Weight half of first
constraints.insets = new java.awt.Insets(10, 30, 10, 20); // Left 30 & right 20
constraints.gridwidth = GridBagConstraints.RELATIVE; // Rest of the row
constraints.gridheight = 2; // Height 2x "Press"
addButton("GO", constraints, gridbag, aWindow); // Create and add button // Set constraints and add third button
constraints.insets = new java.awt.Insets(0,0,0,0); // No insets
constraints.gridx = 0; // Begin new row
constraints.gridwidth = 1; // Width as "Press"
constraints.gridheight = 1; // Height as "Press"
addButton("Push", constraints, gridbag, aWindow); // Add button to content pane

Java基础之创建窗口——使用GridBagLayout管理器(TryGridBagLayout)的更多相关文章

  1. Java基础之创建窗口——使用BoxLayout管理器(TryBoxLayout4)

    控制台程序. javax.swing.BoxLayout类定义的布局管理器在单行或单列中布局组件.创建BoxLayout对象时,需要指定是在行还是列中布局组件. 对于行,组件是从左到右地添加:对于列, ...

  2. Java基础之创建窗口——使用SpringLayout管理器(TrySpringLayout)

    控制台程序. 可以把JFrame对象aWindow的内容面板的布局管理器设置为javax.swing.SpringLayout管理器. SpringLayout类定义的布局管理器根据javax.swi ...

  3. Java基础之创建窗口——使用流布局管理器(TryFlowLayout)

    控制台程序. FlowLayout把组件放在容器的连续行中,使每一行都放置尽可能多的组件.如果某行已满,就放在下一行.工作方式类似于文本处理器把单词放在行中.主要用途是放置按钮,但也可以用来放置其他组 ...

  4. Java基础之创建窗口——使用网格布局管理器(TryGridLayout)

    控制台程序. 网格布局管理器可以在容器的矩形网格中布局组件. import javax.swing.*; import java.awt.*; import javax.swing.border.Et ...

  5. Java基础之创建窗口——使用卡片布局管理器(TryCardLayout)

    控制台程序. 卡片布局管理器会生成一叠组件——一个组件放在另一个组件的上面.添加到容器中的第一个组件在堆栈的顶部,因此是可见的,添加的最后一个组件在堆栈的底部.使用默认的构造函数CardLayout( ...

  6. Java基础之创建窗口——使用边界布局管理器(TryBorderLayout)

    控制台程序. 边界布局管理器最多能在容器中放置5个组件.在这种布局管理器中,可以把组件放在容器的任意一个边界上,也可以把组件放在容器的中心.每个位置只能放置一个组件.如果把组件放置在已被占用的边界上, ...

  7. Java基础之创建窗口——向窗口中添加菜单(Sketcher)

    控制台程序. JMenuBar对象表示放在窗口顶部的菜单栏.可以为JMenuBar对象添加JMenu或JMenuItem对象,它们都显示在菜单栏上.JMenu对象是带有标签的菜单,单击就可以显示一列菜 ...

  8. Java基础之创建窗口——颜色和光标(TryWindow4)

    控制台程序. java.awt包中把SystemColor类定义为Color类的子类.SystemColor类封装了本机操作系统用于显示各种组件的标准颜色.如果要比较SystemColor值和Colo ...

  9. Java基础之创建窗口——使窗口在屏幕居中(TryWindow2/TryWindow3)

    控制台程序. 1.使用ToolKit对象在屏幕的中心显示窗口,将窗口的宽度和高度设置为屏幕的一半: import javax.swing.JFrame; import javax.swing.Swin ...

随机推荐

  1. DWZ的选择带回功能无法带回第一个value中的值

    <volist name="node1._child" id="node2"> 这里的value中第一个id是无法带回给上一个页面的..如果要带回则 ...

  2. DirectX基础学习系列8 渐进网格以及外接体

    1 IUnknown--> ID3DXBUFFER D3D泛型接口: GetBufferPointer Retrieves a pointer to the data in the buffer ...

  3. RFID读卡器设置卡

    1.打开串口 2.默认密码fffffffffff 3.设置新密码扇区1块号3存放的密码. 4.写入警号001,警号要看数据库是多少

  4. DOM下的节点属性和操作小结

    属性: 1 .nodeName 节点名称,相当于tagName.属性节点返回属性名,文本节点返回#text.nodeName,是只读的. 2 .nodeType 值:1,元素节点:2,属性节点:3,文 ...

  5. php面向对象之__toString()

    似曾相识,在php面向对象编程之魔术方法__set,曾经介绍了什么是魔术方法,这一章又介绍一个魔术方法__tostring(). __toString()是快速获取对象的字符串信息的便捷方式,似乎魔术 ...

  6. MVC3下的layout页面

    1.Layout页基础:如果你有使用MasterPage的经验,你将会记得如下的几个东西 A:<%@ Master %> B:<%@ Page %> C:<asp:Con ...

  7. 蓝牙BLE LINK LAYER剖析(一) -- status and channel

    一.LINK LAYER STATES 二.PHYSICAL CHANNEL

  8. 15 款最好的 C/C++ 编译器和集成开发环境

    我们有很多编程语言来进行 web 开发,比如 Java,.Net,PHP,Ruby,Perl,Python 等等.今天我们主要讨论的是两大古老而又流行的语言: C 和 C++ ,它们有着许多卓越的特性 ...

  9. Qt调用dll中的功能函数

    声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:   ...

  10. qt如何实现一个渐隐窗口呢(开启的时候他是从上往下渐渐显示)

    qt如何实现一个渐隐窗口呢?就是比如说开启的时候他是从上往下渐渐显示的,关闭的时候从下往上渐渐小时的http://stackoverflow.com/questions/19087822/how-to ...