Java学习12 GUI程序设计(AWT)

  • GUI, Graphical User Interface, 图形用户界面

  • AWT, Abstract Window Toolkit, 抽象窗口工具集

  • 相关软件包:

    • java.awt包:提供基本GUI组件、视觉控制和绘图工具API
    • java.awt.event包:提供Java GUI时间处理API
  • Java.awt包GUI组件类:Menu/Button/Label/TextField等

  • Component类:除菜单相关组件之外所有Java AWT组件类的根父类

  • 容器(Container):Component的子类,包括两种主要的容器类型:

    • java.awt.Window
    • java.awt.Panel
  • Windows类:Container的子类

    • Windows类:setSize(int width, int height) 方法 vs. pack()方法
      • setSize:给定具体的窗口宽和高
      • pack:窗体组件紧凑化,即调整窗口以适合其子组件的首选大小和布局
  • 组件定位:Java组件在容器中的定位由布局管理器决定

    • 几个组件定位方法:
      • setLocation():位置
      • setSize():大小
      • setBounds():位置和大小
    • GUI坐标系:左上角(0, 0)

Frame

  • 继承:Object<–Component<–Container<–Window<–Frame
  • 显示效果是一个可自由停泊的顶级“窗口”
  • 默认不可见,调用setVisible(true)使可见
  • 调用add()方法包含其他组件

Panel

  • 继承:Object<–Component<–Container<–Panel
  • 容纳组件的空间
  • 不能独立存在,必须添加到其他容器中
  • 可采用和所在容器不同的布局管理器

布局管理器

  • 布局(Layout)

    • 容器对组件的排列方式,包括组件的位置和大小设定
  • 布局管理器

    • 为了使GUI具有良好的平台无关性,java提供布局管理器管理容器的布局,而不建议直接设置组件在容器中的位置和尺寸
    LayoutManagerFlowLayout
    GridLayout
    LayoutManager2BorderLayout
    CardLayout
    GridBagLayout
  • 每个容器都有一个布局管理器,当容器需要对某个组件进行定位或尺寸判断时,就会调用对应的布局管理器。

    • Window容器类:包括子类Frame和Dialog,默认使用BorderLayout布局
    • Panel容器类:包括子类Applet,默认使用FlowLayout布局

FlowLayout布局

  • 组件按加入次序逐行定位,从左到右,排满后换行;
  • 组件按原始大小显示
  • 组件默认居中对齐,构造方法可设置间距、行距和对齐方式
FlowLayout()
FlowLayout(int align)
FlowLayout(int align, int hgap, int vgap)

BorderLayout布局

  • 将整个容器分为东、西、南、北、中5个区域,组件只能被添加到指定区域;默认加入到Center区域
  • 每个区域只能加一个组件,新加入的组件会替换之前加入的组件
  • 组件尺寸被强行控制,即与所在区域尺寸相同
    • North、South:宽度可调
    • East、West:高度可调
    • Center:宽度、高度均可调
BorderLayout()
BorderLayout(int hgap, int vgap)

GridLayout布局(网格布局)

  • 容器区域划分为规则的矩形网格;按组件加入顺序,从左到右,从上到下填充组件
  • 当容器尺寸变化时,网格大小自动调整
GridLayout(int rows, int cols)
GridLayout(int rows, int cols, int hgap, int vgap)

CardLayout布局(卡片布局)

  • 多个组件在同一容器区域内交替显示,只有最上面卡片可见
  • 可按名称显示某一卡片,或按先后顺序依次显示,也可以直接定位到第一章或最后一张卡片
void first(Container parent)
void last(Container parent)
void previous(Container parent)
void next(Container parent)
// 按名称显示某一张卡片
void show(Container parent, String name)

GridBagLayout布局(网格包布局)

  • 建立在GridLayout基础上,更复杂而灵活
  • 通过设置一个或多个实例变量来自定义GridBagConstraints对象,来有效使用网格包布局

    • 常用的变量:
      • GridBagConstraints.fill:一般用GridBagConstraints.BOTH(使组件完全填满其显示区域)
      • GridBagConstraints.gridwidth、GridBagConstraints.gridheight:占用的宽和高
      • GridBagConstraints.weightx、GridBagConstraints.weighty:拉伸权重,一般0和1
    • 两个重要常量:
      • GridBagConstraints.RELATIVE:倒数第二,后边使用REMAINDER
      • GridBagConstraints.REMAINDER:倒数第一,下一个换行

    参考:

    1. 深入学习GridBagLayout
    2. Java 最重要布局管理器GridBagLayout的使用方法

容器的嵌套使用

  • Frame下添加Panel等组件,Panel填充其他组件
Frame frame = new Frame("计算器");
Panel panel = new Panel();
panel.setLayout(new GridLayout(2, 2));

Button screen = new Button("数显屏幕");
Button btn1 = new Button("1");
Button btn2 = new Button("2");
Button btn3 = new Button("3");
Button btn4 = new Button("4");

frame.add(screen, BorderLayout.NORTH);
frame.add(panel, BorderLayout.CENTER);
panel.add(btn1);
panel.add(btn2);
panel.add(btn3);
panel.add(btn4);

frame.pack();
frame.setVisible(true);

GUI事件处理

  1. 定义多种事件类型对象(Event)
  2. 事件源(Event Source)组件注册事件,触发事件
  3. Java运行时环境时间监听器(Event Listener)接收到事件,转发给事件处理对象,调用事件处理方法(Event Handler)

举例:
事件注册:调用addActionListener(ActionListener actionlistener)方法
事件监听器:实现ActionListener接口,处理ActionEvent事件

public class TestActionEvent {
    public static void main(String[] args) {
        Frame frame = new Frame();
        Button b = new Button("按钮");
        frame.add(b);

        // 创建监听器对象,并注册事件
        MyMonitor myMonitor = new MyMonitor();
        b.addActionListener(myMonitor);

        frame.pack();
        frame.setVisible(true);
    }
}

// 事件监听器
class MyMonitor implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent actionevent) {
        System.out.println("处理事件");
    }
}

监听器一般使用内部类匿名类实现

  • actionCommand属性

    • 用于记录按钮/菜单类组件所触发的ActionEvent时间相关指令信息
    这里写代码片

GUI主要事件类型层次

  • 继承:Object<–EventObject<–AwtEvent
AwtEventActionEvent
AdjustmentEvent
ComponentEventFocusEvent
InputEventKeyEvent
MouseEvent
ContainerEvent
WindowEvent
ItemEvent
TextEvent

参考:AWT事件及其相应的监听器接口(1)

多重监听器

这里写代码片

事件适配器类

  • 针对大多数事件监听器接口定义的abstract方法,适配器类实现了所有这些方法,但不做任何事情
监听器接口对应适配器类说明
  • 监听器只能继承一个适配器类(Java单继承)

AWT组件

参考:AWT与Swing使用区别

  • AWT常用组件

    • 文本组件:文本框/文本域

      • 文本框:TextFied
      • 文本域:TextArea,如留言板功能
    • 菜单组件:菜单条/菜单/菜单项/复选菜单项/弹出菜单

      • 菜单组件:MenuBar/Menu/MenuItem/CheckboxMenuItem
      • 多级菜单:Menu下挂Menu对象,Menu/MenuItem
      • 弹出式菜单: PopupMenu/MenuItem
        延伸:弹出式菜单事件处理需要在mousePressed()/mouseReleased()方法中处理,参考isPopupTrigger()
    • 下拉选择框/列表框/复选框

      • 选择组件:Choice
      • 列表框:List
      • 复选框:CheckboxGroup/Checkbox
    • 对话框组件:对话框/文件对话框

      • 对话框:Dialog
      • 文件对话框:FileDialog,如文本文件编辑器
        文件对话框的模式为FileDialog.LOAD或FileDialog.SAVE
    • 滚动组件:滚动条/滚动面板

      • 滚动条:Scrollbar
        方向:Scrollbar.HORIZONTAL 或 Scrollbar.VERTICAL
        可见量(visible amount):可考虑设置为0,滚动条的实际最大值是 maximum 减去 visible amount
      // 例子中,maximum 是 300,visible amount 是 60,所以实际最大值是 240。滚动条轨道的范围是 0 - 300
      ranger = new Scrollbar(Scrollbar.HORIZONTAL, 0, 60, 0, 300);
      • 滚动面板:ScrollPane
        滚动条的显示策略可以设置如下:
        • as needed(SCROLLBARS_AS_NEEDED): 创建滚动条,且只在滚动窗格需要时显示
        • always(SCROLLBARS_ALWAYS): 创建滚动条,且滚动窗格总是显示滚动条
        • never(SCROLLBARS_NEVER): 滚动窗格永远不创建或显示滚动条

AWT视觉控制类

  • java.awt.Color类
    • RGB颜色
这里写代码片
  • java.awt.Font类
    • 字体:名称、样式、大小
这里写代码片

AWT绘图

  • 绘图原理:重写Component类paint()方法,加入所需绘图逻辑
public void paint(Graphics g)
  • java.awt.Graphics支持两种绘图方式:

    • 基本绘图:画线、多边形、圆、填充图形和文字等
    • 绘制图像:图像显示
  • java.awt.Canvas画布

    • 继承:Object<–Component<–Canvas
    • 跟Panel类似,但不是容器类,不能包含其他组件
    • Canvas 组件表示屏幕上一个空白矩形区域,应用程序可以在该区域内绘图,或者可以从该区域捕获用户的输入事件
    • 程序自动调用Component的paint(Graphics g)方法

Java小程序(Applet)

java.applet.Applet

  • 通常用于网页中
  • 继承:Panel<–Applet

  • 两种运行方式:

    1. IE浏览器
    2. AppletViewer
  • Applet vs. Application
    • 运行方式:Applet不能单独运行,通常嵌入在网页里,在浏览器下运行;Application是固定入口方法main()运行的
    • 性能:Applet与Application相比,运行速度更慢、功能更少
    • 安全性要求:Applet随网页自动下载到客户端运行,安全要求更高

重写init()/paint()方法

// java
public class TestApplet extends Applet {
    @Override
    public void init() {
        this.setBackground(Color.CYAN);
    }

    @Override
    public void paint(Graphics g) {
        g.drawString("测试Applet", 100, 150);
    }
}

// html源文件
<html>
    <applet code="HelloWorld.class" width=200 height=150></applet>
</html>

参考:
1. applet路径问题总结
2. “中”安全级别已从 Java 控制面板中删除

  • IE浏览器

    1. JDK7

    2. JDK8

    java控制台是否显示

  • AppletViewer
    一般用于开发过程中的测试。

    appletviewer test.html

    延伸:JAVA出现警告无法读取 AppletViewer 属性文件的解决方法

  • Applet运行机制

    • Applet默认为FlowLayout布局
    • Applet生命周期
      • public void init();
        • 首次启动调用,进入初始态
      • public void start();
        • 调用后进入运行态
      • public void stop();
        • 调用后进入停止态;start()和stop()可循环调用
      • public void destroy();
        • 关闭浏览器时调用,进入消亡态
    • Applet安全策略
      • 沙箱
    • Applet插件标记
      code/width/height/[archive/codebase/alt/name/align/vspace/hspace]
      <param name="XXX" value="xxx" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值