1.创 建 窗 体
import javax.swing.JFrame;
public class MyFirstFrame extends JFrame {
public static void main(String[] args) {
MyFirstFrame frame = new MyFirstFrame();
frame.setVisible(true); // 设置窗体可见,默认为不可见
}
public MyFirstFrame() {
super(); // 继承父类的构造方法
setTitle("我的窗体"); // 设置窗体的标题【前两句也可直接用super("我的窗体")代替】
setBounds(100, 100, 500, 375); // 设置窗体的显示位置及大小,前两个参数依次为窗体左上角的点在显示器中的水平和垂直坐标,后两个参数依次为窗体的宽度和高度。
getContentPane().setLayout(null); // 设置为不采用任何布局管理器
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗体关闭按钮的动作为退出
}
}
2.常用布局管理器 ——负责管理组件在容器中的排列方式
(1)FlowLayout流布局管理器
它的布局方式是首先在一行上排列组件,当该行没有足够的空间时,则换行显示,当容器的大小发生改变时,将自动调整组件的排列方式。
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class FlowLayout_example extends JFrame {
public FlowLayout_example() {
super("流布局示例");
setSize(250, 200);//设置窗体的大小
setDefaultCloseOperation(EXIT_ON_CLOSE);
FlowLayout f =new FlowLayout();
f.setAlignment(FlowLayout.LEFT);//设置组件的对齐方式,默认为居中显示组件
f.setHgap(30);//设置组件的水平间距
f.setVgap(30);//设计组件的垂直间距,水平和垂直间距默认为5像素
setLayout(f);//设置组件容器采用流布局管理器
JButton b=new JButton("按钮A");
add(b);
JButton bb=new JButton();
bb.setText("按钮B");
add(bb);
JButton bbb=new JButton("按钮C");
add(bbb);
}
public static void main(String args[]) {
FlowLayout_example ff=new FlowLayout_example();
ff.setVisible(true);
}
}
显示效果:
(左对齐)
(居中对齐)
(2)BorderLayout边界布局管理器
它的布局方式是将容器划分为5个部分。边界布局管理器为JFrame窗体的默认布局管理器,如图所示
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class BorderLayout_example extends JFrame {
public static void main(String args[]) {
BorderLayout_example frame = new BorderLayout_example();
frame.setVisible(true);
}
public BorderLayout_example() {
super("边界布局管理器示例"); // 继承父类的构造方法
setBounds(100, 100, 500, 375);
getContentPane().setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final BorderLayout bb = new BorderLayout(); // 创建边界布局管理器对象
bb.setHgap(10); // 设置组件的水平间距
bb.setVgap(10); // 设置组件的垂直间距,默认两间距为0像素
setLayout(bb); // 设置容器采用边界布局管理器
final JButton aButton = new JButton("按钮 A");
add(aButton, BorderLayout.NORTH); // 组件的显示位置为顶部
final JButton bButton = new JButton("按钮 B");
add(bButton, BorderLayout.WEST); // 左测
final JButton cButton = new JButton("按钮 C");
add(cButton, BorderLayout.CENTER);// 中间
final JButton dButton = new JButton("按钮 D");
add(dButton, BorderLayout.EAST); // 右侧
final JButton eButton = new JButton("按钮 E");
add(eButton, BorderLayout.SOUTH); // 底部
}
}
显示效果:
(3)GridLayout网格布局管理器
它的布局方式是将容器按照用户的设置平均划分成若干网,如下图所示。
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GridLayout_example extends JFrame {
public static void main(String args[]) {
GridLayout_example frame = new GridLayout_example();
frame.setVisible(true);
}
public GridLayout_example() {
super("网格布局管理器示例");
setBounds(100, 100, 300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final GridLayout gridLayout = new GridLayout(4, 0); // 创建网格布局管理器对象,参数为行数和列数
gridLayout.setHgap(10); // 设置组件的水平间距
gridLayout.setVgap(10); // 设置组件的垂直间距,两间距默认为0像素
setLayout(gridLayout); // 设置容器采用网格布局管理器
String[][] names = { { "1", "2", "3", "+" }, { "4", "5", "6", "-" },{ "7", "8", "9", "*" }, { ".", "0", "=", "/" } };
JButton[][] buttons = new JButton[4][4];
for (int row = 0; row < names.length; row++) {
for (int col = 0; col < names.length; col++) {
buttons[row][col] = new JButton(names[row][col]);// 创建按钮对象
add(buttons[row][col]);
}
}
}
}
显示效果:
(实现了计算器按键面板)
3.常 用 面 板
可以将面板添加到JFrame窗体中,也可以将子面板添加到上级面板中,然后将组件添加到面板中。通过使用面板,可以实现对所有组件进行分层管理,即对不同关系的组件采用不同的布局管理方式,使组件的布局更合理,使软件界面更美观。
(1)JPanel面板
首先将面板和组件添加到JFrame窗体中,然后再将子面板和组件添加到上级面板中,这样就可以向面板中添加无数个组件,并且通过对每个面板采用不同的布局管理器,真正解决众多组件间的布局问题。JPanel面板默认采用FlowLayout布局管理器。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class JPanel_Example extends JFrame {
public static void main(String args[]) {
JPanel_Example frame = new JPanel_Example();
frame.setVisible(true);
}
public JPanel_Example() {
super("计算器");
setResizable(false); // 设置窗体大小不可改变
setBounds(100, 100, 230, 230);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel viewPanel = new JPanel(); // 创建显示器面板,采用默认的流布局
getContentPane().add(viewPanel, BorderLayout.NORTH); // 将显示器面板添加到窗体顶部
JTextField textField = new JTextField(); // 创建文本显示器
textField.setEditable(false); // 设置显示器不可编辑
textField.setHorizontalAlignment(SwingConstants.RIGHT); //设置文本的水平对齐方式
textField.setColumns(18);
viewPanel.add(textField); // 将显示器添加到显示器面板中
final JPanel buttonPanel = new JPanel(); // 创建按钮面板
final GridLayout gridLayout = new GridLayout(4, 0);
gridLayout.setVgap(10);
gridLayout.setHgap(10);
buttonPanel.setLayout(gridLayout); // 按钮面板采用网格布局
getContentPane().add(buttonPanel, BorderLayout.CENTER); // 将按钮面板添加到窗体中间
String[][] names = { { "1", "2", "3", "+" }, { "4", "5", "6", "-" },
{ "7", "8", "9", "*" }, { ".", "0", "=", "/" } };
JButton[][] buttons = new JButton[4][4];
for (int row = 0; row < names.length; row++) {
for (int col = 0; col < names.length; col++) {
buttons[row][col] = new JButton(names[row][col]);// 创建按钮
buttonPanel.add(buttons[row][col]); // 将按钮添加到按钮面板中
}
}
final JLabel leftLabel = new JLabel(); // 创建左侧的占位标签
leftLabel.setPreferredSize(new Dimension(10, 0)); // 设置标签的宽度
getContentPane().add(leftLabel, BorderLayout.WEST); // 将标签添加到窗体左侧
final JLabel rightLabel = new JLabel(); // 创建右侧的占位标签
rightLabel.setPreferredSize(new Dimension(10, 0)); // 设置标签的宽度
getContentPane().add(rightLabel, BorderLayout.EAST); // 将标签添加到窗体右侧
}
}
总体思路: JFrame窗体采用边界布局,然后分别了创建一个显示器面板和按钮面板,并分别添加到JFrame窗体的顶部和中间;显示器面板采用默认的流布局,其中包含一个文本框组件;按钮面板采用网格布局,其中包含了16个按钮组件;在窗体的左右侧分别添加了一个标签组件,目的是使按钮和边框之间存在一定的距离。显示效果如下图:
(2)JScrollPane面板
JScrollPane类实现了一个带有滚动条的面板,用来为某些组件添加滚动条,例如JList和JTextArea组件。
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class JScrollPane_example extends JFrame {
public JScrollPane_example() {
super("滚动面板示例");
setResizable(false); // 设置窗体大小不可改变
setBounds(100, 100, 350, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建窗体的总的滚动面板
final JScrollPane frameScrollPane = new JScrollPane();
frameScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);//设置垂直滚动条的显示策略——一直显示
getContentPane().add(frameScrollPane); // 将窗体滚动面板添加到窗体中
//在窗体滚动面板上添加一个总的框架面板
final JPanel framePanel = new JPanel();
framePanel.setLayout(new BorderLayout());
frameScrollPane.setViewportView(framePanel);
//将框架面板的顶部放入类型面板
final JPanel typePanel = new JPanel();
framePanel.add(typePanel, BorderLayout.NORTH);
//文本面板中包含类别标签、滚动列表和一个占位空白标签
final JLabel typeLabel = new JLabel();
typeLabel.setText("类别:");
typePanel.add(typeLabel);
JScrollPane typeScrollPane = new JScrollPane(); // 创建用于JList组件的滚动面板
typeScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
typePanel.add(typeScrollPane);
String[] items = { "幽默短信类", "新年祝福短信类", "生日祝福短信类", "新婚祝福短信类" };
JList list = new JList(items);
list.setVisibleRowCount(3);//设置不滚动时可以看到的行数
typeScrollPane.setViewportView(list);
final JLabel label = new JLabel();
label.setPreferredSize(new Dimension(110, 0));
typePanel.add(label);
//将内容面板加入框架面板中
final JPanel contentPanel = new JPanel();
framePanel.add(contentPanel);
//内容面板包含了内容标签和文本滚动面板
final JLabel contentLabel = new JLabel();
contentLabel.setText("内容:");
contentPanel.add(contentLabel);
JScrollPane contentScrollPane = new JScrollPane();// 创建用于JTextArea组件的滚动面板
contentScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);//设置水平滚动条的显示策略——不显示
contentPanel.add(contentScrollPane);
JTextArea textArea = new JTextArea();
textArea.setRows(3);
textArea.setColumns(20);
textArea.setLineWrap(true); //设置为自动换行
contentScrollPane.setViewportView(textArea);
}
public static void main(String args[]) {
JScrollPane_example jj = new JScrollPane_example();
jj.setVisible(true);
}
}
显示效果: