1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Java | GUI 图形用户界面

Java | GUI 图形用户界面

时间:2024-04-27 01:16:39

相关推荐

Java | GUI 图形用户界面

一、什么是GUI

GUI 全称Graphical User Interface 图形用户界面,指采用图形方式显示的计算机操作用户界面。软件以图形界面形式运行时,用户可借助于菜单、按钮、标签等组件和通过鼠标、键盘等的操作共同完成对软件的应用。

当程序运行后,出现的图形窗口,称为程序的界面。界面上可能有输入框、输入区、 菜单项、按钮等各种图形组件。

当用户通过键盘往输入区域输入内容后回车 或 用鼠标点击了一些可以被点击的组件以后,程序可以产生我们预期的合理响应或结果,称为事件处理。

二、Java如何设计编写GUI

从大的方面看,GUI设计就可分为“界面设计”“事件处理”两部分。

1.导入相应包

使用图形组件类和容器类进行 GUI 设计时,需要引入相应的包或者类。 在 Java 中,能够实现图形用户界面的类库有两个:java.awtjavax.swing

(1)java.awt

称为抽象窗口工具库 AWT(Abstract Windows Toolkit)AWT 包中的类是用来处理图形的最基本的方式,它是Sun 公司早期所推出和使用的图形组件包。 其中的组件包含基本 GUI 组件类容器类布局管理类事件处理类基本图形类五种。 AWT 包中的组件被认为是重量级组件,AWT 在实际运行中是调用所在平台的图形系统,它们依赖于本地系统来支持绘图与显示,其运行速度慢效果差,系统相关性较强。

(2)javax.swing

是 Java 基础类库 JFC(Java Foundation Classes)的组成部分,它提供了一套功能更强、数量更多、更美观的图形用户界面组件。 Swing 组件名称和 AWT 组件名称基本相同,但以 J 开头,例如 AWT 按钮类的名称是 Button,在 Swing中的名称则是 JButton。 Swing 包可以认为是 AWT 包的升级。它不仅拥有几倍于 AWT 包的用户界面组件,而且同样的组件,Swing 包中的组件往往可设置属性更多,功能更强大丰富。 Swing 组件通常被称为轻量级组件。采用 MVC(模型-视图-控制)的设计范式,使程序员可以根据不同的操作系统来选择不同的外观。Swing 组件完全是用 Java 代码实现的,可以跨平台,使用 Swing 组件的程序在 Mac、Windows 或 Unix 平台上的观感都一样。 [注意] 程序设计过程中最好不要混用 Swing 组件和 AWT 组件,虽然有时候也可以同时用,但有可能在视觉效果和响应上造成不稳定隐患。

2.界面设计

一个GUI界面上可能有输入框、输入区、菜单项或者按钮等各种图形组件。界面设计即对展示给用户的这些部件的格式,位置,大小进行设计。

界面是需要有载体的。而“容器”是所有组件或容器的载体,是图形用户界面设计的基础。图形用户界面上所有的元素都要装载在容器中。

(1)容器 (Container)

容器是 Java 图形界面开发包中的系统类,它们只是一类比较特殊的图形组件。它们在数量上基本上就只有几个。设计界面时,先要定义“容器”对象作为载体,然后定义按钮、输入框之类的普通图形界面组件对象,把这些组件对象添加(调用容器对象的 add 方法)到容器上,才能构成界面。

(2)布局

把这些组件放到容器上去之后,按什么样的格局、什么样的顺序摆放,属于容器的“布局”问题。“布局”是对容器而言的,是对放置到容器内的组件的一种位置约束。给任何一种容器对象设置布局的方法都是调用该容器对象的 setLayout 方法,该方法需要带相应的布局类对象作为参数。

Container.setLayout(布局类对象)

常用布局类对象:

另外还有 BoxLayout(盒式布局)、GridBagLayout(网格包布局)等不常用布局。

(3)顶层容器

顶层容器顾名思义,就是最大的用来容纳其他组件的组件。只有顶层容器可以独立的显示出来,其他容器需要放在顶层容器中才能显示出来。

JFrame (框架) -构造一个初始不可见的新窗口

部分方法:

例:

import javax.swing.*;/*** @name 鷾*/public class FrameCase {public static void main(String[] args){JFrame frame = new JFrame();// 窗口是否可见frame.setVisible(true);// 设置窗体大小frame.setSize(400,450);// 设置关闭操作frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗体在屏幕上的位置frame.setLocationRelativeTo(null);// 设置窗口标题frame.setTitle("框架标题");}}

效果:

JDialog (对话框) -对话框也是一个窗体,但没有最大化、最小化按钮部分方法:例:

import javax.swing.JDialog;import java.awt.*;/*** @name 鷾*/public class DialogCase {public static void main(String[] args){JDialog dialog = new JDialog((Frame) null, "对话框名称");// 设置窗体大小dialog.setSize(300, 150);// 设置默认关闭操作为:关闭时退出dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);// 设置窗体在屏幕上的位置dialog.setLocation(100, 100);// 设置窗体是否显示dialog.setVisible(true);}}

效果:

(4)中间容器

中间层容器是一种可以放到顶层容器上的组件,它可以把顶层容器进行进一步的区域划分以设计所需格局的界面。中间层容器也必须添加到顶层容器中才会启作用,否则显示不出来。

(5)普通组件

普通组件包括按钮、输入框、标签等。普通组件在定义之后,需要 container.add() 的方法添加到容器中,这样在GUI界面中才会显示。

Container.add(普通组件名);

部分类型:

例:

package TestCode;/*** @name 鷾*/import javax.swing.*;import java.awt.*;public class Calculator extends JFrame {private final Container container = getContentPane();public Calculator(){container.setLayout(null);setContent();setWindow();}private void setWindow(){this.setVisible(true); //窗口可见this.setSize(400,450); //窗口大小this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //窗口可关闭this.setLocationRelativeTo(null); //窗口居中this.setTitle("简易计算器"); //窗口标题}private void setContent(){/* 标签 */JLabel jLabel1 = new JLabel("计算器");jLabel1.setBounds(140,30,100,50);jLabel1.setFont(new Font("楷体",Font.PLAIN,20));JLabel jLabel2 = new JLabel("运算数一");jLabel2.setBounds(60,70,100,50);jLabel2.setFont(new Font("楷体",Font.PLAIN,20));JLabel jLabel3 = new JLabel("运算数二");jLabel3.setBounds(60,110,100,50);jLabel3.setFont(new Font("楷体",Font.PLAIN,20));JLabel jLabel4 = new JLabel("运算结果");jLabel4.setBounds(60,150,100,50);jLabel4.setFont(new Font("楷体",Font.PLAIN,20));/* 文本域 */JTextField jTextField1 = new JTextField(20);jTextField1.setBounds(170,80,150,30);JTextField jTextField2 = new JTextField(20);jTextField2.setBounds(170,120,150,30);JTextField jTextField3 = new JTextField(20);jTextField3.setBounds(170,160,150,30);/* 按钮 */JButton jButton1 = new JButton("相加");jButton1.setBounds(80,220,80,40);jButton1.setFont(new Font("楷体",Font.PLAIN,20));JButton jButton2 = new JButton("相减");jButton2.setBounds(220,220,80,40);jButton2.setFont(new Font("楷体",Font.PLAIN,20));JButton jButton3 = new JButton("清零");jButton3.setBounds(120,300,140,40);jButton3.setFont(new Font("楷体",Font.PLAIN,20));container.add(jLabel1);container.add(jLabel2);container.add(jLabel3);container.add(jLabel4);container.add(jTextField1);container.add(jTextField2);container.add(jTextField3);container.add(jButton1);container.add(jButton2);container.add(jButton3);}public static void main(String[] args){new Calculator();}}

效果:

(6)界面设计步骤

定义顶层容器对象调用容器对象的 setLayout 方法给容器设置一种布局定义普通图形组件调用容器对象add 方法将普通图形组件添加到容器上

2.事件处理

(1)事件处理

上面的界面设计后,鼠标点击按钮或者是在文本框中输入内容,界面是没有任何反应的。这是因为我们仅仅完成了界面的外表,还有界面的内核即事件处理需要我们编写。

事件处理是当用户与程序之间交互时,触发程序产生对应效果的具体事件处理代码。事件一般分为用户事件系统事件,通常关注比较多的是用户事件。 典型的交互如:用户移动鼠标、单击鼠标,点击按钮、点击下拉列表框或选项卡、在文本框中输入内容后回车、点击菜单项或关闭图形窗口等。

(2)Java 事件处理机制

Java 事件处理的机制是产生一个事件的对象必须设定其事件处理的监听者对象(Listener)。首先定义该对象的监听者。当事件发生时,监听者便会依据事件的类型来执行相应的程序。

监听器实际上是接口,在接口中定义了事件发生时可调用的、必须要实现的方法。每一种事件类,对应要实现的接口。每个接口,又有一个或多个方法必须要被实现(即接口被implements 时的语法要求)。这些方法中的代码,就是对应的事件的具体的处理代码

组件通过addActionListener的方法添加需要的监听器。

组件名.addActionListener(监听器对象);如:jButton.addActionListener(new Event());

Java.awt.event 包中按照不同的事件类型定义了 11 个监听器接口,每类事件都有对应的事件监听器。 由于接口一般要求实现许多方法,并不是所有方法我们都是需要的,但按照 Java 语法规则,接口必须实现其所有的方法,因此不需要响应具体事件的方法体的代码为空即可。同时为了简化,java 为一些接口统一提供事件适配器(Adapter)。事件适配器是抽象类。通过继承事件适配器,重写需要的方法,不要的方法可以不写。Java.awt.event 包中提供了的主要适配器包括:

(3)事务处理步骤

注册监听器接口,让可能产生事件的组件对事件进行监听实现接口中所有的方法(这些方法就是具体进行事件处理的代码)

(4)事务处理案例

Case_1:产生GUI界面后,每点击一次按钮后,操作台输出 “按钮事件处理的测试” 的信息。

import java.awt.event.*;import javax.swing.*;public class Case_1 {JFrame jFrame = new JFrame("按钮事件处理");JButton jButton = new JButton("测试按钮");public Case_1() {// addActionListener,对其可能发生的点击事件(EventListener类型对象表示)进行监听// 调用其监听方法jButton.addActionListener(new EventListener());// 添加组件jFrame.add(jButton);// 容器jFrame设置为可见jFrame.setVisible(true);// 设置窗体大小jFrame.setSize(400, 450);// 设置窗体在屏幕上的位置jFrame.setLocationRelativeTo(null);//窗口可关闭jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String args[]) {new Case_1();}}class EventListener implements ActionListener {/* 实现ActionListener接口的actionPerformed(ActionEvent e)方法,由参数e接收事件信息,然后对传入的事件信息进行处理。*/public void actionPerformed(ActionEvent e) {System.out.println("按钮事件处理的测试"); // 点击一次按钮后,操作台输出 “按钮事件处理的测试” 的信息}}

Case_2:案例2和案例1功能上是一样的,但是采用了另一种代码形式。

import java.awt.event.*;import javax.swing.*;public class Case_2 {//在定义类的同时,就implements监听器接口JFrame jFrame = new JFrame("按钮事件处理");JButton jButton = new JButton("测试按钮");public Case_2() {// addActionListener,对其可能发生的点击事件(EventListener类型对象表示)进行监听//对按钮myButton,调用其监听方法jButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("按钮事件处理的测试"); // 点击一次按钮后,操作台输出 “按钮事件处理的测试” 的信息}});// 添加组件jFrame.add(jButton);// 容器jFrame设置为可见jFrame.setVisible(true);// 设置窗体大小jFrame.setSize(400, 450);// 设置窗体在屏幕上的位置jFrame.setLocationRelativeTo(null);//窗口可关闭jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String args[]) {new Case_2();}}

Case_3:

案例3和案例1功能上是一样的,但是采用匿名new ActionListener()的方法。

import java.awt.event.*;import javax.swing.*;public class Case_3 {JFrame jFrame = new JFrame("按钮事件处理");JButton jButton = new JButton("测试按钮");public Case_3() {// addActionListener,对其可能发生的点击事件(EventListener类型对象表示)进行监听// 采用匿名new ActionListener()的方法jButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("按钮事件处理的测试"); // 点击一次按钮后,操作台输出 “按钮事件处理的测试” 的信息}});// 添加组件jFrame.add(jButton);// 容器jFrame设置为可见jFrame.setVisible(true);// 设置窗体大小jFrame.setSize(400, 450);// 设置窗体在屏幕上的位置jFrame.setLocationRelativeTo(null);//窗口可关闭jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {new Case_3();}}

Case_4:

产生GUI界面后,每点击一次按钮后,文本框类显示“你点击了这个按钮·-·”的字样。

import java.awt.FlowLayout;import java.awt.event.*;import javax.swing.*;public class Case_4 {JFrame jFrame = new JFrame("一个按钮事件处理的例子");JButton jButton = new JButton("请点击我");JTextField jTextField = new JTextField(10);public Case_4() {//对按钮myButton,调用其监听方法jButton.addActionListener(new MyEvent(jTextField));jFrame.setLayout(new FlowLayout());// 添加组件jFrame.add(jButton);jFrame.add(jTextField);// 容器jFrame设置为可见jFrame.setVisible(true);//让容器jFrame上的组件在程序运行之后就直接全部显示出来jFrame.pack();// 设置窗体在屏幕上的位置jFrame.setLocationRelativeTo(null);//窗口可关闭jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {new Case_4(); //产生一个匿名对象,让程序运行起来。}}class MyEvent implements ActionListener {JTextField jTextField;public MyEvent(JTextField jTextField) {this.jTextField = jTextField;}public void actionPerformed(ActionEvent e) {jTextField.setText("你点击了这个按钮·-·");}}

Case_5:文本框(JTextField)对象的使用及事件处理学生姓名查询,文本框输入学号001、002、003,显示对应姓名。代码形式与案例2类似。

import java.awt.FlowLayout;import java.awt.event.*;import javax.swing.*;public class Case_5 implements ActionListener{JFrame jFrame;JTextField jTextField1, jTextField2;public Case_5() {jTextField1 = new JTextField(20);jTextField2 = new JTextField(20);// 将jTextField2对象设置为不可编辑jTextField2.setEditable(false);// 调用其监听方法jTextField1.addActionListener(this);jFrame = new JFrame();// 添加组件jFrame.add(jTextField1);jFrame.add(jTextField2);// 设置布局jFrame.setLayout(new FlowLayout());// 设置为可见jFrame.setVisible(true);// 设置窗体大小jFrame.setSize(400, 100);// 设置窗体在屏幕上的位置jFrame.setLocationRelativeTo(null);// 设置窗口标题jFrame.setTitle("学生姓名查询");//窗口可关闭jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}// 实现接口中的方法,进行具体的事件处理public void actionPerformed(ActionEvent evt) {/* 当用户往 jTextField1 中输入 black 并且按回车*/if ((evt.getSource() == jTextField1) && (jTextField1.getText().equals("001"))) {jTextField1.setText(""); // 把第一个输入框清空jTextField2.setText("Tom"); // 第二个输入框显示black的电话号码}/* 当用户往 jTextField1 中输入 smith 并且按回车*/else if ((evt.getSource() == jTextField1) && (jTextField1.getText().equals("002"))) {jTextField1.setText("");jTextField2.setText("Tony");}else if ((evt.getSource() == jTextField1) && (jTextField1.getText().equals("003"))) {jTextField1.setText("");jTextField2.setText("Janny");}/* 当输入的不是其中任何一个人时 */else {jTextField1.setText("");jTextField2.setText("Can’t find his(her)");}}public static void main(String[] args) {new Case_5();}}

三、综合案例

案例1.简易计算器

Calculator.java

import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class Calculator extends JFrame {private final Container container = getContentPane();public Calculator(){container.setLayout(null);setContent();setWindow();}private void setWindow(){this.setVisible(true); //窗口可见this.setSize(400,450); //窗口大小this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //窗口可关闭this.setLocationRelativeTo(null); //窗口居中this.setTitle("简易计算器"); //窗口标题}private void setContent(){/* 标签 */JLabel jLabel1 = new JLabel("计算器");jLabel1.setBounds(140,30,100,50);jLabel1.setFont(new Font("楷体",Font.PLAIN,20));JLabel jLabel2 = new JLabel("运算数一");jLabel2.setBounds(60,70,100,50);jLabel2.setFont(new Font("楷体",Font.PLAIN,20));JLabel jLabel3 = new JLabel("运算数二");jLabel3.setBounds(60,110,100,50);jLabel3.setFont(new Font("楷体",Font.PLAIN,20));JLabel jLabel4 = new JLabel("运算结果");jLabel4.setBounds(60,150,100,50);jLabel4.setFont(new Font("楷体",Font.PLAIN,20));/* 文本域 */JTextField jTextField1 = new JTextField(20);jTextField1.setBounds(170,80,150,30);JTextField jTextField2 = new JTextField(20);jTextField2.setBounds(170,120,150,30);JTextField jTextField3 = new JTextField(20);jTextField3.setBounds(170,160,150,30);/* 按钮 */JButton jButton1 = new JButton("相加");jButton1.setBounds(80,220,80,40);jButton1.setFont(new Font("楷体",Font.PLAIN,20));JButton jButton2 = new JButton("相减");jButton2.setBounds(220,220,80,40);jButton2.setFont(new Font("楷体",Font.PLAIN,20));JButton jButton3 = new JButton("清零");jButton3.setBounds(120,300,140,40);jButton3.setFont(new Font("楷体",Font.PLAIN,20));/* 相加 按钮的监听事件 */jButton1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {String text1 = jTextField1.getText();if (text1.equals("")){new ErrorPrompt();return;}int num1 = Integer.parseInt(text1);String text2 = jTextField2.getText();if (text2.equals("")){new ErrorPrompt();return;}int num2 = Integer.parseInt(text2);jTextField3.setText("" + (num1+num2));}catch (NumberFormatException a){new ErrorPrompt();}}});/* 相减 按钮的监听事件 */jButton2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {String text1 = jTextField1.getText();if (text1.equals("")){new ErrorPrompt();return;}int num1 = Integer.parseInt(text1);String text2 = jTextField2.getText();if (text2.equals("")){new ErrorPrompt();return;}int num2 = Integer.parseInt(text2);jTextField3.setText("" + (num1-num2));}catch (NumberFormatException a){new ErrorPrompt();}}});/* 全部清零 按钮的监听事件 */jButton3.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {jTextField1.setText(""); //文本域全部清零jTextField2.setText("");jTextField3.setText("");}});container.add(jLabel1);container.add(jLabel2);container.add(jLabel3);container.add(jLabel4);container.add(jTextField1);container.add(jTextField2);container.add(jTextField3);container.add(jButton1);container.add(jButton2);container.add(jButton3);}}class ErrorPrompt extends JFrame {Container container = getContentPane();public ErrorPrompt(){container.setLayout(null);setWindow();setContent();}private void setWindow(){this.setVisible(true);this.setSize(300,200);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //关闭当前窗口this.setTitle("错误提示");}private void setContent(){JLabel jLabel = new JLabel("请输入正整数!");jLabel.setBounds(70,30,140,80);jLabel.setFont(new Font("楷体",Font.PLAIN,20));jLabel.setForeground(Color.red); //设置字体为红色container.add(jLabel);}}

Main.java

public class Main {public static void main(String[] args) {new Calculator();}}

UML图

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。