一.Swing包
java.awt.Component-Container-JComponent
在Swing组件中大多数GUI组件都是Component类的直接子类或间接子类,JComponent类是Swing组件各种特性的存放位置。在Swing组件中最重要的父类是Container类,而Container类有两个最重要的子类:java.awt.Window和java.awt.Frame. 顶层父类是Component类和Container类,所以java关于窗口组件的编写,都与组件以及容器的概念相关联。
以下列举了常见的Swing组件:
JButton 代表Swing按钮,按钮可以带一些图片或文字
JCheckBox 代表Swing中的复选框组件
JComBox 代表下拉列表框
JFrame 代表Swing的框架类
JDialog 代表Swing版本的对话框
JLabel 代表Swing中的标签
JRadioButton 代表Swing中的单选按钮
JList 代表能在用户界面中显示一系列条目的组件
JTextField 代表文本框
JPasswordField 代表密码框
JTextArea 代表Swing中的文本区域
JOptionPane 代表Swing中的一些对话框
二.常见窗体
1.JFrame窗体
JFrame窗体是一个容器,它是Swing程序中各个组件的载体。
java为窗体关闭提供了多种方式,常用的有以下4种: DO_NOTHING_ON_CLOSE: 窗体退出方式是什么都不做就把窗体关闭; DISPOSE_ON_CLOSE: 代表任何注册监听程序对象后会自动隐藏并释放窗体; HIDE_ON_CLOSE:表示隐藏窗口的默认窗口关闭; EXIT_ON_CLOSE:表示退出应用程序默认窗口关闭。
package hello;
import java.awt.*;
import javax.swing.*;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
// 定义一个类继承JFrame类
public void CreateJFrame(String title) { // 定义一个CreateJFrame()方法
JFrame jf = new JFrame(title); // 实例化一个JFrame对象
Container container = jf.getContentPane(); // 获取一个容器
JLabel jl = new JLabel("这是一个JFrame窗体"); // 创建一个JLabel标签
jl.setHorizontalAlignment(SwingConstants.CENTER);// 使标签上的文字居中
container.add(jl); // 将标签添加到容器中
container.setBackground(Color.gray);// 设置容器的背景颜色
jf.setVisible(true); // 使窗体可视
jf.setSize(200, 150); // 设置窗体大小
// 设置窗体关闭方式
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String args[]) {// 在主方法中调用createJFrame()方法
new Example().CreateJFrame("创建一个JFrame窗体");
}
}
2.JDialog窗体
同JFrame窗体类似,在使用时也需要调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的特性。
在应用程序中创建JDialog窗体需要实例化JDialog类,通常使用以下JDialog类的构造方法。
public JDialog(Frame f,String title,boolean model) : 创建一个指定窗口、标题、模式的对话框。
package hello;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MyJDialog extends JDialog { // 创建新类继承JDialog类
private static final long serialVersionUID = 1L;
public MyJDialog(Example frame) {
// 实例化一个JDialog类对象,指定对话框的父窗体、窗体标题和类型
super(frame, "第一个JDialog窗体", true);
Container container = getContentPane(); // 创建一个容器
container.add(new JLabel("这是一个对话框")); // 在容器中添加标签
setBounds(120, 120, 100, 100); // 设置对话框窗体大小
}
}
public class Example extends JFrame { // 创建新类
private static final long serialVersionUID = 1L;
public static void main(String args[]) {
new Example(); // 实例化MyJDialog类对象
}
public Example() {
Container container = getContentPane(); // 创建一个容器
container.setLayout(null);
JLabel jl = new JLabel("这是一个JFrame窗体"); // 在窗体中设置标签
jl.setHorizontalAlignment(SwingConstants.CENTER);// 将标签的文字置于标签中间位置
container.add(jl);
JButton bl = new JButton("弹出对话框"); // 定义一个按钮
bl.setBounds(10, 10, 100, 21);
bl.addActionListener(new ActionListener() { // 为按钮添加鼠标单击事件
public void actionPerformed(ActionEvent e) {
new MyJDialog(Example.this).setVisible(true);
}
});
container.add(bl); // 将按钮添加到容器中
container.add(bl);
container.setBackground(Color.white);
setSize(200, 200);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setVisible(true);
}
}
三.标签组件与图标
1.标签
public JLabel(String text,Icon icon,int aligment): 创建一个带文本、带图标的JLabel对象,并设置标签内容的水平对齐方式。
2.图标的使用
(1)创建图标
public void paintIcon(Component arg(),Graphics arg1,int arg2,int arg3)
package hello;
import java.awt.*;
import javax.swing.*;
public class Example implements Icon { // 实现Icon接口
private int width; // 声明图标的宽
private int height; // 声明图标的长
public int getIconHeight() { // 实现getIconHeight()方法
return this.height;
}
public int getIconWidth() { // 实现getIconWidth()方法
return this.width;
}
public Example(int width, int height) { // 定义构造方法
this.width = width;
this.height = height;
}
// 实现paintIcon()方法
public void paintIcon(Component arg0, Graphics arg1, int x, int y) {
arg1.fillOval(x, y, width, height); // 绘制一个圆形
}
public static void main(String[] args) {
Example icon = new Example(15, 15);
// 创建一个标签,并设置标签上的文字在标签正中间
JLabel j = new JLabel("测试", icon, SwingConstants.CENTER);
JFrame jf = new JFrame();
Container c = jf.getContentPane();
c.add(j);
jf.setSize(250, 250);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
}
(2)使用图片图标
ImageIcon类常用的构造方法:
public ImageIcon(Image image,String description) :这个描述不会在图标上显示,可以使用getDescription()方法获取这个描述。
public ImageIcon(URL url) : 该构造方法利用位于计算机网络上的图像文件创建图标。
package hello;
import java.awt.*;
import java.net.*;
import javax.swing.*;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
public Example() {
Container container = getContentPane();
// 创建一个标签
JLabel jl = new JLabel("这是一个JFrame窗体", JLabel.CENTER);
// 获取图片所在的URL
URL url = Example.class.getResource("/img/a1.jpg");
Icon icon = new ImageIcon(url); // 实例化Icon对象
jl.setIcon(icon); // 为标签设置图片
// 设置文字放置在标签中间
jl.setHorizontalAlignment(SwingConstants.CENTER);
jl.setOpaque(true); // 设置标签为不透明状态
container.add(jl); // 将标签添加到容器中
setSize(400, 300);
setVisible(true);
// 设置窗体关闭模式
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String args[]) {
new Example(); // 实例化MyImageIcon对象
}
}
四.常见布局管理器
1.绝对布局
绝对布局,也就是硬性指定组件在容器中的位置和大小,使用绝对坐标的方式来指定组件的位置。
(1)使用Container.setLayout(null)方法取消布局管理器。
(2)使用Component.setBounds()方法设置每个组件的大小与位置
import java.awt.*;
import javax.swing.*;
public class AbsolutePosition extends JFrame {
private static final long serialVersionUID = 1L;
public AbsolutePosition() {
setTitle("本窗体使用绝对布局"); // 设置该窗体的标题
setLayout(null); // 使该窗体取消布局管理器设置
setBounds(0, 0, 200, 150); // 绝对定位窗体的位置与大小
Container c = getContentPane(); // 创建容器对象
JButton b1 = new JButton("按钮1"); // 创建按钮
JButton b2 = new JButton("按钮2"); // 创建按钮
b1.setBounds(10, 30, 80, 30); // 设置按钮的位置与大小
b2.setBounds(60, 70, 100, 20);
c.add(b1); // 将按钮添加到容器中
c.add(b2);
setVisible(true); // 使窗体可见
// 设置窗体关闭方式
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new AbsolutePosition();
}
}
2.流布局
管理器
即像“流”一样从左向右摆放组件,直到占据这一行的所有空间,然后再向下移动一行。
FlowLayout类中常用的构造方法: public FlowLayout(int alignment,int horizGap,int vertGap);
alignment参数表示组件在每一行的具体摆放位置。
FlowLayout.LEFT=0;(左对齐)FlowLayout.CENTER=0;(居中) FlowLayout.RIGHT=2;(右对齐)
package hello;
import java.awt.*;
import javax.swing.*;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
public Example() {
setTitle("本窗体使用流布局管理器"); // 设置窗体标题
Container c = getContentPane();
// 设置窗体使用流布局管理器,使组件右对齐,并且设置组件之间的水平间隔与垂直间隔
setLayout(new FlowLayout(2, 10, 10));
for (int i = 0; i < 10; i++) { // 在容器中循环添加10个按钮
c.add(new JButton("button" + i));
}
setSize(300, 200); // 设置窗体大小
setVisible(true); // 设置窗体可见
// 设置窗体关闭方式
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
new Example();
}
}
3.边界布局管理器
BorderLayout.CENTER 在容器中添加组件时,组件置于中间开始填充,直到与其他组件边界连接; BorderLayout.NORTH 组件置于顶端 BorderLayout.SOUTH 组件置于底端
BorderLayout.WEST组件置于左端 BorderLayout.EAST组件置于右端
package hello;
import java.awt.*;
import javax.swing.*;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
// 定义组件摆放位置的数组
String[] border = { BorderLayout.CENTER, BorderLayout.NORTH,
BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.EAST };
String[] buttonName = { "center button", "north button", "south button",
"west button", "east button" };
public Example() {
setTitle("这个窗体使用边界布局管理器");
Container c = getContentPane(); // 定义一个容器
setLayout(new BorderLayout()); // 设置容器为边界布局管理器
for (int i = 0; i < border.length; i++) {
// 在容器中添加按钮,并设置按钮布局
c.add(border[i], new JButton(buttonName[i]));
}
setSize(350, 200); // 设置窗体大小
setVisible(true); // 使窗体可视
// 设置窗体关闭方式
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
new Example();
}
}
4.网格布局管理器
每个组件的大小都相同,改变窗口的大小,组件的大小也会随之改变。常见的构造方法 public GridLayout(int rows,int columns,int horizGap,int vertGap);//代表网格的行数、列数、指定网格之间的水平间距、垂直间距。
package hello;
import java.awt.*;
import javax.swing.*;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
public Example() {
Container c = getContentPane();
// 设置容器使用网格布局管理器,设置7行3列的网格
setLayout(new GridLayout(7, 3, 5, 5));
for (int i = 0; i < 20; i++) {
c.add(new JButton("button" + i)); // 循环添加按钮
}
setSize(300, 300);
setTitle("这是一个使用网格布局管理器的窗体");
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Example();
}
}
五.常用面板
1.JPanel面板
package hello;
import java.awt.*;
import javax.swing.*;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
public Example() {
Container c = getContentPane();
// 将整个容器设置为2行1列的网格布局
c.setLayout(new GridLayout(2, 1, 10, 10));
// 初始化一个面板,设置1行3列的网格布局
JPanel p1 = new JPanel(new GridLayout(1, 3, 10, 10));
JPanel p2 = new JPanel(new GridLayout(1, 2, 10, 10));
JPanel p3 = new JPanel(new GridLayout(1, 2, 10, 10));
JPanel p4 = new JPanel(new GridLayout(2, 1, 10, 10));
p1.add(new JButton("1")); // 在面板中添加按钮
p1.add(new JButton("1"));
p1.add(new JButton("2"));
p1.add(new JButton("3"));
p2.add(new JButton("4"));
p2.add(new JButton("5"));
p3.add(new JButton("6"));
p3.add(new JButton("7"));
p4.add(new JButton("8"));
p4.add(new JButton("9"));
c.add(p1); // 在容器中添加面板
c.add(p2);
c.add(p3);
c.add(p4);
setTitle("在这个窗体中使用了面板");
setSize(420, 200);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
new Example();
}
}
2.JScrollPane面板
package hello;
import java.awt.*;
import javax.swing.*;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
public Example() {
Container c = getContentPane(); // 创建容器
JTextArea ta = new JTextArea(20, 50); // 创建文本区域组件
JScrollPane sp = new JScrollPane(ta); // 创建JScrollPane面板对象
c.add(sp); // 将该面板添加到该容器中
setTitle("带滚动条的文字编译器");
setSize(300, 300);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
new Example();
}
}
六.按钮组件
1.提交按钮组件
用JButton对象表示,构造方法 public JButton( String text,Icon icon);
package hello;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
public Example() {
URL url = Example.class.getResource("/img/imageButtoo.jpg");
Icon icon = new ImageIcon(url);
setLayout(new GridLayout(3, 2, 5, 5)); // 设置网格布局管理器
Container c = getContentPane(); // 创建容器
for (int i = 0; i < 5; i++) {
// 创建按钮,同时设置按钮文字与图标
JButton J = new JButton("button" + i, icon);
c.add(J); // 在容器中添加按钮
if (i % 2 == 0) {
J.setEnabled(false); // 设置其中一些按钮不可用
}
}
JButton jb = new JButton(); // 实例化一个没有文字与图片的按钮
jb.setMaximumSize(new Dimension(90, 30)); // 设置按钮与图片相同大小
jb.setIcon(icon); // 为按钮设置图标
jb.setHideActionText(true);
jb.setToolTipText("图片按钮"); // 设置按钮提示为文字
jb.setBorderPainted(false); // 设置按钮边界不显示
jb.addActionListener(new ActionListener() { // 为按钮添加监听事件
public void actionPerformed(ActionEvent e) {
// 弹出确认对话框
JOptionPane.showMessageDialog(null, "弹出对话框");
}
});
c.add(jb); // 将按钮添加到容器中
setTitle("创建带文字与图片的按钮");
setSize(350, 150);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String args[]) {
new Example();
}
}
2.单选按钮组件
单选按钮
public JRadioButton(String text,Icon icon,boolean selected);
按钮组
JRadioButton jr1=new JRadioButton();
JRadioButton jr2=new JRadioButton();
JRadioButton jr3=new JRadioButton();
group.add(jr1);
group.add(jr2);
group.add(jr3);
3.复选框组件
JCheckBox 常见的构造方法: public JCheckBox(String text,Boolean checked);
package hello;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel panel1 = new JPanel();
private JPanel panel2 = new JPanel();
private JTextArea jt = new JTextArea(3, 10);
private JCheckBox jc1 = new JCheckBox("1");
private JCheckBox jc2 = new JCheckBox("2");
private JCheckBox jc3 = new JCheckBox("3");
public Example() {
Container c = getContentPane();
setSize(200, 160);
setVisible(true);
setTitle("复选框的使用");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
c.setLayout(new BorderLayout());
c.add(panel1, BorderLayout.NORTH);
final JScrollPane scrollPane = new JScrollPane(jt);
panel1.add(scrollPane);
c.add(panel2, BorderLayout.SOUTH);
panel2.add(jc1);
jc1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (jc1.isSelected())
jt.append("复选框1被选中\n");
}
});
panel2.add(jc2);
jc2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (jc2.isSelected())
jt.append("复选框2被选中\n");
}
});
panel2.add(jc3);
jc3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (jc3.isSelected())
jt.append("复选框3被选中\n");
}
});
}
public static void main(String[] args) {
new Example();
}
}
七.列表组件
1.下拉列表框组件
ComboBoxModel为接口,它代表一般模型,可以自定义一个类实现该接口,然后在初始化JComboBox对象时向上转型为ComboBoxModel接口类型, 还可以继承AbstractListModel类。
package hello;
import java.awt.*;
import javax.swing.*;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
JComboBox jc = new JComboBox<>(new MyComboBox());
JLabel jl = new JLabel("请选择证件:");
public Example() {
setSize(new Dimension(160, 180));
setVisible(true);
setTitle("在窗口中设置下拉列表框");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Container cp = getContentPane();
cp.setLayout(new FlowLayout());
cp.add(jl);
cp.add(jc);
}
public static void main(String[] args) {
new Example();
}
}
class MyComboBox extends AbstractListModel implements ComboBoxModel {
/**
*
*/
private static final long serialVersionUID = 1L;
String selecteditem = null;
String[] test = { "身份证", "军人证", "学生证", "工作证" };
public String getElementAt(int index) {
return test[index];
}
public int getSize() {
return test.length;
}
public void setSelectedItem(Object item) {
selecteditem = (String) item;
}
public Object getSelectedItem() {
return selecteditem;
}
public int getIndex() {
for (int i = 0; i < test.length; i++) {
if (test[i].equals(getSelectedItem()))
return i;
}
return 0;
}
}
2.列表框组件
package hello;
import java.awt.*;
import javax.swing.*;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
public Example() {
Container cp = getContentPane();
cp.setLayout(null);
JList jl = new JList<>(new MyListModel());
JScrollPane js = new JScrollPane(jl);
js.setBounds(10, 10, 100, 100);
cp.add(js);
setTitle("在这个窗体中使用了列表框");
setSize(200, 150);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String args[]) {
new Example();
}
}
class MyListModel extends AbstractListModel {
private static final long serialVersionUID = 1L;
private String[] contents = { "列表1", "列表2", "列表3", "列表4", "列表5", "列表6" };
public String getElementAt(int x) {
if (x < contents.length)
return contents[x++];
else
return null;
}
public int getSize() {
return contents.length;
}
}
八.文本组件
1.文本框组件
package hello;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Example extends JFrame{
private static final long serialVersionUID = 1L;
public Example(){
setSize(250,100);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Container cp=getContentPane();
getContentPane().setLayout(new FlowLayout());
final JTextField jt=new JTextField("aaa",20);
final JButton jb=new JButton("清除");
cp.add(jt);
cp.add(jb);
jt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
// TODO 自动生成方法存根
jt.setText("触发事件");
}
});
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
jt.setText("");
jt.requestFocus();
}
});
setVisible(true);
}
public static void main(String[] args) {
new Example();
}
}
2.密码框组件
JPasswordField jp=new JPasswordField();
jp.setEchoChar('#'); //设置回显字符
3.文本域组件
package hello;
import java.awt.*;
import javax.swing.*;
public class Example extends JFrame{
private static final long serialVersionUID = 1L;
public Example(){
setSize(200,100);
setTitle("定义自动换行的文本域");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Container cp=getContentPane();
JTextArea jt=new JTextArea("文本域",6,6);
jt.setLineWrap(true);//可以自动换行
cp.add(jt);
setVisible(true);
}
public static void main(String[] args) {
new Example();
}
}