黑马程序员-Java GUI使用

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流!——

一、概述

GUI(Graphical User Interface,图形化用户界面),Java中提供了两个包用于实现图形化用户界面,分别是java.Awt和javax.swing。其中Awt需要调用本地系统实现功能,属于重量级控件,不同系统中界面显示会有一些区别,因为其主要是依赖系统提供的接口。为了提高跨平台性,Swing在Awt的基础上,建立了一套图形界面系统,其中提供了更多的组件,而且完全由Java实现,增强了程序的可移植性,属于轻量级控件。不仅限于Awt,还增加了许多拓展的控件。

二、布局

容器中的组件排放方式,称为布局,java中的布局有以下不同类型的布局控件:

  • FlowLayout:流式布局。从左到右的顺序排列,Panel默认的布局管理器。
  • BorderLayout:边界布局管理器,东、西、南、北、中,Frame默认的布局管理器。
  • GridLayout:网格布局管理器,规则的矩阵排列。
  • CardLayout:卡片布局管理器,选项卡形式。
  • GridBagLayout:非规则的矩阵。

三、窗口

Frame可以创建一个窗体,一般创建窗体的步骤如下:

  1. 创建一个Frame窗体。
  2. 对窗体进行基本设置(如大小、位置和布局等)。
  3. 定义组件。
  4. 将组件通过窗体的add方法添加到窗体内部。
  5. 让窗体显示,通过setVisible(true)来显示。

简单地建立一个图形窗口,示例代码如下:

import java.awt.*;
import java.awt.event.*;
class MyAdapter extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }

    public void windowActivated(WindowEvent e) {
        System.out.println("激活");
    }

    public void windowOpened(WindowEvent e) {
        System.out.println("打开");
    }
}

class Demo {
    public static void main(String[] args) {
        Frame frame = new Frame("Hi"); // 窗体的标题

        // 指定宽高
        frame.setSize(600, 400);

        // 指定窗口在屏幕上的位置
        frame.setLocation(300, 200);

        // 设置布局
        frame.setLayout(new FlowLayout());

        // 添加一个按钮
        Button button = new Button("确定");
        frame.add(button);
        frame.addWindowListener(new MyAdapter());

        // 显示窗口
        frame.setVisible(true);
    }
}

运行出的图形界面如下:

窗体样式

四、事件

事件监听机制的特点,有以下部分组成:

  • 事件源:就是触发事件的源头,不同的事件源会触发不同的事件类型,Awt或者Swing包中的图形界面组件。
  • 事件:每一个事件源都有自己特有的对应事件和共性事件。
  • 监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
  • 事件处理:(上面三者Java中都已经定义好了)我们所做的便是将每个事件的相应处理动作完成。

在外部动作的作用下,便产生了一个事件源,事件源被封装成了一个对象,事件对象传递给事件监听器,事件监听器再做出相应的动作。

事件监听机制流程图

为窗口添加关闭事件,可以通过FrameaddWindowListener(WindowListener )添加,但是此接口中有一系列方法,若添加这个接口必须要实现所有方法,现仅仅为点击窗口的关闭按钮,然后退出窗口,所以另寻它法。Java提供了一个类为WindowAdapter的抽象类,这个类实现了WindowListener接口,只是一些空操作,那么我们只需要继承此类即可,如下面的写法:

import java.awt.*;
import java.awt.event.*;
class Demo {
    public static void main(String[] args) {
        Frame frame = new Frame("Hi"); // 窗体的标题

        // 指定宽高
        frame.setSize(600, 400);

        // 指定窗口在屏幕上的位置
        frame.setLocation(300, 200);

        // 设置布局
        frame.setLayout(new FlowLayout());

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        // 显示窗口
        frame.setVisible(true);
    }
}

很多时候都会看到一些软件的控件会根据鼠标的位置不同而呈现不同的样式,如鼠标在其上面时变为选中状态等等,那么这就需要添加鼠标响应事件,代码如下:

import java.awt.*;
import java.awt.event.*;
class Demo {
    public static void main(String[] args) {
        Frame frame = new Frame("Hi"); // 窗体的标题

        // 指定宽高
        frame.setSize(600, 400);

        // 指定窗口在屏幕上的位置
        frame.setLocation(300, 200);

        // 设置布局
        frame.setLayout(new FlowLayout());

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        Button button = new Button("    大家好!    ");
        //button.setSize(60, 30);
        button.addMouseListener(new MouseAdapter() {
            public void mouseEntered(MouseEvent e) {
                button.setLabel("鼠标进来了");
            } 

            public void mouseExited(MouseEvent e) {
                button.setLabel("鼠标出去了");
            }
        });

        frame.add(button);
        // 显示窗口
        frame.setVisible(true);
    }
}

下面通过一个综合性的实例来演示一下java图形界面的编程,实例内容是通过系统的文件选择接口,选择指定文件,然后将目录和文件内容显示出,

import java.io.*;
import java.awt.*;
import java.awt.event.*;
class Demo {
    public static void main(String[] args) {
        new Demo();
    }

    // 定义界面组件及成员变量
    private Frame mFrame;
    private TextField mInputBox;
    private TextArea mOutputBox;
    private Button mChoose;
    private FileDialog mFileDialog, mSaveDialog;
    private MenuBar mMenuBar;
    private Menu mMenu;
    private MenuItem mChooseMenuItem, mSaveMenuItem, mExitMenuItem;
    private File mSaveFile;

    public Demo() {
        init();
        initEvents();
    }

    /**
     * 初始化界面
     */
    private void init() {
        mFrame = new Frame("文件列表窗");
        mFrame.setBounds(300, 200, 600, 400);
        mFrame.setLayout(new FlowLayout());
        mInputBox = new TextField(68);
        mOutputBox = new TextArea(20, 80);
        mChoose = new Button("选择目录");

        mFrame.add(mInputBox);
        mFrame.add(mChoose);
        mFrame.add(mOutputBox);
        mFileDialog = new FileDialog(mFrame, "选择文件", FileDialog.LOAD);
        mSaveDialog = new FileDialog(mFrame, "保存文件", FileDialog.SAVE);

        // 初始化菜单
        mMenuBar = new MenuBar();
        mMenu = new Menu("文件");
        mChooseMenuItem = new MenuItem("打开");
        mSaveMenuItem = new MenuItem("保存");
        mExitMenuItem = new MenuItem("退出");

        mMenu.add(mChooseMenuItem);
        mMenu.add(mSaveMenuItem);
        mMenu.add(mExitMenuItem);
        mMenuBar.add(mMenu);
        mFrame.setMenuBar(mMenuBar);
        mFrame.setVisible(true);
    }

    /**
     * 初始化组件事件
     */
    private void initEvents() {

        // 为窗口添加退出事件
        mFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        // 选择文件
        mChoose.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                chooseFile();
            }
        });

        // 菜单打开文件
        mChooseMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                chooseFile();
            }
        });

        // 保存文件
        mSaveMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                saveFile();
            }
        });

        // 退出
        mExitMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
    }

    /**
     * 使用FileDialog系统接口选择文件
     */
    private void chooseFile() {
        mFileDialog.setVisible(true);
        String dirPath = mFileDialog.getDirectory();
        String fileName = mFileDialog.getFile();
        if(dirPath != null || fileName != null) {
            File file = new File(dirPath,fileName);
            if(file.exists()) {
                mSaveFile = file;
                loadFile(mSaveFile);
            }
        }
    }

    /**
     * 保存文件,如果是第一次则选择保存位置
     */
    private void saveFile() {
        if(mSaveFile == null) {
            mSaveDialog.setVisible(true);
            String dirPath = mSaveDialog.getDirectory();
            String fileName = mSaveDialog.getFile();
            if(dirPath != null && fileName != null) {
                mSaveFile = new File(dirPath, fileName);
                saveContent();
            }
        } else {
            saveContent();
        }
    }

    /**
     * 保存文件,将文本框内容保存到指定位置
     */
    private void saveContent() {
        BufferedWriter writer = null;
        try {
            writer = new BufferedWriter(new FileWriter(mSaveFile));
            String content = mOutputBox.getText();
            writer.write(content);
        } catch(IOException e ) {

        } finally {
            try {
                if(writer != null) {
                    writer.close();
                }
            } catch(IOException e) {};
        }
    }

    /**
     * 加载文件内容
     */
    private void loadFile(File file) {
        if(file.exists()) {
            mInputBox.setText(file.getAbsolutePath());
            mOutputBox.setText("");
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new FileReader(file));
                String line = null;
                while((line = reader.readLine()) != null) {
                    mOutputBox.append(line+"\r\n");
                }
            } catch(IOException e) {

            } finally {
                try {
                    if(reader != null) {
                        reader.close();
                    }
                } catch(IOException e) {}
            }
        }
    }
}
界面运行效果图
时间: 2024-12-18 19:09:40

黑马程序员-Java GUI使用的相关文章

黑马程序员-java 7K面试题之交通灯管理系统

------- android培训.java培训.期待与您交流! -------- 交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1. 异常随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆----直行车辆 由西向而来去往南向的车辆----右转车辆 由东向而来去往南向的车辆----左转车辆 .......  ...... 2. 信号灯忽略黄灯,只考虑红灯和绿灯. 3. 应该考虑左转车辆控制信号灯,右转车辆不受信号灯控制. 4. 具体信号灯控制逻辑与现实

黑马程序员-java 7K面试题之银行业务调度系统

------- android培训.java培训.期待与您交流! -------- 银行业务调度系统 模拟实现银行业务调度系统逻辑,具体需求如下: 1. 银行有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. 2. 有三种对应类型的客户:VIP客户.普通客户.快速客户(办理如交水电费.电话费之类业务的客户). 3. 异步随机生成各种类型的客户,生成各类型用户的概率比率为: VIP客户:普通客户:快速客户=1:6:3 4. 客户办理业务所需时间有最大值和最小值,

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

黑马程序员——Java高新技术代理

代理 普通代理 很多时候,我们使用别人代码往往会发现别人代码的功能并不是十分符合我们的需求,调用别人的方法的时候,总是先new一个对象,然后我们的前处理做完,然后调用别人代码的方法,再加入后处理,这样做往往十分麻烦.代理就为其他类提供了一种控制其对象的方法.代理类和委托类必须实现同一个接口,这样代理类才能在需要的时候代替委托类对象,执行委托类的方法. interface Solution{ public void doSomething(); } //委托类Demo实现了接口 class Dem

黑马程序员——Java I/O流基础知识点(File类)

File工具 File类就是用俩将文件或者文件夹封装对象,弥补流对象的不足--流只能操作数据,不能操作文件夹的 封装的是路径!!! 构造方法演示 1.可以将已有的未出现的文件或者文件夹封装成对象. File f1=new File("c:\\abc\\a.txt"): File f2=new File("d:\\abc","ab.txt"打印,会打印路径.:目录分隔符,为了更好地跨平台File. File类常见功能 1,创建 createNewF

黑马程序员 ---------- Java网络技术之 ---正则表达式 (Day06)

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 正则表达式 正则表达式:基本知识 1  字符,   2 字符类 , 3 预定义字符类 , 4 边界匹配器 ,5 Greedy 数量词,6 Logical 运算符 详解: 1 字符 x   字符 x \\ 反斜线字符 \0n 带有八进制值 0 的字符 n (0 <= n <= 7) \0nn 带有八进制值 0 的字符 nn (0 <= n

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象

黑马程序员——Java I/O基础知识之I/O流

I/O流基础知识--字节流和字符流 文件存储在硬盘中,是以二进制表示的,只有内存中才能形成字符.数据的来源可以有硬盘,内存,控制台,网络,Java把数据从一个地方转到另一个地方的现象称为流,用InputStream和OutputStream接口来表示,这两个流里面的都是以字节为单位的,后来加入了Reader和Writer,里面操作的是字符,是两个字节为单位的. 字节流 字节流将数据写入文件 try { File file =new File("d:" +File .separator+

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S