三、布局管理器 Swing中,每个组件在容器中都有一个具体的位置和大小,在容器中摆放各自组件时很难判断其具体位置和大小,这里我们就要引入布局管理器了,它提供了基本的布局功能,可以有效的处理整个窗体的布局。常用的布局管理器包括流布局管理器、边界布局管理器、网格布局管理器等。
1. 绝对布局 绝对布局在上一篇的例子中已经出现过了,是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。步骤如下:
(1)使用Container.setLayout(null)方法取消布局管理器
(2)使用Container.setBounds()方法设置每个组件的位置和大小
举一个简单的例子:
Container container = getContentPane();
JButton jb = new JButton("按钮");
jb.setBounds(10, 30, 100, 30);
container.add(jb);
setBounds()方法中,前两个参数是位置的xy坐标,后两个参数是按钮的长和宽。
2. 流布局管理器 流布局管理器是布局管理器中最基本的布局管理器,使用FlowLayout类,像“流”一样从左到右摆放组件,直到占据了这一行的所有空间,再向下移动一行。组件在每一行的位置默认居中排列,要更改位置可自行设置。
在FlowLayout的有参构造方法中,alignment设置为0时,每一行的组件将被指定左对齐排列;当alignment被设置为2时,每一行的组件将被指定右对齐排列;而为1时是默认的居中排列。
下面举个例子,创建10个按钮并用流布局管理器排列。
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class FlowLayoutDemo extends JFrame {
public FlowLayoutDemo() {
Container container = this.getContentPane();
this.setLayout(new FlowLayout(2, 10, 10));
for(int i=0; i<10; i++) {
container.add(new JButton("按钮" + i));
}
this.setSize(300, 200);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new FlowLayoutDemo();
}
}
3. 边界布局管理器 在不指定窗体布局时,Swing组件默认的布局管理器是边界布局管理器,使用的是BorderLayout类。在上篇例子中,一个JLabel标签占据了整个空间,实质上是默认使用了边界布局管理器。边界布局管理器还可以容器分为东、南、西、北、中五个区域,可以将组件加入这五个区域中。
下面举一个实例。
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class BorderLayoutDemo extends JFrame {
private String[] border = {BorderLayout.CENTER, BorderLayout.NORTH,
BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.EAST};
private String[] button = {"中", "北", "南", "西", "东"};
public BorderLayoutDemo() {
Container container = this.getContentPane();
this.setLayout(new BorderLayout());
for(int i=0; i<button.length ; i++) {
container.add(border[i], new JButton(button[i]));
}
this.setVisible(true);
this.setSize(300, 200);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new BorderLayoutDemo();
}
}
四、面板 面板也是一个容器,可作为容器容纳其他组件,但也必须被添加到其他容器中。Swing中常用面板有JPanel面板和JScrollPane面板。
1. JPanel JPanel面板可以聚集一些组件来布局。继承自java.awt.Container类。
下面举个例子。
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class JPanelDemo extends JFrame {
public JPanelDemo() {
Container container = this.getContentPane();
container.setLayout(new GridLayout(2, 1, 10, 10));
JPanel p1 = new JPanel(new GridLayout(1, 3));
JPanel p2 = new JPanel(new GridLayout(1, 2));
JPanel p3 = new JPanel(new GridLayout(2, 1));
JPanel p4 = new JPanel(new GridLayout(3, 2));
p1.add(new JButton("1"));
p1.add(new JButton("1"));
p1.add(new JButton("1"));
p2.add(new JButton("2"));
p2.add(new JButton("2"));
p3.add(new JButton("3"));
p3.add(new JButton("3"));
p4.add(new JButton("4"));
p4.add(new JButton("4"));
p4.add(new JButton("4"));
p4.add(new JButton("4"));
p4.add(new JButton("4"));
p4.add(new JButton("4"));
container.add(p1);
container.add(p2);
container.add(p3);
container.add(p4);
this.setVisible(true);
this.setSize(500, 350);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JPanelDemo();
}
}
2. JScrollPane 若遇到一个较小的容器窗体中显示一个较大部分内容的情况,可用JScrollPane面板。这是一个带滚动条的面板,就像平时浏览网页,经常遇到的滚动条一样。
如果需要在JScrollPane面板中放置多个组件,需将这多个组件放置在JPanel面板上,然后将JPanel面板作为一个整体组件添加在JScrollPane面板上。
下面看一个例子。
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.WindowConstants;
public class JScrollPaneDemo extends JFrame {
public JScrollPaneDemo() {
Container container = this.getContentPane();
JTextArea tArea = new JTextArea(20, 50);
tArea.setText("http://www.cnblogs.com/adamjwh/");
JScrollPane sp = new JScrollPane(tArea);
container.add(sp);
this.setVisible(true);
this.setSize(300, 150);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JScrollPaneDemo();
}
}
|