JAVA基础 - 图形页面

目录

[一. 简介](#一. 简介)

[二. Swing 技术基础](#二. Swing 技术基础)

[三. 事件处理模型](#三. 事件处理模型)

[四. 适配器](#四. 适配器)

[五. 布局管理](#五. 布局管理)

[六. 可视化工具](#六. 可视化工具)


一. 简介

Java 图形用户界面技术主要有: AWT 、 Applet 、 Swing和 JavaFX 。

AWT(Abstract Window Toolkit,抽象窗口工具包)

AWT 是 Java 最早的用于创建图形用户界面(GUI)的工具包。它提供了基本的窗口、按钮、文本框等组件。然而,AWT 的组件依赖于本地操作系统的原生组件,这导致了界面在不同操作系统上可能会有外观和行为的差异,并且在一些情况下性能不是很好。

Applet

Applet 是一种可以嵌入到网页中的 Java 程序。它通过浏览器运行,能够与用户进行交互,并执行一些简单的任务。但由于安全限制和浏览器技术的发展,Applet 的使用已经逐渐减少。

Swing

Swing 是建立在 AWT 之上的一套更强大和灵活的 GUI 工具包。Swing 组件不依赖于本地操作系统的原生组件,而是由 Java 自己绘制,因此具有更好的跨平台一致性和可定制性。Swing 提供了丰富的组件,如各种按钮、文本域、列表、表格等,并且支持自定义组件的外观和行为。

JavaFX

JavaFX 是 Java 平台上较新的用于创建富客户端应用程序的图形和多媒体框架。它具有更现代化的设计和更强大的功能,支持 2D 和 3D 图形、动画、多媒体等。JavaFX 的组件和布局方式更加灵活和易于使用,并且与现代的开发理念和技术更加契合。

二. Swing 技术基础

Swing 是 Java 中用于构建图形用户界面(GUI)的一套工具库。

Swing 的特点

  1. 跨平台性:可以在不同操作系统上保持相似的外观和行为。
  2. 丰富的组件:提供了多种组件满足各种界面需求。

容器组件

  1. JFrame:顶层窗口容器,通常作为应用程序的主窗口。可以设置大小、位置、标题等属性。
  2. JPanel:通用的面板容器,用于组织和分组其他组件。
  3. JScrollPane:当组件内容超出显示区域时,提供滚动条。

常用组件

  1. JButton:按钮,可响应点击事件。
  2. JTextField:单行文本输入框。
  3. JTextArea:多行文本输入区域。
  4. JLabel:用于显示文本或图像的标签。
  5. JCheckBox:复选框。
  6. JRadioButton:单选按钮。
  7. JComboBox:下拉列表框。

布局管理器

用于管理容器内组件的排列方式,常见的有:

  1. FlowLayout:组件按照从左到右的顺序排列,满一行后换行。
  2. BorderLayout:将容器分为东、西、南、北和中心五个区域。
  3. GridLayout:以网格形式排列组件。

例如,使用 BorderLayout 布局创建一个包含按钮和文本区域的窗口:

java 复制代码
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class SwingExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Swing Example");
        frame.setLayout(new BorderLayout());

        JButton button = new JButton("Click Me");
        frame.add(button, BorderLayout.NORTH);

        JTextArea textArea = new JTextArea();
        frame.add(textArea, BorderLayout.CENTER);

        frame.setSize(400, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

总之,Swing 提供了丰富的功能和组件,通过合理选择容器、组件和布局管理器,可以创建出功能丰富、界面友好的图形界面应用程序。

三. 事件处理模型

在 Java 的 Swing 中,事件处理模型用于处理用户与界面组件的交互操作所产生的事件。

事件源:产生事件的组件,如按钮、文本框等。

事件:用户操作(如点击按钮、输入文本等)所触发的对象,表示发生的具体事情。

事件监听器:用于监听特定类型事件的接口实现。

Swing 中的事件处理通常遵循以下步骤:

  1. 定义事件监听器接口的实现类,实现相应的方法来处理事件。

    • 例如,对于按钮的点击事件,可以实现 ActionListener 接口。
  2. 将事件监听器注册到事件源上。

    • 通过组件的 addXXXListener 方法,将监听器对象添加到组件。

下面是一个简单的示例,展示了如何处理按钮的点击事件:

java 复制代码
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class EventHandlingExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Event Handling");
        JButton button = new JButton("Click Me");

        // 创建事件监听器对象
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button clicked!");
            }
        };

        // 将监听器注册到按钮
        button.addActionListener(listener);

        frame.add(button);
        frame.setSize(300, 200);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

在上述示例中,创建了一个匿名内部类作为 ActionListener 的实现,当按钮被点击时,会输出相应的消息。

除了 ActionListener ,Swing 还提供了许多其他的事件监听器接口,如 MouseListener (处理鼠标事件)、KeyListener (处理键盘事件)等,以满足不同类型的交互需求。

四. 适配器

在 Java 的 Swing 事件处理中,有时可能不需要实现事件监听器接口中的所有方法,这时可以使用适配器类。

适配器类是为事件监听器接口提供的空实现类。通过继承适配器类,只需要重写实际需要处理的事件方法,而无需为接口中的其他方法提供空实现。

例如,对于鼠标事件监听器 MouseListener,可以使用 MouseAdapter 类:

java 复制代码
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class AdapterExample extends JFrame {

    public AdapterExample() {
        JPanel panel = new JPanel();

        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("鼠标点击");
            }
        });

        add(panel);

        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new AdapterExample();
    }
}

在上述示例中,通过继承 MouseAdapter 类并只重写 mouseClicked 方法来处理鼠标点击事件,而无需为其他鼠标事件方法(如 mousePressedmouseReleased 等)提供实现。

类似的,对于其他事件监听器接口,如 KeyAdapter 用于键盘事件、 WindowAdapter 用于窗口事件等,也可以采用相同的方式来简化事件处理代码。

五. 布局管理

在 Java 的 Swing 中,布局管理器用于控制组件在容器中的排列方式和位置。以下是一些常见的布局管理器:

  1. FlowLayout(流式布局):
    • 组件按照从左到右的顺序排列,当一行排满后,会自动换行到下一行。
    • 示例代码:
java 复制代码
    import javax.swing.JFrame;
    import javax.swing.JButton;
    import java.awt.FlowLayout;

    public class FlowLayoutExample {
        public static void main(String[] args) {
            JFrame frame = new JFrame("FlowLayout Example");
            frame.setLayout(new FlowLayout());

            JButton button1 = new JButton("Button 1");
            JButton button2 = new JButton("Button 2");
            JButton button3 = new JButton("Button 3");

            frame.add(button1);
            frame.add(button2);
            frame.add(button3);

            frame.setSize(300, 200);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
  1. BorderLayout(边界布局):
    • 将容器划分为东(EAST)、西(WEST)、南(SOUTH)、北(NORTH)和中(CENTER)五个区域。
    • 每个区域只能放置一个组件,如果添加多个组件,只有最后添加的那个组件会显示。
    • 示例代码:
java 复制代码
    import javax.swing.JFrame;
    import javax.swing.JButton;
    import java.awt.BorderLayout;

    public class BorderLayoutExample {
        public static void main(String[] args) {
            JFrame frame = new JFrame("BorderLayout Example");
            frame.setLayout(new BorderLayout());

            JButton northButton = new JButton("North");
            JButton southButton = new JButton("South");
            JButton eastButton = new JButton("East");
            JButton westButton = new JButton("West");
            JButton centerButton = new JButton("Center");

            frame.add(northButton, BorderLayout.NORTH);
            frame.add(southButton, BorderLayout.SOUTH);
            frame.add(eastButton, BorderLayout.EAST);
            frame.add(westButton, BorderLayout.WEST);
            frame.add(centerButton, BorderLayout.CENTER);

            frame.setSize(300, 200);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
  1. GridLayout(网格布局):
    • 将容器划分为指定行数和列数的网格,组件按照从左到右、从上到下的顺序依次放入网格中。
    • 示例代码:
java 复制代码
    import javax.swing.JFrame;
    import javax.swing.JButton;
    import java.awt.GridLayout;

    public class GridLayoutExample {
        public static void main(String[] args) {
            JFrame frame = new JFrame("GridLayout Example");
            frame.setLayout(new GridLayout(3, 2));  // 3 行 2 列

            JButton button1 = new JButton("Button 1");
            JButton button2 = new JButton("Button 2");
            JButton button3 = new JButton("Button 3");
            JButton button4 = new JButton("Button 4");
            JButton button5 = new JButton("Button 5");
            JButton button6 = new JButton("Button 6");

            frame.add(button1);
            frame.add(button2);
            frame.add(button3);
            frame.add(button4);
            frame.add(button5);
            frame.add(button6);

            frame.setSize(300, 200);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
  1. CardLayout(卡片布局):

    • 可以将多个组件层叠放置,每次只显示其中一个组件,通过切换来显示不同的组件。
    • 常用于实现选项卡式的界面。
  2. BoxLayout(箱式布局):

    • 按照水平或垂直方向排列组件,可以设置组件之间的间距。

选择合适的布局管理器取决于具体的界面设计需求。有时也可以结合使用多个容器,并为每个容器设置不同的布局管理器,以实现更复杂的界面布局。

六. 可视化工具

相关推荐
懒大王爱吃狼24 分钟前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
秃头佛爷1 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
阿伟*rui1 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
待磨的钝刨1 小时前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
XiaoLeisj3 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck3 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei3 小时前
java的类加载机制的学习
java·学习
励志成为嵌入式工程师4 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉5 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer5 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法