第十篇 Java GUI编程(上篇)- AWT

第十篇 Java GUI编程(上篇)—— AWT


一、基本概念

  • GUI(用户图形接口 - Graphical User Interface ,也称图形用户界面)是指采用图形方式显示的计算机操作用户界面。
  • AWT(抽象窗口工具箱 - Abstract Window Toolkit),是Java1.0中就包含了一个用于基本GUI程序设计的类库,它提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具。

二、AWT继承体系概述

在这里插入图片描述

  • 布局管理器(LayoutManager)
    FlowLayout 流式布局 BorderLayout 边框布局
    GridLayout 网格布局 GridBagLayout 网格包布局(*)
    BoxLayout 盒子布局(Swing提供) CardLayout 卡片布局

三、容器组件的基础使用

1、常用的方法

  • setLocation( ):设置组件的位置
  • setSize( ):设置组件的大小
  • setBounds( ):设置组件的位置、大小
  • pack( ):自动设置最佳大小
  • setVisible( ):设置是否显示组件
  • add( ):向容器添加其他组件(可以是普通组件,也可以是容器),返回被添加的组件
  • getComponent( ):获取指定点的组件

2、显示第一个窗口(Frame)

package com.awt.java;
import org.testng.annotations.Test;
import java.awt.*;

public class awt_Test {
    
    
    @Test
    public void windowTest(){
    
    
        /* 1.实例化一个Frame窗口对象 */
        Frame frame = new Frame("第一个窗口");
        /* 2.设置窗口的位置,大小 */
        frame.setBounds(200,200,450,300);	//单位是像素px
        frame.setBackground(new Color(2,2,2));  //设置窗口背景颜色
        /* 3.显示窗口 */
        frame.setVisible(true);
        while (true);	//这里用了单元测试,加入while true使程序不退出
    }
}

在这里插入图片描述

3、显示第二个窗口(Panel)

package com.awt.java;
import org.testng.annotations.Test;
import java.awt.*;

public class awt_Test {
    
    
    @Test
    public void panellTest(){
    
    
        /* 1.实例化一个Frame框架 */
        Frame frame = new Frame("第二个窗口");
        /* 2.实例化一个Panel面板 */
        Panel panel = new Panel();
        /* 3.往Panel面板添加文本框和按钮 */
        panel.add(new TextField("文本框"));
        panel.add(new Button("按钮"));
        /* 4.把panel添加到Frame中 */
        frame.add(panel);
        /* 5.设置Frame位置大小 */
        frame.setBounds(200,200,350,300);
        /* 6.显示Frame */
        frame.setVisible(true);
        while (true);
    }
}

在这里插入图片描述

4、显示第三个窗口(ScrollPane)

package com.awt.java;
import org.testng.annotations.Test;
import java.awt.*;

public class awt_Test {
    
    
    @Test
    public void scrollPaneTest(){
    
    
        /* 1.实例化一个Frame框架 */
        Frame frame = new Frame("第三个窗口");
        /* 2.实例化一个scrollPane,并添加文本框和按钮 */
        ScrollPane scrollPane = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
        scrollPane.add(new TextField("文本框"));
        scrollPane.add(new Button("按钮"));
        /* 3.把ScrollPane添加到Frame中 */
        frame.add(scrollPane);
        frame.setBounds(200,200,350,300);
        /* 6.显示Frame */
        frame.setVisible(true);
        while (true);
    }
}

在这里插入图片描述

  • 【为什么】这里我们添加了文本框和按钮,却只显示出按钮,看不到文本框?
    (因为ScrollPane使用的默认布局BorderLayout导致该容器中只有一个组件被显示,下面将学习布局管理器)

四、布局管理器 - LayoutManager

1、流式布局 - FlowLayout

  • 流式布局:组件按照某一方向/对齐方式排列,直到排到边框才从下一行开始。
  • FlowLayout( ):默认对齐方式、垂直间距和水平间距
  • FlowLayout( int align ):指定对齐方式,默认的垂直间距和水平间距
  • FlowLayout( int align,int hgap,int vgap ):指定对齐方式、垂直间距和水平间距
  • 几个常量:①FlowLayout.LEFT(左对齐)、②FlowLayout.RIGHT(右对齐)、FlowLayout.CENTER(居中)
package com.awt.java;
import org.testng.annotations.Test;
import java.awt.*;

public class awt_Test {
    
    
    @Test
    public void FlowLayoutTest(){
    
    
        Frame frame = new Frame("测试FlowLayout");
        /* 设置panel布局为流式布局,右对齐,水平垂直间距20 */
        Panel panel = new Panel(new FlowLayout(FlowLayout.LEFT,20,20));
        /* 添加100个按钮 */
        for (int i = 0; i < 101; i++) {
    
    
            panel.add(new Button("按钮"+i));
        }
        frame.add(panel);
        frame.setBounds(300,200,850,500);
        frame.setVisible(true);
        while (true);
    }
}

在这里插入图片描述

2、边框布局 - BorderLayout

  • BorderLayout.NORTH:将组件放置在北侧
  • BorderLayout.SOUTH:将组件放置在南侧
  • BorderLayout.WEST:将组件放置在西侧
  • BorderLayout.EAST:将组件放置在南侧
  • BorderLayout.CENTER:将组件居中放置
package com.awt.java;

import org.testng.annotations.Test;
import java.awt.*;

public class awt_Test {
    
    
    @Test
    public void BorderLayoutTest() {
    
    
        Frame frame = new Frame("测试BorderLayout");
        frame.setLayout(new BorderLayout(10, 10));
        frame.add(new Button("按钮北"), BorderLayout.NORTH);
        frame.add(new Button("按钮南"), BorderLayout.SOUTH);
        frame.add(new Button("按钮西"), BorderLayout.WEST);
        frame.add(new Button("按钮东"), BorderLayout.EAST);
        frame.add(new Button("按钮中"), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
        while (true) ;
    }
}

在这里插入图片描述

3、网格布局 - GridBagLayout

  • 网格布局:会将容器分割成以纵横线为准的网格,每个网格所在区域大小相同
  • GridLayout( int rows,int cols ):指定行数、列数,默认纵横间距
  • GridLayout( int rows,int cols,int hgap,int vgap):指定行数、列数、纵横间距
package com.awt.java;

import org.testng.annotations.Test;

import javax.swing.*;
import java.awt.*;

public class awt_Test {
    
    
    @Test
    public void GridLayoutTest(){
    
    
        Frame frame = new Frame("计算器");
        frame.add(new TextField(30),BorderLayout.NORTH);
        Panel panel = new Panel(new GridLayout(3,5,5,5));
        for (int i = 0; i < 10; i++) {
    
    
            panel.add(new Button(i+""));
        }
        panel.add(new Button("+"));
        panel.add(new Button("-"));
        panel.add(new Button("*"));
        panel.add(new Button("/"));
        panel.add(new Button("="));
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        while (true);
    }
}

在这里插入图片描述

4、卡片布局 - CardLayout

  • CardLayout( ):默认的卡片布局
  • CardLayout( int hgap,int vgap ):指定纵横间距的卡片布局
  • first( Container target ):显示第一张卡片
  • last( Container target ):显示最后一张卡片
  • previous( Container target ):显示前一张卡片
  • next( Container target ):显示后一张卡片
  • show( Container target ,String name):显示指定名字的卡片
package com.awt.java;

import org.testng.annotations.Test;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class awt_Test {
    
    
   @Test
    public void CardLayout(){
    
    
        Frame frame = new Frame("测试CardLayout卡片布局");
        /* 1.创建两个Panel,p1卡片布局,p2按钮 */
        Panel p1 = new Panel();
        Panel p2 = new Panel();
        CardLayout cardLayout = new CardLayout();
        p1.setLayout(cardLayout);
        
        /* 2.向p1添加4个按钮,4张卡片名字同按钮 */
        for (int i = 0; i < 5; i++) {
    
    
            p1.add("第"+(i+1)+"张",new Button("第"+(i+1)+"张"));
        }
        
        /* 3.向p2添加下方的控制按钮 */
        Button b1 = new Button("上一张");
        Button b2 = new Button("下一张");
        Button b3 = new Button("第一张");
        Button b4 = new Button("最后一张");
        Button b5 = new Button("第三张");
        p2.add(b1);
        p2.add(b2);
        p2.add(b3);
        p2.add(b4);
        p2.add(b5);
        
        /* 4.组装frame整体 */
        frame.add(p1);
        frame.add(p2,BorderLayout.SOUTH);
        
        /* 5.添加控制按钮的监听器 */
        ActionListener listener = new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                String actionCommand = e.getActionCommand();
                switch(actionCommand){
    
    
                    case "上一张":
                        cardLayout.previous(p1);
                        break;
                    case "下一张":
                        cardLayout.next(p1);
                        break;
                    case "第一张":
                        cardLayout.first(p1);
                        break;
                    case "最后一张":
                        cardLayout.last(p1);
                        break;
                    case "第三张":
                        cardLayout.show(p1,"第3张");
                        break;
                }
            }
        };
        b1.addActionListener(listener);
        b2.addActionListener(listener);
        b3.addActionListener(listener);
        b4.addActionListener(listener);
        b5.addActionListener(listener);
        frame.pack();
        frame.setVisible(true);
        while (true);
    }
}

在这里插入图片描述

5、盒子布局 - BoxLayout

  • 盒子布局:可以在垂直和水平方向上摆放组件(实际上它是由Swing提供的)
  • BoxLayout( Container target,int axis ):创建基于target容器的BoxLayout布局管理器,组件按照axis方向排列。其中,axis可传BoxLayout.X_AIXS(横向)、BoxLayout.Y_AIXS(纵向)
  • 在swing中,还提供了一种容器Box,默认采用布局就是BoxLayout盒子布局。
  • Box类中,提供了以下静态方法可设置各组件的间隔(注意:添加的分割也是一种组件)
    ✒️createHorizontalGlue( ):创建一条水平的分割线(可拉伸)
    ✒️createVerticalGlue( ):创建一条垂直的分割线(可拉伸)
    ✒️createHorizontalStrut( int width ):创建一条指定宽度的水平分割线(仅垂直方向可拉伸)
    ✒️createVerticalStrut( int height):创建一条指定宽度的垂直分割线(仅水平方向可拉伸)
package com.awt.java;

import org.testng.annotations.Test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class awt_Test {
    
    
    @Test
    public void BoxLayoutTest1(){
    
    
        Frame frame = new Frame("测试BoxLayout");
        BoxLayout boxLayout = new BoxLayout(frame,BoxLayout.Y_AXIS);
        frame.add(new Button("按钮1"));
        frame.add(new Button("按钮2"));
        frame.setLayout(boxLayout);
        frame.setBounds(220,120,400,240);
        frame.setVisible(true);
        while (true);
    }
    @Test
    public void BoxTest2(){
    
    
        Frame frame = new Frame("测试容器Box");
        /* 1.创建两个Box容器 */
        Box box1 = new Box(BoxLayout.Y_AXIS);
        Box box2 = new Box(BoxLayout.X_AXIS);
        /* 2.box1存放两个垂直按钮 */
        box1.add(new Button("垂直按钮1"));
        box1.add(new Button("垂直按钮2"));
        /* 3.box2存放两个水平按钮 */
        box2.add(new Button("水平按钮1"));
        box2.add(new Button("水平按钮2"));
        /* 4.添加box到frame中 */
        frame.add(box1,BorderLayout.SOUTH);
        frame.add(box2);
        frame.setBounds(220,120,400,240);
        frame.setVisible(true);
        while (true);
    }
    @Test
    public void BoxTest3(){
    
    
        Frame frame = new Frame("测试Box的分割");
        Box box1 = new Box(BoxLayout.X_AXIS);   //水平
        Box box2 = new Box(BoxLayout.Y_AXIS);   //垂直
        box1.add(new Button("水平按钮1"));
        box1.add(Box.createHorizontalGlue());   //添加水平分割(可拉伸)
        box1.add(new Button("水平按钮2"));
        box1.add(Box.createHorizontalStrut(20));//添加指定宽度的水平分割
        box1.add(new Button("水平按钮3"));

        box2.add(new Button("垂直按钮1"));
        box2.add(Box.createVerticalGlue()); //添加垂直分割
        box2.add(new Button("垂直按钮2"));
        box2.add(Box.createVerticalStrut(20));//添加指定高度的垂直分割
        box2.add(new Button("垂直按钮3"));

        frame.add(box1,BorderLayout.NORTH);
        frame.add(box2);
        frame.setBounds(220,120,400,240);
        frame.setVisible(true);
        while (true);
    }
}

在这里插入图片描述

五、AWT组件的使用

1、基本组件的使用

组件名 组件功能
Button 按钮
Frame 窗口
Panel 面板,只能放置在其他容器中(如:Frame),不能单独存在
Scrollbar 滚动条
TextArea 多行文本域
TextFirld 单行文本框
Label 标签类,用于放置提示性文本
Canvas 用于绘图的画布
Checkbox 复选框组件(也可以当做单选框组件)
CheckboxGroup 多个Checkbox组成一组CheckboxGroup
Choice 下拉选择框
List 列表框,可添加多条条目
package com.awt.java;

import javax.swing.*;
import java.awt.*;

public class ComponentTest {
    
    
    Frame frame = new Frame("测试基本组件");

    Box box1 = new Box(BoxLayout.X_AXIS);
    Box box2 = new Box(BoxLayout.X_AXIS);
    Box box3 = new Box(BoxLayout.Y_AXIS);
    Box box4 = new Box(BoxLayout.X_AXIS);

    TextArea textArea = new TextArea(5,12);
    TextField textField = new TextField(30);
    Choice choice = new Choice();
    CheckboxGroup checkboxGroup = new CheckboxGroup();
    Checkbox checkbox1 = new Checkbox("男",checkboxGroup,true);
    Checkbox checkbox2 = new Checkbox("女",checkboxGroup,false);
    Checkbox checkbox3 = new Checkbox("是否已婚?");
    Button button = new Button("确认");
    List list = new List(5,false);

    public void Init(){
    
    
        /* box1组装单行文本框和确认按键,放置frame下方 */
        box1.add(textField);
        box1.add(button);
        frame.add(box1,BorderLayout.SOUTH);

        /* box2组装选择框和复选框 */
        choice.add("红色");
        choice.add("绿色");
        choice.add("黄色");
        box2.add(choice);
        box2.add(checkbox1);
        box2.add(checkbox2);
        box2.add(checkbox3);

        /* box3组装box2和多行文本域 */
        box3.add(textArea);
        box3.add(box2);

        /* box4组装box3和列表框 */
        list.add("张三");
        list.add("李四");
        list.add("王五");
        box4.add(box3);
        box4.add(list);

        frame.add(box4,BorderLayout.NORTH);
        frame.pack();
        frame.setVisible(true);
    }
    public static void main(String[] args) {
    
    
        new ComponentTest().Init();
    }
}

在这里插入图片描述

2、普通对话框Dialog的使用

  • Dialog是Windows类的子类,是一个容器类,属于特殊组件,是可独立存在的顶级窗口。
    (也就是说,Dailog可以和前面使用Frame一样,可以添加其他基本组件)
  • 对话框通常依赖其他窗口,也就是通常需要一个父窗口。
  • 对话框有非模式(non-modal)和模式(modal)两种
    ✒️非模式对话框:同模式相反
    ✒️模式对话框:被打开后该对话框只位于父窗口之上,未关闭时父窗口无法操作
  • Dialog( Frame owner,String title,boolean modal );
    ✒️owner:当前对话框的父窗口
    ✒️title:当前对话框的标题
    ✒️modal:当前对话框的模式
package com.awt.java;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class DialogTest {
    
    
    public static void main(String[] args) {
    
    
        Frame frame = new Frame("测试对话框Dialog");
        
        /* 添加两个按钮,一个打开模式对话框,一个打开非模式 */
        Button button1 = new Button("打开模式对话框");
        Button button2 = new Button("打开非模式对话框");
        
        /* 添加两个对话框 */
        Dialog nonModalDailog = new Dialog(frame,"模式对话框",false);
        Dialog modalDailog = new Dialog(frame,"模式对话框",true);
        frame.add(button1,BorderLayout.NORTH);
        frame.add(button2,BorderLayout.SOUTH);
        /* 设置对话框位置大小 */
        nonModalDailog.setBounds(20,30,300,150);
        modalDailog.setBounds(20,30,300,150);

        /* 按钮添加事件监听 */
        button1.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                modalDailog.setVisible(true);
            }
        });
        button2.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                nonModalDailog.setVisible(true);
            }
        });
        
        /* 设置合适大小、可见 */
        frame.pack();
        frame.setVisible(true);
    }
}

3、文件对话框FileDialog的使用

  • FileDialog是Dialog的一个子类,需要注意的是FIleDialog无法想Dialog一样指定模式还是非模式,这是因为FileDialog的实现依赖运行平台,如果平台是模式对话框那么该文件对话框就是模式文件对话框,反之亦然。
  • FileDialog( Frame parent,String title,int mode )
    ✒️parent:指定父窗口
    ✒️title:对话框的标题
    ✒️mode:对话框类型 - FileDialog.LOAD用于打开文件;FileDialog.SAVE用于保存文件
  • getDirectory( ):获取被打开或保存文件的绝对路径
  • getFile( ):获取被打开或保存文件的文件名
package com.awt.java;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class FileDialogTest {
    
    
    public static void main(String[] args) {
    
    
        Frame frame = new Frame("测试文件对话框");
        Box box = new Box(BoxLayout.Y_AXIS);
        Button btnOpen = new Button("打开文件");
        Button btnSave = new Button("保存文件");
        box.add(btnOpen);
        box.add(btnSave);
        frame.add(box);
        
        /* 创建两个文件对话框,打开+保存 */
        FileDialog fileOpen = new FileDialog(frame,"打开文件",FileDialog.LOAD);
        FileDialog fileSave = new FileDialog(frame,"保存文件",FileDialog.SAVE);
        
        /* 添加事件监听 */
        btnOpen.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                fileOpen.setVisible(true);//注意这里会阻塞
                /* 直到弹出对话框的打开按键触发 */
                System.out.println(fileOpen.getDirectory()+fileOpen.getFile());
            }
        });
        btnSave.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                fileSave.setVisible(true);
                System.out.println(fileSave.getDirectory()+fileSave.getFile());
            }
        });

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

4、事件处理机制

(1)基本概念和使用
  • 定义:在某个组件上发生某些操作的时候,会自动触发一段代码的执行
  • 事件源(Event Source):操作发生的场所(如:某个按钮、窗口)—— 开始菜单的关机按钮
  • 事件(Event):在事件源上发生的操作,GUI把事件都封装在一个Event对象中。—— 点击
  • 事件监听器(Event Listener):监听在事件源上发生的事件,并对其进行处理。—— 电脑关机
  • 使用步骤:
    ✒️定义类实现对应的Listener接口,并重写对应的处理方法
    ✒️创建自定义类的对象,传到由该组件调用的注册监听方法
package com.awt.java;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class EventHandingTest {
    
    
    /* 1.定义类实现对应的Listener接口,并重写对应的处理方法 */
    private static class MyListener implements ActionListener{
    
    
        private TextField tf;
        public MyListener(TextField tf){
    
    
            this.tf = tf;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
    
    
            tf.setText("Hello World");
        }
    }
    public static void main(String[] args) {
    
    
        TextField tf = new TextField();

        Button btn = new Button("确认");
        Frame frame = new Frame("测试事件处理");
        frame.add(tf,BorderLayout.NORTH);
        frame.add(btn,BorderLayout.SOUTH);
        /* 2.创建自定义类的对象,传到由该组件调用的注册监听方法 */
        MyListener myListener = new MyListener(tf);
        btn.addActionListener(myListener);

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

在这里插入图片描述

(2)常用的事件
  • 事件分类:①低级事件 ②高级事件
低级事件 监听器 触发方式
ComponentEvent ComponentListener 组件尺寸、位置或显示/隐藏状态改变
ContainerEvent ContainerListener 容器内添加或移除组件时触发
WindowEvent WindowListener 窗口状态变化时(打开、关闭、最大化、最小化)
FocusEvent FocusListener 组件得到焦点或者失去焦点
KeyEvent KeyListener 键盘按键被按下、松开、单击时触发
MouseEvent MouseListener 鼠标单击、移动等动作时触发
PaintEvent PaintListener 组件绘制事件,特殊的事件类型(*)

高级事件 监听器 触发方式
ActionEvent ActionListener 动作事件,当按钮、菜单项被单击或者文本框内按下Enter键
AdjustmentEvent AdjustmentListener 调节事件,滑动条上移动滑块调节数值时触发
ItemEvent ItemListener 选项事件,选中某项或者取消选中时触发
TextEvent TextListener 文本事件,文本框和文本域内发生改变时
(3)使用案例
package com.awt.java;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ListenerTest{
    
    
    private Frame f = new Frame("测试监听器");
    private Box box = new Box(BoxLayout.X_AXIS);
    private Choice choice = new Choice();
    private TextField tf = new TextField(25);
    
    /* 1.第一个监听器:打印下拉选择框每次选择的内容(传统写法)*/
    public class ColorListener implements ItemListener {
    
    
        @Override
        public void itemStateChanged(ItemEvent e) {
    
    
            System.out.println("当前选中的是:"+e.getItem());
        }
    }

    public void init(){
    
    
        choice.add("红色");
        choice.add("绿色");
        choice.add("黄色");
        box.add(choice);
        box.add(tf);
        f.add(box);

        /* 注册监听 */
        ColorListener colorListener = new ColorListener();
        choice.addItemListener(colorListener);
        
        /* 2.第二个监听器:打印输出文本框内容(匿名类写法-可改lambda) */
        tf.addTextListener(new TextListener() {
    
    
            @Override
            public void textValueChanged(TextEvent e) {
    
    
                System.out.println("当前文本框内容是:"+tf.getText());
            }
        });
        
        /* 3.第三个监听器:点击X按钮可退出程序 */
        f.addWindowListener(new WindowAdapter() {
    
    
            @Override
            public void windowClosing(WindowEvent e) {
    
    
                System.exit(0);
            }
        });
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
    
    
        new ListenerTest().init();
    }
}

在这里插入图片描述

5、菜单组件的使用

(1)常用菜单组件体系

在这里插入图片描述

(2)使用案例
  • Menu:菜单,即可以当做容器添加其他菜单项MenuItem,也可以被添加到菜单Menu中(可套娃)
package com.awt.java;


import java.awt.*;
import java.awt.event.KeyEvent;

public class MenuCompTest {
    
    
    public static void main(String[] args) {
    
    
        Frame f = new Frame("测试菜单");
        TextArea ta = new TextArea(15, 60);
        f.add(ta,BorderLayout.SOUTH);

        /* 创建菜单栏MenuBar */
        MenuBar menuBar = new MenuBar();

        /* 创建菜单栏上的菜单Menu */
        Menu fileMenu = new Menu("文件");
        Menu editMenu = new Menu("编辑");
        Menu formatMenu = new Menu("格式"); //这里有子菜单,注意Menu是可以做MenuItem的

        /* 创建菜单元素MenuItem */
        CheckboxMenuItem autoMenu = new CheckboxMenuItem("自动换行");
        MenuItem copyMenu = new MenuItem("复制");
        MenuItem pasteMenu = new MenuItem("粘贴");

        /* 添加分割线 */
        MenuItem commentMenu = new MenuItem("注释",new MenuShortcut(KeyEvent.VK_Q,true));
        MenuItem cancelCommentMenu = new MenuItem("取消注释");

        /* 开始组装,从局部到整体 */
        formatMenu.add(commentMenu);
        formatMenu.add(cancelCommentMenu);
        editMenu.add(autoMenu);
        editMenu.add(copyMenu);
        editMenu.add(pasteMenu);
        editMenu.add(new MenuItem("-"));
        editMenu.add(formatMenu);

        menuBar.add(fileMenu);
        menuBar.add(editMenu);

        f.setMenuBar(menuBar);
        f.pack();
        f.setVisible(true);
    }
}

在这里插入图片描述

六、AWT绘图(暂略)

  • 略过此部分,接着学习Swing。学习AWT只是为了Swing!

猜你喜欢

转载自blog.csdn.net/weixin_54429787/article/details/127460446