Java图形界面GUI

GUI(Graphical User Interface) 即图形用户界面,它能够是应用程序看上去更加友好,Java语言之所以会如此流行的一个主要原因也是因为它支持GUI。

AWT简介

1.在Java的早起版本中,GUI组件由名为AWT(Abstract Window Toolkit,抽象窗口工具包)的标准库来提供。除了GUI组件外,AWT还包括其他功能来支持图像绘画、处理剪切/复制类型的数据传送,以及其他的相关操作。

2.java.awt包是Java内置的包,属于Java基础类库(JFC)的一部分,其中包括丰富的界面组件、布局管理器、事件处理模型、图形和图像工具等等。


AWT组件的类体系结构


AWT的缺点:AWT组件最大的缺陷就是它依赖于操作系统,也就是说AWT程序运行在不同的操作系统上会有不同的外观和行为,这一点对于Java的平台无关性来讲,是不忍直视的。


Swing简介

1.Swing组件是在AWT组件上发展而来的轻量级组件,与AWT相比不但改进了用户界面,而且所需的系统资源更少。

2.Swing是纯Java组件,使得应用程序在不同的平台上运行时具有相同的外观和相同的行为。


注:上图中蓝色的组件是java.awt包中的对象。


常用的Swing组件

1.javax.swing.JFrame

 JFrame组件常用于在Swing程序中创建窗体,常用构造方法:

//创建新窗体,该窗体初始为不可见
JFrame()
//创建新窗体,使用参数title指定标题,该窗体初始为不可见
JFrame(String title)
常用的方法:

//设置窗体的标题,标题内容由参数title指定
void setTitle(String title)
//设置窗体的大小,参数width指定宽度,参数height指定高度,单位为像素
void setSize(int width, int height)
//设置窗体能否调整大小,由参数resizable
void setResizable(boolean resizable)
//设置窗体是否可见,由参数b决定,true为可见,false为不可见
void setVisible(boolean b)
//获取当前窗体的内容面板
Container getContentPane()
//设置窗体在关闭时默认执行的操作
void setDefaultCloseOperation(int operation)
//释放当前窗体及其所有子组件所占用的资源,即卸载窗体
void dispose()
//重新绘制当前窗体
void repaint()

注:对于类似于窗体这样的容器组件,我们一般自定义一个类,继承于JFrame类,然后将窗体中的子组件作为类中成员进行声明,以方便操作:

public class MyFrame extends JFrame
	{
				……
	}
注:容器组件是指可以容纳其他组件的组件。


2.javax.swing.JButton

在Swing程序中,按钮可能是使用量最大的组件之一,JButton则是用来创建按钮的,JButton类的常用构造方法:

//创建一个按钮
JButton()
//创建一个带文本的按钮
JButton(String text)
//创建一个带图标的按钮
JButton(Icon icon)
//创建一个带文本和图标的按钮
JButton(String text, Icon icon)


JButton的常用方法:

//设置按钮上的文本
void setText(String text)
//获取按钮上的文本
String getText()
//设置按钮的背景颜色
void setBackground(Color bg)
//获取按钮的背景颜色
Color getBackground()
//设置启用(或禁用)按钮,由参数b来决定
void setEnabled(boolean b)
//设置按钮是否为可见,由参数b决定
void setVisible(boolean b)
//设置按钮的悬停提示信息
void setToolTipText(String text)
//设置按钮的快捷键
void setMnemonic(int mnemonic)

3.javax.swing.JLabel 

最简单的Swing组件之一,用于在窗体上显示标签,JLabel既可以显示文本,也可以显示图像,JLabel中常用的构造方法:

//创建一个空的标签
JLabel()
//创建一个带文本的标签
JLabel(String text)
//创建一个带文本的标签,并指定其对齐方式,可以是JLabel.LEFT、JLabel.CENTER和JLabel.RIGHT
JLabel(String text, int ha)
//设置一个带图像的标签
JLabel(Icon image)
//设置一个代图像的标签,并指定其对齐方式
JLabel(Icon image, int ha)
//创建一个带文本和图像的标签并指定其对齐方式
JLabel(String text, Icon image, int ha)

JLabel常用的方法:

//设置标签上的文本
void setText(String text)
//获取标签上的文本
String getText()
//设置标签的图像
void setIcon(Icon icon)
//获取标签的图像
Icon getIcon()
//设置标签中文本的对齐方式
void setHorizontalAlignment(int alignment)
//设置标签是否为可见
void setVisible(boolean b)

4.javax.swing.JTextField

JTextField是文本框组件,主要是用来接收用户的输入,JTextField类常用的构造方法有:

//创建一个空的文本框
JTextField()
//创建一个带文本的文本框
JTextField(String text)
//创建一个指定列数的文本框
JTextField(int columns)
//创建一个带文本,并指定列数的文本框
JTextField(String text, int columns)

JTextField常用的方法:

//设置文本框中的文本
void setText(String text)
//获取文本框中的文本
String getText()
//设置文本框中文本的对齐方式,可以是JTextField.LEFT、JTextField.CENTER、JTextField.RIGHT
void setHorizontalAlignment(int alignment)
//设置文本框是否可以编辑
void setEditable(boolean b)
//设置启用(或禁用)文本框
void setEnabled(boolean enabled)
//设置文本框是否为可见
void setVisible(boolean b)


布局管理器

用户界面上的组件可以按照不同的方式进行排列,例如:水平排列,或者是按网络方式进行排序,这样就需要通过布局管理器来管理这些组件,布局管理器是一组实现了java.awt.LayoutManager接口的类,由这些类自动定位组件,三种基本的布局管理器为:

1.FlowLayout——流式布局


2.BorderLayout——边界布局


3.GridLayout——网格布局


注:框架默认的布局是BorderLayout,所以在框架中想要使用BorderLayout,可以不进行指定,直接使用即可,JPanel默认的布局是FlowLayout即流式布局。


java.swing.JPanel

JPanel提供面板组件,它是轻量级的容器组件,面板中可以添加其他组件,也可以设置布局,我们一般用面板来实现布局嵌套,JPanel常用的构造方法:

//创建一个空面板
JPanel()
//创建一个带有指定布局的面板
JPanel(LayoutManaer layout)
JPanel常用的方法:

//设置面板的背景颜色,由参数bg指定颜色
void setBackground(Color bg)
//设置面板的布局,参数是布局管理器
void setLayout(LayoutManager mgr)
//往面板中添加一个组件
Component add(Component comp)
//将指定的组件添加到面板的指定位置上
Component add(Component comp, int index)
//从面板中移除指定的组件
void remove(Component comp)
//从面板中移除所有的组件
void removeAll()
//重新绘制当前面板
void repaint()

下面我们通过一个案例来深入体会这些组件,先来看看效果:


程序代码:

/**
 * 猜数字游戏界面
 * 
 * @author Liao
 *
 */
public class GuessNum extends JFrame {

	// 文本输入框
	private JTextField jTextField;
	// 标签
	private JLabel jLabel;

	// 在构造函数中初始化相关组件
	public GuessNum() {
		// 创建文本框
		jTextField = new JTextField();
		// 创建标签
		jLabel = new JLabel("请输入一个1000以内的整数");
		
		//设置面板的布局为BorderLayout,其实可以不指定,因为框架默认的布局就是BorderLayout
		this.setLayout(new BorderLayout());
		//组合成我们想要的布局,把文本框放在北边
		this.add(jTextField, BorderLayout.NORTH);
		//把标签放在中部
		this.add(jLabel,BorderLayout.CENTER);
		//把自定义的面板类放在南部
		this.add(new SouthPanel(),BorderLayout.SOUTH);
		
		//设置窗体框架的基本属性
		this.setSize(500,300);//设置窗体的大小
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置当窗体关闭的操作时,程序结束
		this.setLocationRelativeTo(null);//设置窗体居中显示
		this.setVisible(true);//设置窗体可显示
	}

	/**
	 * 创建一个内部类来封装南部的相关组件
	 * @author Liao
	 */
	public class SouthPanel extends JPanel {
		
		//"猜"按钮
		private JButton guess;
		//"重新来过按钮"
		private JButton restart;
		//"退出游戏"按钮
		private JButton exit;
		
		//在构造函数中初始化相关组件
		public SouthPanel() {
			//创建"猜"按钮
			guess = new JButton("猜");
			//创建"重新来过"按钮
			restart = new JButton("重新来过");
			//创建"退出游戏按钮"
			exit = new JButton("退出游戏");
			
			//因为JPanel的默认布局为FlowLayout即流式布局,我们要指定其为GridLayout即网格布局
			this.setLayout(new GridLayout(1,3));
			//把按钮添加到JPanel中
			this.add(guess);
			this.add(restart);
			this.add(exit);
		}
		
	}
	
	

	public static void main(String[] args) {

		//直接创建窗体对象即可
		GuessNum frame = new GuessNum();
	}
}


猜数字游戏实现:

/**
 * 猜数字游戏实现
 * 
 * @author Liao
 *
 */
public class GuessNum extends JFrame {

	// 文本输入框
	private JTextField jTextField;
	// 标签
	private JLabel jLabel;

	// 在构造函数中初始化相关组件
	public GuessNum(int random) {
		// 创建文本框
		jTextField = new JTextField();
		// 创建标签
		jLabel = new JLabel("请输入一个1000以内的整数");
		
		//设置面板的布局为BorderLayout,其实可以不指定,因为框架默认的布局就是BorderLayout
		this.setLayout(new BorderLayout());
		//组合成我们想要的布局,把文本框放在北边
		this.add(jTextField, BorderLayout.NORTH);
		//把标签放在中部
		this.add(jLabel,BorderLayout.CENTER);
		//把自定义的面板类放在南部
		this.add(new SouthPanel(random),BorderLayout.SOUTH);
		
		//设置窗体框架的基本属性
		this.setSize(500,300);//设置窗体的大小
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置当窗体关闭的操作时,程序结束
		this.setLocationRelativeTo(null);//设置窗体居中显示
		this.setVisible(true);//设置窗体可显示
	}

	/**
	 * 创建一个内部类来封装南部的相关组件
	 * 实现按钮的监听事件
	 * @author Liao
	 */
	public class SouthPanel extends JPanel implements ActionListener{
		
		//"猜"按钮
		private JButton guess;
		//"重新来过按钮"
		private JButton restart;
		//"退出游戏"按钮
		private JButton exit;
		//中奖数字
		private int random;
		
		//在构造函数中初始化相关组件
		public SouthPanel(int random) {
			this.random = random;
			//创建"猜"按钮
			guess = new JButton("猜");
			//创建"重新来过"按钮
			restart = new JButton("重新来过");
			//创建"退出游戏按钮"
			exit = new JButton("退出游戏");
			
			//因为JPanel的默认布局为FlowLayout即流式布局,我们要指定其为GridLayout即网格布局
			this.setLayout(new GridLayout(1,3));
			//把按钮添加到JPanel中
			this.add(guess);
			this.add(restart);
			this.add(exit);
			
			//设置按钮的监听事件
			guess.addActionListener(this);
			restart.addActionListener(this);
			exit.addActionListener(this);
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			//获取监听事件的源
			JButton btn = (JButton) e.getSource();
			
			//判断源,然后处理监听事件
			if (btn == guess){
				//判断用户输入数字的大小
				System.out.println("====>"+random);
				if (Integer.parseInt(jTextField.getText()) > random){
					jLabel.setText("老兄,你猜的数字太大啦!");
					jTextField.setText("");
				} else if (Integer.parseInt(jTextField.getText()) < random){
					jLabel.setText("老兄,你猜的数字太小啦!");
					jTextField.setText("");
				} else {
					jLabel.setText("老兄,恭喜你中奖啦!");
					//使按钮失效
					guess.setEnabled(false);
				}
			} else if (btn == restart){
				//随机生成一个1000内的数字
				random = (int) (Math.random()*1000);
				//设置标签
				jLabel.setText("请输入一个1000以内的整数");
				//使得"猜"按钮有效
				guess.setEnabled(true);
			} else if (btn == exit){
				
				System.exit(0);
			}
		}
		
	}
	
	

	public static void main(String[] args) {

		//产生一个随机数
		int random = (int) (Math.random()*1000);
		//直接创建窗体对象即可
		GuessNum frame = new GuessNum(random);
	}
}



  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值