目录
一、swing特点
二、swing包
2.1、 继承关系
三、常用swing组件概述
三、常用窗体
3.1、JFrame窗体
3.1.1、JFrame常用的构造方法
3.1.2、有两种生成方式
3.2、JDialog窗体
四、标签组件与图标
4.1、 标签的使用
4.2、JLabel标签的构造方法
五、图标的使用
六、常用布局管理器
6.1、绝对布局
6.2、流布布局管理器 Flowlayout
6.3、边界布局管理器 BorderLayout
6.4、网格布局管理器 GridLayout
七、常用面板
7.1、Jpanel面板
7.2、JScrollPane面板
八、按钮组件
8.1、提交按钮组件
8.2、单选按钮组件
8.3、复选框组件
8.4、列表组件
8.4.1、下拉列表框组件
8.1.2、列表框组件
8.5、文本组件
8.6、密码框组件
8.7、文本域组件
九、常用事件监听器
9.1、监听事件简介
9.2、动作事件监听器
9.3、焦点事件监听器
Java.lang.object类
Java.awt.Component类
java.awt.Container类
Java.swing.JComponent类
JFrame()无参数
JFrame(String title) title JFrame的名字
private static final long serialVersionUID = 1L;
serialversionUID作用: 相当于Java的身份证,主要用于版本控制序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
private static final long serialVersionUID = xxxxL;
当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个提示功能告诉你去定义 。在Eclipse中点击类中warning的图标一下,Eclipse就会自动给定两种生成的方式。如果不想定义它,在Eclipse的设置中也可以把它关掉的,设置如下:
Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==>Potential programming problems
private static final long serialVersionUID = 1L;//java的身份证,用于版本的控制;版本升级时反序列化仍保持对象的唯一性
public void CreateJFrame(String title){//定义有参数的构造方法
JFrame jf = new JFrame(title);//实例化一个JFrame对象
Container container = jf.getContentPane();//获取一个容器
JLabel jl = new JLable("这是一个JFrame窗体");//创建一个JLabel标签
//使标签上的文字居中
j1.setHorizontalAlignment(SwingConstants.CENTER);
container.add(jl);//将标签添加到容器中
container.setBackground(Color.white);//设置容器的背景颜色
jf.setVisible(true);//使窗体可视
jf.setsize(200,150);//设置窗体大小
//设置窗体关闭方式
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
//在main函数(主方法)中调用构造方法
new Example1().CreateJFrame("JFrame窗体");
JDialog窗体在使用时也需要调用getContentPane()方法将窗体转化为容器,然后在容器中设置窗体的特性
常用的JDialog构造方法
案例:
//用于Java的版本的控制,版本升级时反序列化扔能保持对象的唯一性
private static final long serialVersionUID1 =6500071369070027256l;
//创建一个无参数的MyJDialog()方法
public MyJDialog(){
/*调用基类中的某一个构造函数,一般是构造函数的第一行
*
* 设置父类窗体 窗体的标题 确定是model对话框
* */
super(new MyFrame(),"第一个JDialog窗体",true);
//调用getContentPane()方法将窗体转化为容器
Container container = getContentPane();
//创建一个JLabel标签
container.add(new JLabel("这是一个对话框"));
//设置窗体大小
setSize(100,100);
}
public static void main(String[] args) {
new MyJDialog();
}
class MyFrame extends JFrame{
private static final long serialVersionUID = -1337786324275247741L;
public MyFrame(){
Container container = getContentPane();
//布局显示为null 当布局显示为null 需要设置窗体的显示位置
container.setLayout(null);
JLabel j1 = new JLabel("这是一个JFrame窗体");
/*设置对齐方式
* JLabel标签提供的两种对齐方式
* #j1.setHorizontalAlignment 设置水平对齐方式;
* 三个参数
* SwingConstants.LEFT:左对齐;(默认值,也就是不设置时则左对齐)
* ¨ SwingConstants.CENTER:居中对齐;
* ¨ SwingConstants.RIGHT:右对齐;
*
* #setVerticalAlignment:设置垂直对齐方式;
* 三个参数
* ¨ SwingConstants.TOP:向上对齐;
* ¨ SwingConstants.CENTER:居中对齐;(默认值,也就是不设置时居中对齐)
* ¨ SwingConstants.BOTTOM:向下对齐;
* */
j1.setHorizontalAlignment(SwingConstants.CENTER);
//将标签添加JDialog到窗体中
container.add(j1);
//创建以按钮
JButton b1 = new JButton("弹出对话框");
//设置窗体的显示位置
b1.setBounds(10,10,100,21);
//使用内部类 中的匿名类 使MyJDialog窗体可见
b1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
new MyJDialog().setVisible(true);
}
});
//将按钮添加到窗体中
container.add(b1);
//设置窗体的颜色
container.setBackground(Color.white);
//设置窗体的大小
setSize(200,200);
//设置窗体的关闭方式
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//使窗体可见
setVisible(true);
}
}
public class DrawIcon implements Icon {
private int width;
private int height;
@Override//实现getIconHeight()方法
public int getIconHeight() {
// TODO 自动生成的方法存根
return this.height;
}
@Override//实现getIconWidth()
public int getIconWidth() {
// TODO 自动生成的方法存根
return this.width;
}
//定义构造方法
public DrawIcon(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){
//调用DrawIcon类
DrawIcon icon = new DrawIcon(15,15);
//创建一个标签,并设置标签上的文字在标签正中间
JLabel j = new JLabel("测试",icon,SwingConstants.CENTER);
//创建一个JFrame窗体
JFrame jf = new JFrame();
//
Container c = jf.getContentPane();
//把JLabel标签添加到窗体中
c.add(j);
jf.setSize(100,100);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
}
public class MyImageIcon extends JFrame{
private static final long serialVersionUID = 1L;
public MyImageIcon() {
Container container = getContentPane();
// 创建一个标签
JLabel jl = new JLabel("这是一个JFrame窗体", JLabel.CENTER);
// 获取图片所在的URL
URL url = MyImageIcon.class.getResource("imageButton.jpg");
Icon icon = new ImageIcon(url); // 实例化Icon对象
jl.setIcon(icon); // 为标签设置图片
// 设置文字放置在标签中间
jl.setHorizontalAlignment(SwingConstants.CENTER);
jl.setOpaque(true); // 设置标签为不透明状态
container.add(jl); // 将标签添加到容器中
setSize(250, 100); // 设置窗体大小
setVisible(true); // 使窗体可见
// 设置窗体关闭模式
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String args[]) {
new MyImageIcon(); // 实例化MyImageIcon对象
}
}
硬性指定组件在容器中的位置和大小,通过绝对坐标的方式来实现
绝对布局的步骤:
1.使用Container.setLayout(null);方法取消布局管理器
2.使用Component.setBounds();方法设置每个组件的大小和位置
以窗体中的按钮为例 当该变窗体大小是,窗体中的按钮大写位置都不会发生变化,这就是绝对布局
FlowLayout类中具有以下常用的构造方法
public Flowlayout()
public FlowLayout(int alignment)
public FlowLayout(int alignment,int horizGap,intvertGap)
在alignment参数表示使用流布局管理器后组件在每一行的具体摆放位置
public class FlowLayoutPosition extends JFrame{
private static final long serialVersionUID = -1337786324275247741L;
public FlowLayoutPosition(){
setTitle("本窗体为流布局管理器");//设置流布局管理器的标题
Container c = getContentPane(); //获取一个Container容器
setLayout(new FlowLayout(2,10,10));//设置布局管理器 为流布管理器
for(int i =0;i<10;i++){
c.add(new JButton("button"+i));
}
setSize(300,200);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
new FlowLayoutPosition();
}
}
区域的控制可由BorderLayout类中的成员变量来决定,这些成员变量的具体含义如下:
public class BorderLayoutPosition extends JFrame{
//用于Java的版本控制,与反序列化
private static final long serialVersionUID =1L;
//创建一个数组用于划分5个区域
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 BorderLayoutPosition(){
//设置窗体的标题
setTitle("这个是边界布局管理理器");
//获取一个Container容器
Container c =getContentPane();
//设置布局方式
setLayout(new BorderLayout());
//遍历数组
for( int i=0;i
public class GridLayoutPosition extends JFrame{
/**
*
*/
private static final long serialVersionUID = -2960135100920888650L;
public GridLayoutPosition(){
//获取一个Container容器
Container c = getContentPane();
//设置布局方式 7行3列
setLayout(new GridLayout(7,3,5,5));
//创建20个按钮
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 GridLayoutPosition();
}
}
固定的面板
public class JPanetest extends JFrame {
private static final long serialVersionUID=1L;
public JPanetest(){
Container c= getContentPane();
//将容器设置成2行1列的网格布局
c.setLayout(new GridLayout(2,1,10,10));
//初始化JPanel
JPanel p1 = new JPanel(new GridLayout(1,5,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"));
p4.add(new JButton("6"));
p4.add(new JButton("7"));
p3.add(new JButton("8"));
p3.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 JPanetest();
}
}
带滚动条的面板
JScrollPane是一个容器,只能放置一个组件,并且不可以使用布局管理器 如果需要添加多个组件,需要将多个组件放置在JPanel面板上,然后将JPane面板作为一个整体添加到JScrollPane组件上
public class JScrollPaneTest extends JFrame{
private static final long serialVersionUID =1L;
//定义构造函数
public JScrollPaneTest(){
//获取一个容器
Container c = getContentPane();
//定义一个行为20列为50的文本域
JTextArea ta = new JTextArea(20,50);
//将文本域添加到JScrollPane容器中
JScrollPane sp = new JScrollPane(ta);
//将面板添加到Container容器中
c.add(sp);
//设置Container容器的名字
setTitle("带滚动条条的文字编译器");
setSize(200,200);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
new JScrollPaneTest();
}
}
Swing中的提交按钮由JButton对象,其结构方法主要有:
public class JButtonTest extends JFrame {
private static final long serialVersionUID = 1L;
//定义一个无参数的JButtonTest方法
public JButtonTest(){
//获取图片路径
URL url = JButtonTest.class.getResource("imageButton.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);
//把按钮添加到容器中
c.add(J);
if(i%2==0){
//设置其中一些按钮不可用
J.setEnabled(false);//设置按钮可用或不可用 false不可用 true可用
}
}
//实例化一个没有图片文字的按钮
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(150,150);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String args[]){
new JButtonTest();
}
}
JToggleButton类是AbstractButton类的子类,所以单选按钮的诸多方法都是AbstractButton类中的方法
复选框在Swing组件中使用十分广泛,它具有一个方块图标,外加一段描述性文字。
每一个复选框都有两个选择状态,选择 不选择 两种状态 复选框由JCheckBox类的对象表示,它继承于AbstractButton类,所以复选框组件的属性设置来源于AbstractButton类
public class CheckBoxTest 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 CheckBoxTest(){
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 CheckBoxTest();
}
}
Swing中的下拉列表框不仅可以从中选择项目,同时也提供用户编辑项目中的内容 下拉列表框时一个带条状的显示区,它具有下拉功能,在下拉列表框的右方存在一个倒三角的按钮,当用户点击该按钮,
下拉列表会以列表形式显示出来
public class JComboBoxModelTest extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
JComboBox jc = new JComboBox<>(new MyComboBox());
JLabel jl = new JLabel("请选择证件:");
public JComboBoxModelTest() {
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 JComboBoxModelTest();
}
}
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;
}
}
public class JListTest extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
public JListTest() {
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 JListTest();
}
}
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;
}
}
文本框组件
文本框组件用来显示或编辑一个单行文本,在Swing中通过javax.swing.JTextField类对象创建,该类继承 javax.swing.text.JTextComponet类
文本组件的构造方法
public class JTextFieldTest extends JFrame{
/**
*
*/
private static final long serialVersionUID = 1L;
public JTextFieldTest(){
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 JTextFieldTest();
}
}
构造方法
public JPasswordField()
public JPasswordField(String text)
public JPasswordField(int fieldwidth)
public JPasswordField(String text,int fieldwidth)
public JPasswordField(Document docModel,String text,int fieldWidth)
Swing中任何一个文本区域都是JTextArea类型的对象,JTextArea常用的构造方法
动作事件(ActionEvent)监听器是Swing中比较常见的事件监听器,很多组件动作都会使用它监听,如按钮被按下
焦点事件FocusEvent 监听器在实际项目开发中应用也比较广泛,如将光标焦点离开一个文本框是需要弹出一个对话框,或者将焦点返回给该文本框等
public class focusEventTest extends JFrame {
private static final long serialVersionUID =1L;
public focusEventTest(){
setSize(250,100);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container cp = getContentPane();
cp.setLayout(new FlowLayout());
final JLabel jlabel = new JLabel();
getContentPane().add(jlabel);
JTextField jt = new JTextField("清单击其他文本框",10);
JTextField jt2 = new JTextField("清单击我",10);
cp.add(jt);
cp.add(jt2);
jt.addFocusListener(new FocusListener(){
//组件获取焦点的调用方法
@Override
public void focusGained(FocusEvent arg0) {
// TODO 自动生成的方法存根
}
//组件失去焦点的调用方法
@Override
public void focusLost(FocusEvent arg0) {
// TODO 自动生成的方法存根
JOptionPane.showMessageDialog(null,"文本失去焦点");
}
});
setVisible(true);
}
public static void main(String[] args) {
new focusEventTest();
}
}