JavaSE13—窗体程序开发(中)
1、 布局方式
1) 绝对布局
硬性指定组件在容器中的位置和大小。窗体,面板等容器都可以采用绝对布局的方式。
步骤:
使用Container.setLayout(null)方式取消布局管理器。
使用Component.setBounds()方法来设置每个组件的大小与位置
注意:绝对布局在不同的平台上可能会出现组件重叠的问题。
实例1:使用绝对布局,创建一个登录窗口
package qijia.si;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class EntryFrame extends JFrame {
private JTextField passWordTextField;
private JTextField nameTextField;
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
try{
EntryFrame frame = new EntryFrame();
frame.setVisible(true);
}catch(Exception e){
e.printStackTrace();
}
}
});
}
public EntryFrame(){
super();
getContentPane().setLayout(null); //设置为绝对布局
setBounds(100,100,321,188);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel panel = new JPanel();
panel.setLayout(null);
panel.setBounds(0,0,316,154);
getContentPane().add(panel);
final JLabel name = new JLabel();
name.setFont(new Font("微软雅黑",Font.PLAIN,12));
name.setText("用户名:");
name.setBounds(62,27,52,26);
panel.add(name);
nameTextField = new JTextField();
nameTextField.setBounds(120,30,129,22);
panel.add(nameTextField);
final JLabel passWord = new JLabel();
passWord.setFont(new Font("微软雅黑",Font.PLAIN,12));
passWord.setText("密码:");
passWord.setBounds(65,55,44,18);
panel.add(passWord);
passWordTextField = new JTextField();
passWordTextField.setBounds(120,58,129,22);
panel.add(passWordTextField);
final JButton entry = new JButton();
entry.setText("登录");
entry.setBounds(84,104,64,28);
panel.add(entry);
final JButton cancel = new JButton();
cancel.setText("取消");
cancel.setBounds(170,104,64,28);
panel.add(cancel);
}
}
2) 窗口默认的边界布局
该布局管理器将组件布局排列在东,西,南,北,中5个区域,每个区域可以放置一个组件,也可以在指定区域中放置包含其他组件的容器。
定义边界布局管理器
BorderLayout实现的是边界布局管理器。通过容器的setLayout()方法设置布局管理器,setLayout方法有一个参数,就是布局管理器实例对象,因此使用此边界布局管理器必须先创建它的实例对象。
BorderLayout() 该构造方法用于创建默认的边界布局管理器,这个布局管理器在各个区域的水平和垂直方向没有设置组件间距。
BorderLayout(hgap,vgap) 接收两个整数类型,用以设置管理器的水平和垂直方向的间距。
应用边界布局
应用边界布局管理器,首先必须调用容器的setLayout()方法设置该容器使用边界布局管理器,然后调用容器Container类的add()方法添加组件时可以设置此组件的布局区域。
实例:使用边界布局,实现在窗体中添加东西南北四个按钮。
package qijia.si;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class BorderTest extends JFrame{
public BorderTest(){
setTitle("边界布局管理器测试");
setBounds(100,100,300,200);
JButton northButton = new JButton("北");
JButton southButton = new JButton("南");
JButton westButton = new JButton("西");
JButton eastButton = new JButton("东");
JButton centerButton = new JButton("中");
Container panel = getContentPane();
panel.add(northButton,BorderLayout.NORTH);
panel.add(southButton,BorderLayout.SOUTH);
panel.add(westButton, BorderLayout.WEST);
panel.add(eastButton,BorderLayout.EAST);
panel.add(centerButton,BorderLayout.CENTER);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args){
BorderTest test = new BorderTest();
test.setVisible(true);
}
}
3) 网格布局
网格布局管理器可以将组件以网格的形式排列起来,使用网格布局,容器被分成大小相等的矩形,每个矩形区域中可以放置一个组件,就像表格中的单元格一样整齐的排列。
创建网格布局管理器
GridLayout类表示网格布局管理器,容器通过setLayout()方法,将GridLayout作为对象,可将容器设置为网络布局的形式。
实例:使用网络布局,将窗体容器使用3*3的网络布局管理器,并在窗体中添加按钮
package qijia.si;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Font;
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.WindowConstants;
public class GridLayoutTest extends JFrame{
public GridLayoutTest(){
setTitle("边界布局管理器实例");
setBounds(100,100,300,200);
JButton[] buttons = new JButton[9];
Container panel = getContentPane();
panel.setLayout(new GridLayout(3,3));
for(int i = 0;i<9;i++){
buttons[i] = new JButton("按钮"+(i+1));
panel.add(buttons[i]);
}
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args){
GridLayoutTest gridLayout = new GridLayoutTest();
gridLayout.setVisible(true);
}
}
4) 流式布局
流式布局是最基本得布局管理器,使用流式布局的容器按指定方向摆放组件。
实例:创建窗体,采用流式布局的形式排放控件,采用居中对齐的方式。
package qijia.si;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
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.WindowConstants;
public class FlowTest extends JFrame{
public FlowTest(){
setTitle("本窗口使用流布局管理器");
Container c = getContentPane();
getContentPane().setLayout(
new FlowLayout(FlowLayout.CENTER,10,10)
);
for(int i=0;i<10;i++){
c.add(new JButton("按钮"+i));
}
setSize(300,200);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args){
FlowTest flowTest = new FlowTest();
}
}
2.基本控件
1) 标签控件
标签控件用于显示文本或提示信息,支持文本字符串和图标。
JLabel的构造方法:
JLabel() 创建一个既无内容又无图像的标签
JLabel(String text) 创建一个有文本内容的标签
JLabel(String textr, int horizontalAlignment) 创建一个具有文本内容且水平显示的标签
JLabel(Icon icon)创建一个具有图像内容的标签
。。。
2) 普通按钮控件
在Swing中JButton表示按钮控件。常用构造方法:
JButton(String text) 创建一个带有文本标识的按钮
JButton(Icon icon) 创建一个带有图像标识的按钮
JButton(String text,Icon icon) 创建一个既有文本又有图像的按钮
实例:创建窗体,实现在窗体中添加“查看”与“帮助”两个按钮,在按钮上还添加图片
package qijia.si;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class JbuttonDemo extends JFrame{
public static void main(String[] args){
JbuttonDemo frame = new JbuttonDemo();
frame.setVisible(true);
}
public JbuttonDemo(){
super();
setTitle("按钮实例");
ImageIcon editIcon = new ImageIcon(getClass().getResource("watch.png"));
ImageIcon delIcon = new ImageIcon(getClass().getResource("help.png"));
getContentPane().setLayout(new FlowLayout());
setBounds(100,100,215,74);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton okButton = new JButton("查看",editIcon);
JButton delButton = new JButton();
getContentPane().add(okButton);
delButton.setIcon(delIcon);
delButton.setText("帮助");
getContentPane().add(delButton);
}
}
3) 单选按钮控件
JRadioButton组件实现了一个单选按钮。JRadioButton可以单独使用,也可以与ButtonGroup类联合使用。
实例:创建框体,在窗体中创建3个单选按钮,并将这3个按钮添加到同一个按钮组中,设置第一个单选按钮初试为选中状态。
package qijia.si;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class JRadioMemo extends JFrame{
public JRadioMemo(){
super();
setTitle("单选按钮示意");
ButtonGroup group =new ButtonGroup();
getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
setBounds(100,100,230,87);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JRadioButton rb = new JRadioButton();
group.add(rb);
rb.setText("优秀");
getContentPane().add(rb);
JRadioButton rb_1 = new JRadioButton("良好",true);
group.add(rb_1);
getContentPane().add(rb_1);
JRadioButton rb_2 = new JRadioButton("及格");
group.add(rb_2);
getContentPane().add(rb_2);
}
public static void main(String[] args){
JRadioMemo JRM = new JRadioMemo();
JRM.setVisible(true);
}
}
4) 复选框控件
JCheckBox类实现了一个复选框。
实例:创建窗体,在窗体中定义复选框组件,用户可以选择多个。
package qijia.si;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class CheckBoxDemo extends JFrame{
public CheckBoxDemo(){
super();
getContentPane().setLayout(null);
setBounds(100,100,310,103);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JCheckBox cb0 = new JCheckBox();
cb0.setBounds(10,34,64,26);
cb0.setText("上网");
getContentPane().add(cb0);
JCheckBox cb1 =new JCheckBox("旅游");
cb1.setBounds(84,35,64,26);
getContentPane().add(cb1);
JCheckBox cb2 = new JCheckBox("看书");
cb2.setBounds(158,34,64,26);
getContentPane().add(cb2);
JCheckBox cb3 = new JCheckBox("听歌");
cb3.setBounds(232,34,64,26);
getContentPane().add(cb3);
final JLabel label = new JLabel();
label.setText("你的爱好是: ");
label.setBounds(10, 10, 91, 18);
getContentPane().add(label);
}
public static void main(String[] args){
CheckBoxDemo Demo1 = new CheckBoxDemo();
Demo1.setVisible(true);
}
}