java gui

目标:初步掌握swing组件的使用,指导什么是awt,swing,swt,JFace,掌握常用的布局管理器


GUI:Graphics User Interface


Sun公司已经提供了一个跨平台GUI开发工具包AWT,即抽象窗口工具集(Abstract Window Toolkit),这里面提供了很多类和接口,但是随着发展,出现了本地化的问题,在不同的系统运行界面效果不一样,所以SUN公司又创建了一个新的GUI框架swing,解决了awt存在的lcd问题。相当于awt的一次升级

IBM认为swing比较消耗内存,创建了一个新的GUI库,就是SWT,IBM为了方便开发SWT程序,在SWT基础上又创建了一个更易用,功能强大的图形包“JFace”。

我们主要学习swing。


快速入门


【1】JFrame是Frame的子类,属于容器类组件,顶层容器,有一些常用方法

//JFrame是一个顶层容器类,可以添加其它swing组件
JFrame jf = new JFrame();

//给窗体设置标题
jf.setTitle("坦克大战");
//设置大小,按像素计算宽与高,像素是个密度单位,不是长度单位
jf.setSize(300,300);
//显示窗体
jf.setVisible(true);
//设置初始位置
jf.setLocation(100,200);
//关闭窗口,程序结束运行(JVM也退出)
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

【2】JButton是AbstractButton的子类,属于容器类组件,可以加入别的组件,Swing包的按钮组件不只有JButton,还有单选按钮(JRadioButton),箭头按钮(BasicArrowButton),触发器按钮(JToggleButton)...


package com.zjz.gui;


import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicArrowButton;


public class Demo8_1 extends JFrame{
JButton jb1 = null;

public static void main(String[] args) {
Demo8_1 demo8_1 = new Demo8_1();
}

public Demo8_1() {
//JFrame是一个顶层容器类,可以添加其它swing组件
JButton jb1 = new JButton("确认");
BasicArrowButton bab = new BasicArrowButton(1);

//给窗体设置标题
this.setTitle("坦克大战");
//设置大小,按像素计算宽与高,像素是个密度单位,不是长度单位
this.setSize(300,300);
//显示窗体
this.setVisible(true);
//设置初始位置
this.setLocation(100,200);
//关闭窗口,程序结束运行(JVM也退出)
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//添加按钮
this.add(bab);
}


}


【3】布局管理器:组件在容器(比如JFrame)中的位置和大小是由布局管理器来决定的,所有的容器都会使用一个布局管理器,通过它来自动进行组件的布局管理。

种类:流式布局管理器(FlowLayout),边界布局管理器(BorderLayout),网格布局管理器(GridLayout),卡片布局管理器(GardLayout),网格包布局管理器(GridBagLayout),前三种是最常见的布局管理器

(1)BorderLayout将容器简单的划分为东南西北中5个区域,中间区域最大。这是JFrame窗体,JDialog对话框组件默认布局方法java gui_第1张图片

/**
 * BorderLayout案例
 * 1.集成JFrame  2.定义需要的各个组件  3.在构造函数中创建组件
 * 4.添加组件 5.对窗体进行设置
 */
package com.zjz.gui;


import java.awt.*;
import javax.swing.*;


public class Demo8_2 extends JFrame{
//定义组件
JButton jb1,jb2,jb3,jb4,jb5;

public Demo8_2() {
//创建组件
jb1 = new JButton("中部");
jb2 = new JButton("北部");
jb3 = new JButton("东部");
jb4 = new JButton("南部");
jb5 = new JButton("西部");
//添加各个组件
this.add(jb1,BorderLayout.CENTER);
this.add(jb2,BorderLayout.NORTH);
this.add(jb3,BorderLayout.EAST);
this.add(jb4,BorderLayout.SOUTH);
this.add(jb5,BorderLayout.WEST);
//设置窗体属性
this.setLocation(100,200);
this.setTitle("边界布局案例");
this.setSize(300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}

public static void main(String[] args) {
Demo8_2 demo8_2 = new Demo8_2();
}
}

不是五个部分必须添加,中部组件会自动调节大小


(2)流式布局FlowLayout

它不限制它所管理的组件大小,允许他们有最佳大小。当容器被缩放时,组件的位置可能变化,但是组件的大小不会变化。默认组件采用居中对齐方式,可以通过FlowLayout(int align)函数来改变,还可以禁止用户改变窗体大小 setResizable(false);


/**
 * 功能:流式布局案例
 */
package com.zjz.gui;


import java.awt.*;
import javax.swing.*;


public class Demo8_3 extends JFrame{


JButton jb1,jb2,jb3,jb4,jb5,jb6;

public Demo8_3() {
jb1 = new JButton("关羽");
jb2 = new JButton("张飞");
jb3 = new JButton("赵云");
jb4 = new JButton("马超");
jb5 = new JButton("黄忠");
jb6 = new JButton("魏延");

//设置布局管理器
this.setLayout(new FlowLayout(FlowLayout.LEFT));//默认居中对齐

this.add(jb1);
this.add(jb2);
this.add(jb3);
this.add(jb4);
this.add(jb5);
this.add(jb6);

this.setTitle("流式布局案例");
this.setSize(300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocation(0,0);
this.setVisible(true);
this.setResizable(false);//禁止用户改变窗体大小
}

public static void main(String[] args) {
Demo8_3 demo8_3 = new Demo8_3();
}
}


(3)网格布局GridLayout

将容器分割成多行多列,组件被填充到每个网格中,添加到容器中的组件首先放置在左上角的网格中,然后从左到右放置其它的组件,当占满该行后,接着继续在下一行从左到右放置组件

组件的相对位置不随容器的缩放而变化,但大小会变化,所有组件的大小相同

可以通过GridLayout(int rows,int cols,int hgap,int vgap)来指定网格的行/列,水平间隙/垂直间隙


(4)组合使用创建较为复杂的界面————————JPanel

它是面板组件,非顶层容器。一个界面只可以有一个JFrame窗体组件,但可以有多个JPanel面板组件,而JPanel上也可以使用FlowLayout,BorderLayout,GridLayout等各种布局管理器,这样可以组合使用达到较为复杂的布局效果。JPanel的布局默认为FlowLayout。

/**
 * 功能:多种布局管理器的使用
 */
package com.zjz.gui;


import java.awt.*;
import javax.swing.*;


public class Demo8_6 extends JFrame{

JPanel jp1,jp2;
JButton jb1,jb2,jb3,jb4,jb5,jb6;

public static void main(String[] args) {
Demo8_6 demo8_6 = new Demo8_6();
}

public Demo8_6() {
jp1 = new JPanel();
jp2 = new JPanel();
jb1 = new JButton("西瓜");
jb2 = new JButton("苹果");
jb3 = new JButton("荔枝");
jb4 = new JButton("葡萄");
jb5 = new JButton("桔子");
jb6 = new JButton("香蕉");

jp1.add(jb1);
jp1.add(jb2);
jp2.add(jb3);
jp2.add(jb4);
jp2.add(jb5);
this.add(jp1,BorderLayout.NORTH);
this.add(jp2,BorderLayout.SOUTH);
this.add(jb6,BorderLayout.CENTER);

this.setTitle("布局综合案例");
this.setSize(200,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocation(200,200);
this.setVisible(true);
}
}

(5)其它的一些常用控件:

例如文本框:JTextField

密码框:JPasswordField

标签: JLabel

/**
 * 功能:常用控件
 */
package com.zjz.gui;


import java.awt.*;
import javax.swing.*;


public class Demo8_7 extends JFrame{


JPanel jp1,jp2,jp3;
JLabel jl1,jl2;
JTextField jtf;
JPasswordField jpf;
JButton jb1,jb2;

public Demo8_7() {
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();

jl1 = new JLabel("用户名");
jl2 = new JLabel("密     码");

jb1 = new JButton("确定");
jb2 = new JButton("取消");

jtf = new JTextField(10);//10为宽度
jpf = new JPasswordField(10);

this.setLayout(new GridLayout(3,1));
this.add(jp1);
this.add(jp2);
this.add(jp3);

jp1.add(jl1);jp1.add(jtf);
jp2.add(jl2);jp2.add(jpf);
jp3.add(jb1);jp3.add(jb2);

this.setTitle("常用控件");
this.setSize(200,200);
this.setLocation(200,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}

public static void main(String[] args) {
Demo8_7 demo8_7 = new Demo8_7();
}
}

再比如:单选框JRadioButton  复选框JCheckBox

同一组单选按钮必须先创建ButtonGroup,然后把单选框组件放入到ButtonGroup中,但是在JPanel中添加控件时并不是添加ButtonGroup,而还是一个个添加JRadioButton


package com.zjz.gui;


import java.awt.*;
import javax.swing.*;


public class Demo8_8 extends JFrame{

JPanel jp1,jp2,jp3;
JLabel jl1,jl2;
ButtonGroup bg;
JRadioButton jrb1,jrb2;
JCheckBox jcb1,jcb2,jcb3;
JButton jb1,jb2;


public static void main(String[] args) {
Demo8_8 demo8_8 = new Demo8_8();
}

public Demo8_8() {
jp1 = new JPanel();jp2 = new JPanel();jp3 = new JPanel();
jl1 = new JLabel("你喜欢的运动");jl2 = new JLabel("你的性别");
jb1 = new JButton("注册用户");jb2 = new JButton("取消注册");
jcb1 = new JCheckBox("足球");jcb2 = new JCheckBox("篮球");jcb3 = new JCheckBox("网球");
jrb1 = new JRadioButton("男");jrb2 = new JRadioButton("女");
bg = new ButtonGroup();
bg.add(jrb1);bg.add(jrb2);

this.setLayout(new GridLayout(3,1));

jp1.add(jl1);jp1.add(jcb1);jp1.add(jcb2);jp1.add(jcb3);
jp2.add(jl2);jp2.add(jrb1);jp2.add(jrb2);
jp3.add(jb1);jp3.add(jb2);

this.add(jp1);
this.add(jp2);
this.add(jp3);

this.setSize(300,150);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}



以上基本实现了简单的登录和注册界面,我们常常还用到用户调查界面,如下图:这个时候我们就会用到:

下拉框组件(JComboBox),列表框组件(JList),滚动窗格组件(JScrollPane)

一般来说,列表框组件+滚动窗格组件是结合使用的,目的是让列表框中的选项可以有滚动条支持

package com.zjz.gui;

import java.awt.*;
import javax.swing.*;

public class Demo8_9 extends JFrame{
JPanel jp1,jp2;
JLabel jl1,jl2;
JComboBox jcb1;
JList jlist;
JScrollPane jsp;

public static void main(String[] args) {
Demo8_9 demo8_9 = new Demo8_9();
}

public Demo8_9() {
jp1 = new JPanel();
jp2 = new JPanel();

jl1 = new JLabel("你的籍贯");
jl2 = new JLabel("旅游地点");

String[] jg = {"北京","上海","天津","重庆"};
jcb1 = new JComboBox(jg);

String[] dd = {"九寨沟","故宫","长城","天安门"};
jlist = new JList(dd);

jlist.setVisibleRowCount(2);
jsp = new JScrollPane(jlist);

this.setLayout(new GridLayout(2,1));

jp1.add(jl1);
jp1.add(jcb1);
jp2.add(jl2);
jp2.add(jsp);

this.add(jp1);this.add(jp2);
this.setSize(300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}


java gui_第2张图片



你可能感兴趣的:(java gui)