Java | GUI 图形用户界面

一、什么是GUI

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

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

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

二、Java如何设计编写GUI

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

        1.导入相应包

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

        (1)java.awt

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

        (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 平台上的观感都一样。
顶层容器 JFrame、JApplet、JDialog 等
中间层容器 JPanel、JScrollPane、JSplitPane、JToolBar 等
普通组件 JButton、JList、JTextField 等
        [注意] 程序设计过程中最好不要混用 Swing 组件和 AWT 组件,虽然有时候也可以同时用,但有可能在视觉效果和响应上造成不稳定隐患。

        2.界面设计

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

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

        (1)容器 (Container)

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

        (2)布局

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

Container.setLayout(布局类对象)

        常用布局类对象:

布局 说明
FlowLayout ( 顺序布局\流式布局 )
容器上的元素会按容器显示时的大小,按照从左到右、从上到下的一行一行摆放下去。
BorderLayout ( 边界布局 )
把容器分为东西南北中 5 个方位,可以指定某个组件在哪个方位。
[注意]并非一定要有 5 个组件摆上去,不足 5 个也可指定位置摆放
GridLayout( 网格布局 ) 可以指定容器上的元素按几行几列的位置顺序摆放。
CardLayout( 卡片布局 )
使用该布局的容器可放置多个组件,但同一时刻只能显示其中一个,就像一叠叠整齐的纸牌中每次只能最上面一张一样。可以指定哪个组件被显示。
null( 空布局 )
空布局并非没有布局,而是容器被设置为这种布局以后,放到它上面的每个组件就可以通过 setBounds(int a,int b,int width,int height)来设置具体的位置。
另外还有 BoxLayout(盒式布局)、GridBagLayout(网格包布局)等不常用布局。
        

        (3)顶层容器

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

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

         部分方法:

setTitle(String title) 设置窗口标题
setLayout(new 布局管理器类型) 创建布局管理器
add(组件名称) 添加组件
 setBounds(int x , int y , int width , int height) 设置窗口显示:x , y 显示的位置,width , height 窗体的大小
setVisable(Boolean b) 设置窗口是否显示
 setDefaultCloseOperation(int operation)

设置窗口退出方案

JFrame.DO_NOTHING_ON_CLOSE:不执行任何操作

JFrame.HIDE_ON_CLOSE:隐藏该窗体。此时没有关闭程序,只是将程序界面隐藏

JFrame.DISPOSE_ON_CLOSE:隐藏并释放该窗体。继续运行应用程序,释放窗体中占用的资源

JFrame.EXIT_ON_CLOSE: 使用 System exit 方法退出应用程序

        例:

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("框架标题");
    }
}

        效果:

Java | GUI 图形用户界面_第1张图片

  •  JDialog (对话框) - 对话框也是一个窗体,但没有最大化、最小化按钮
        部分方法:
JDialog() 创建一个没有标题并且没有指定 Frame 所有者的无模式对话框
JDialog(Dialog owner) 创建一个没有标题但将指定的 Dialog 作为其所有者的无模式对话框
JDialog(Dialog owner, boolean modal) 创建一个具有指定所有者 Dialog 和模式的对话框
JDialog(Dialog owner, String title) 创建一个具有指定标题和指定所有者对话框的无模式对话框
JDialog(Dialog owner, String title, boolean modal) 创建一个具有指定标题、模式和指定所有者 Dialog 的对话框
JDialog(Dialog owner, String title, boolean modal, GraphicsConfiguration gc) 创建一个具有指定标题、所有者Dialog、模式和 GraphicsConfiguration 的对话框。
JDialog(Frame owner) 创建一个没有标题但将指定的 Frame 作为其所有者的无模式对话框
JDialog(Frame owner, boolean modal) 创建一个具有指定所有者 Frame、模式和空标题的对话框
JDialog(Frame owner, String title) 创建一个具有指定标题和指定所有者窗体的无模式对话框
JDialog(Frame owner, String title, boolean modal) 创建一个具有指定标题、所有者 Frame 和模式的对话框
JDialog(Frame owner, String title, boolean modal, GraphicsConfiguration gc) 创建一个具有指定标题、所有者 Frame、模式和 GraphicsConfiguration 的对话框
JDialog(Window owner) 创建一个具有指定所有者 Window 和空标题的无模式对话框
JDialog(Window owner, Dialog.ModalityType modalityType) 创建一个具有指定所有者 Window、模式和空标题的对话框
JDialog(Window owner, String title) 创建一个具有指定标题和所有者 Window 的无模式对话框
JDialog(Window owner, String title, Dialog.ModalityType modalityType) 创建一个具有指定标题、所有者 Window 和模式的对话框
JDialog(Window owner, String title, Dialog.ModalityType modalityType, GraphicsConfiguration gc) 创建一个具有指定标题、所有者 Window、模式和 GraphicsConfiguration 的对话框
setTitle(String title) 设置对话框标题
 setLocation(int x , int y , int width , int height) 设置窗口显示:x , y 显示的位置,width , height 窗体的大小
setVisable(Boolean b) 设置窗口是否显示
 setDefaultCloseOperation(int operation)

设置窗口退出方案

JFrame.DO_NOTHING_ON_CLOSE:不执行任何操作

JFrame.HIDE_ON_CLOSE:隐藏该窗体。此时没有关闭程序,只是将程序界面隐藏

JFrame.DISPOSE_ON_CLOSE:隐藏并释放该窗体。继续运行应用程序,释放窗体中占用的资源

JFrame.EXIT_ON_CLOSE: 使用 System exit 方法退出应用程序

        例:
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);
    }
}
        效果:

Java | GUI 图形用户界面_第2张图片

        (4)中间容器

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

JPanel (面板) 作为最普通的面板,向面板中添加组件。
JTabbedPane(拆分面板) 把面板分为两部分,可以按左右分割,也可以按上下分割。
JSplitPane (可切换选项卡面板) 向面板中添加组件时,会为这个组件添加选项卡,通过选项卡可切换不同组件.
JSrollPane(滚动面板) 只可添加一个组件。和JTextArea配合,作为文本输入栏的滚动条。
JSplitPane(拆分面板) 把面板分为两部分,可以按左右分割,也可以按上下分割。
JLayeredPane(分层面板) 用于组件重叠的处理,JavaSwing中定义5层,从低到高,依次为 DEFAULT_LAYER、PALETTE_LAYER、MODAL_LAYER、POPUP_LAYER、DRAG_LAYER。对于同一位置,高层覆盖底层。对于同层,后来覆盖新来。

        (5)普通组件

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

Container.add(普通组件名);
        部分类型:
JLabel 标签
JButton 按钮

JRadioButton         

单选按钮

JCheckBox        

复选框

JToggleButton         

开关按钮

JPasswordField         

密码框

JTextField    

单行文本输入

JTextArea         

多行文本输入

JComboBox         

下拉列表框

JList         

列表

JProgressBar         

进度条

JSlider         

滑块

        例:

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();
    }
}

        效果:

Java | GUI 图形用户界面_第3张图片

        (6)界面设计步骤

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

        2.事件处理

        (1)事件处理

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

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

        (2)Java 事件处理机制

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

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

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

组件名.addActionListener(监听器对象);
如:jButton.addActionListener(new Event());
        Java.awt.event 包中按照不同的事件类型定义了 11 个监听器接口,每类事件都有对应的事件监听器。
事件类
可关联的组件 要实现的接口 接口中必须实现的方法
ActionEvent
Button,List, MenuItem,TextField
ActionListener
ActionPerformed(Actionevente)
ItemEvent
Checkbox,Choice,List,MenuItem
ItemListener
ItemStateChanged(ItemEvent e)
ContainerEvent
Container,Dialog,Frame,Panel,
ScrollPane,Window
ContainerListener
componentAdded(ContainerEvent
e)
componentRemoved(…)
MouseMotionEvent
Button,Canvas,Checkbox,choice,
Component Container,Dialog,Frame,
Label,List,Panel,Scrollbar,ScrollPane,
TextArea,TextField,Window
MouseMotionListener
mouseGragged(MouseEvent e)
mouseMoved(MouseEvent e)
MouseEvent
MouseMontionEvent
MouseListener
mousePressed(MouseEvent e)
mouseReleased(…)
mouseEntered(…)
mouseExited(…)
mouseClicked(…)
KeyEvent
MouseMontionEvent
KeyEvent
keyPressed(KeyEvent e)
keyReleased(…)
keyTyped()
FocusEvent
MouseMontionEvent
FocusListener
focusGained(FocusEvent e)
focusLost(FocusEvent e)
AdjustmentEvent
Scrollbar
AdjustmentListener
adjustmentValueChanged(AdjustmentEvent  e)
ComponentEvent
MouseMontionEvent
ComponentListener
ComponentMoved(ComponentEvent e)
ComponentHidden(…)
ComponentResized(…)
ComponentShown(…)
TextEvent
TextField,TextArea
TextListener
textValueChanged(TextEvent e)
WindowEvent
Dialog,Frame,Window
WindowListener
WindowClosing(WindowEvent e)
WindowOpened(…)
WindowIconified(…)
WindowClosed(…)
WindowDeiconfied(…)
WindowActivated(…)
WindowDeactivated(…)
        
        由于 接口一般要求实现许多方法, 并不是所有方法我们都是需要的,但按照 Java 语法规则,接口必须实现其所有的方法,因此不需要响应具体事件的方法体的代码为空即可
        同时为了简化,java 为一些接口统一提供 事件适配器(Adapter) 。事件适配器是抽象类。通过继承事件适配器,重写需要的方法,不要的方法可以不写。
        Java.awt.event 包中提供了的主要适配器包括:
ComponentAdapter 组件适配器
ContainerAdapter 容器适配器
FocusAdapter 焦点适配器
KeyAdapter 键盘适配器
MouseAdapter 鼠标适配器
MouseMotionAdapter 鼠标移动适配器
WindowAdapter 窗口适配器

        (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() {
            @Override
            public 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() {
            @Override
            public 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() {
            @Override
            public 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() {
            @Override
            public 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() {
            @Override
            public 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图

Java | GUI 图形用户界面_第4张图片

你可能感兴趣的:(Java,java,ide,容器)