zoukankan      html  css  js  c++  java
  • Java学习之AWT GUI编程

    Java学习之AWT GUI编程

    0x00 前言

    既然前面提到了要重写冰蝎和一些反序列化工具,当然就不能随便说说而已。在编写这些工具还是要使用图形化工具来的方便一些,所以提前把GUI的框架给学习一遍。

    其实重写webshell工具这个也就是实现部分,现在就差个gui框架。

    这里其实是已经完善了单向加密和双向加密的功能,并且服务端aes动态密钥加密也写好了,且可以定义128和256位aes的加密。

    Java安全之JSP动静态免杀思路实现与服务端编写

    0x01 AWT概述

    当 JDK 1.0发布时, Sun 提供了 一套基本的GUI类库,这个GUI类库希望可以在所有平台下都能运行 , 这套基本类库被称为"抽象窗口工具集 CAbstract Window Toolkit )",它为Java应用程序提供了基本的图形组件 。 AWT是窗口框架,它从不同平台的窗口系统中抽取出共同组件 , 当程序运行时,将这些组件的创建和动作委托给程序所在的运行平台 。 简而言之 ,当使用 AWT 编写图形界面应用 时, 程序仅指定了界面组件的位置和行为,并未提供真正的实现,JVM调用操作系统本地的图形界面来创建和平台 一致的对等体 。

    ​ 使用AWT创建的图形界面应用和所在的运行平台有相同的界面风格 , 比如在 Windows 操作系统上,它就表现出 Windows 风格 ; 在 UNIX 操作系统上,它就表现出UNIX 风格 。 Sun 希望采用这种方式来实现 " Write Once, Run Anywhere "(一次编写多次运行) 的目标 。

    0x02 AWT体系

    所有和 AWT 编程相关的类都放在 java.awt 包以及它的子包中, AWT 编程中有两个基类 :Component和 MenuComponent。

    Component:代表一个能以图形化方式显示出来,并可与用户交互的对象,例如 Button 代表一个按钮,TextField 代表 一个文本框等;
    
    MenuComponent:则代表图形界面的菜单组件,包括 MenuBar (菜单条)、 Menultem (菜单项)等子类。
    

    多的体系什么的就不看了,主要是实用为主。

    0x03 AWT代码实现

    Frame

    第一个GUI界面

    package com.test;
    
    import java.awt.*;
    
    public class test {
        public static void main(String[] args) {
            Frame frame = new Frame("nwebshell");
            frame.setVisible(true);
            frame.setSize(400,400);
            frame.setLocation(500,500);
        }
    }
    
    

    Panel面板

    Panel可以看成是一个面板,简单来说就是一个容器。

    代码实例:

    package com.test;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class test {
        public static void main(String[] args) {
            Frame frame = new Frame("nwebshell");
            //设置布局
            frame.setLayout(null);
            //窗口可见
            frame.setVisible(true);
            //设置坐标
            frame.setBounds(300,300,500,500);
    
            Panel panel = new Panel();
            //设置panel坐标,相对于frame
            panel.setBounds(50,50,400,400);
            panel.setBackground(new Color(219, 185, 185));
            frame.add(panel);
            //
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    //结束程序
                    System.exit(0);
                }
            });
    
    
    
        }
    }
    
    

    布局管理器

    流式布局

    代码:

    package com.test;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class test {
        public static void main(String[] args) {
            Frame frame = new Frame("nwebshell");
            Button button1 = new Button("submit");
            Button button2 = new Button("submit");
            Button button3 = new Button("submit");
    
            frame.setSize(500,500);
            //设置布局
            frame.setLayout(null);
            //窗口可见
            frame.setVisible(true);
    
            //设置流式布局
            frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
    
    
            //添加按钮
            frame.add(button1);
            frame.add(button2);
            frame.add(button3);
    
    
    
    
    
    
        }
    }
    

    东西南北中布局

    代码:

    package com.test;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class test {
        public static void main(String[] args) {
            Frame frame = new Frame("nwebshell");
            Button button1 = new Button("submit");
            Button button2 = new Button("submit");
            Button button3 = new Button("submit");
            Button button4 = new Button("submit");
            Button button5 = new Button("submit");
    
            frame.setSize(500,500);
    
    
    
            //添加按钮
            frame.add(button1,BorderLayout.EAST);
            frame.add(button2,BorderLayout.WEST);
            frame.add(button3,BorderLayout.SOUTH);
            frame.add(button4,BorderLayout.NORTH);
            frame.add(button5,BorderLayout.CENTER);
            frame.setVisible(true);
    
    
    
    
    
    
    
        }
    }
    
    

    表格布局

    package com.test;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class test {
        public static void main(String[] args) {
            Frame frame = new Frame("nwebshell");
            Button button1 = new Button("submit");
            Button button2 = new Button("submit");
            Button button3 = new Button("submit");
            Button button4 = new Button("submit");
            Button button5 = new Button("submit");
    
            frame.setSize(500,500);
    
    
    //设置表格布局
            frame.setLayout(new GridLayout(3,2));
            frame.add(button1);
            frame.add(button2);
            frame.add(button3);
            frame.add(button4);
            frame.add(button5);
            //自动布局
            frame.pack();
            frame.setVisible(true);
    
    
    
    
    
    
        }
    }
    
    

    文本框

    package com.test;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class test {
        public static void main(String[] args) {
            Frame frame = new Frame("nwebshell");
            Panel panel=new Panel();
            Button button = new Button("submit");
            TextField textField = new TextField();
            textField.setText("普通文本框");
            textField.setVisible(true);
            frame.setVisible(true);
            frame.setSize(500,500);
            panel.add(button);
            panel.add(textField);
    
            frame.add(panel);
    
    
    
        }
    }
    
    

    常用组件

    组件名 功能
    Button Button
    Canvas 用于绘图的画布
    Checkbox 复选框组件(也可当做单选框组件使用)
    CheckboxGroup 用于将多个Checkbox 组件组合成一组, 一组 Checkbox 组件将只有一个可以 被选中 , 即全部变成单选框组件
    Choice 下拉选择框
    Frame 窗口 , 在 GUI 程序里通过该类创建窗口
    Label 标签类,用于放置提示性文本
    List JU表框组件,可以添加多项条目
    Panel 不能单独存在基本容器类,必须放到其他容器中
    Scrollbar 滑动条组件。如果需要用户输入位于某个范围的值 , 就可以使用滑动条组件 ,比如调 色板中设置 RGB 的三个值所用的滑动条。当创建一个滑动条时,必须指定它的方向、初始值、 滑块的大小、最小值和最大值。
    ScrollPane 带水平及垂直滚动条的容器组件
    TextArea 多行文本域
    TextField 单行文本框

    对话框 Dialog

    方法名称 方法功能
    Dialog(Frame owner, String title, boolean modal) 创建一个对话框对象:
    owner:当前对话框的父窗口
    title:当前对话框的标题
    modal:当前对话框是否是模式对话框,true/false
    package com.test;
    
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class test {
        public static void main(String[] args) {
            Frame frame = new Frame("nwebshell");
    
            final Dialog d1 = new Dialog(frame, "command", true);
            final Dialog d2 = new Dialog(frame, "connection", true);
    //        往对话框中添加内容
            Box vBox = Box.createVerticalBox();
            vBox.add(new TextField(15));
            vBox.add(new Button("submit"));
            d1.add(vBox);
    //        设置对话框大小
            Button b1 = new Button("open");
            Button b2 = new Button("close");
    //        给b1按钮绑定事件
            d1.setBounds(20,30,300,100);
            d2.setBounds(20,30,300,400);
    
            b1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    d1.setVisible(true);
                }
            });
            b2.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    d2.setVisible(true);
                }
            });
            //把按钮添加到frame中
            frame.add(b1);
            frame.add(b2,BorderLayout.SOUTH);
            //设置frame最佳大小并可见
            frame.pack();
            frame.setVisible(true);
            frame.setSize(1024,700);
    
    
    
    
        }
    }
    
    

    FileDialog

    Dialog 类还有 一个子类 : FileDialog ,它代表一个文件对话框,用于打开或者保存 文件,需要注意的是FileDialog无法指定模态或者非模态,这是因为 FileDialog 依赖于运行平台的实现,如果运行平台的文件对话框是模态的,那么 FileDialog 也是模态的;否则就是非模态的 。

    方法名称 方法功能
    FileDialog(Frame parent, String title, int mode) 创建一个文件对话框:
    parent:指定父窗口
    title:对话框标题
    mode:文件对话框类型,如果指定为FileDialog.load,用于打开文件,如果指定为FileDialog.SAVE,用于保存文件
    String getDirectory() 获取被打开或保存文件的绝对路径
    String getFile() 获取被打开或保存文件的文件名

    代码:

    package com.test;
    
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class test {
        public static void main(String[] args) {
            Frame frame = new Frame("nwebshell");
    //        加载文件
            final FileDialog load_file = new FileDialog(frame, "load_file", FileDialog.LOAD);
            final FileDialog save_file = new FileDialog(frame, "save_file", FileDialog.SAVE);
            Button open_file_b = new Button("open_file");
            Button save_file_b = new Button("save_file");
            //给按钮添加事件
    
            open_file_b.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    load_file.setVisible(true);
    //                打印用户选择的文件路径和名称
                    System.out.println(load_file.getDirectory());
                    System.out.println(load_file.getFile());
    
                }
            });
            save_file_b.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println(save_file.getDirectory());
                    System.out.println(save_file.getFile());
    
                }
            });
    //        配置完按钮事件,将按钮添加到frame中
            frame.add(open_file_b);
            frame.add(save_file_b,BorderLayout.SOUTH);
            frame.pack();
            frame.setVisible(true);
    
        }
    }
    
    

    事件监听器

    定义:

    ​ 当在某个组件上发生某些操作的时候,会自动的触发一段代码的执行。

    在GUI事件处理机制中涉及到4个重要的概念需要理解:

    事件源(Event Source):操作发生的场所,通常指某个组件,例如按钮、窗口等;
    事件(Event):在事件源上发生的操作可以叫做事件,GUI会把事件都封装到一个Event对象中,如果需要知道该事件的详细信息,就可以通过Event对象来获取。
    事件监听器(Event Listener):当在某个事件源上发生了某个事件,事件监听器就可以对这个事件进行处理。

    注册监听:把某个事件监听器(A)通过某个事件(B)绑定到某个事件源(C)上,当在事件源C上发生了事件B之后,那么事件监听器A的代码就会自动执行。

    package com.test;
    
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class test {
        Frame frame = new Frame("nwebshell");
    
    
        Button button = new Button("submit");
        TextField textField = new TextField(30);
        public void init(){
    
            button.addActionListener(new MyActionLitst());
            frame.add(textField);
            frame.add(button,BorderLayout.SOUTH);
            frame.pack();
            frame.setVisible(true);
    
        }
        private class MyActionLitst implements ActionListener{
    
            @Override
            public void actionPerformed(ActionEvent e) {
                textField.setText("Hello World");
            }
    
    
        }
    
        public static void main(String[] args) {
            new test().init();
        }
        }
    

    代码二:

    package com.test;
    
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class test {
        public static void main(String[] args) {
            Frame frame = new Frame("nwebshell");
            final TextField textField = new TextField(30);
            textField.addTextListener(new TextListener() {
                @Override
                public void textValueChanged(TextEvent e) {
                    System.out.println(textField.getText());
                }
            });
            frame.add(textField);
            frame.pack();
            frame.setVisible(true);
        }
    
    
    
    
    
        }
    
    
    

    菜单组件

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class SimpleMenu {
        //创建窗口
        private Frame frame = new Frame("这里测试菜单相关组件");
        //创建菜单条组件
        private MenuBar menuBar = new MenuBar();
        //创建文件菜单组件
        private Menu fileMenu = new Menu("文件");
        //创建编辑菜单组件
        private Menu editMenu = new Menu("编辑");
        //创建新建菜单项
        private MenuItem newItem = new MenuItem("新建");
        //创建保存菜单项
        private MenuItem saveItem = new MenuItem("保存");
        //创建退出菜单项
        private MenuItem exitItem = new MenuItem("退出");
    
        //创建自动换行选择框菜单项
        private CheckboxMenuItem autoWrap = new CheckboxMenuItem("自动换行");
    
        //创建复制菜单项
        private MenuItem copyItem = new MenuItem("复制");
    
        //创建粘贴菜单项
        private MenuItem pasteItem = new MenuItem("粘贴");
    
        //创建格式菜单
        private Menu formatMenu = new Menu("格式");
    
        //创建注释菜单项
        private MenuItem commentItem = new MenuItem("注释");
        //创建取消注释菜单项
        private MenuItem cancelItem = new MenuItem("取消注释");
    
        //创建一个文本域
        private TextArea ta = new TextArea(6, 40);
    
        public void init(){
    
    
            //定义菜单事件监听器
            ActionListener listener = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String command = e.getActionCommand();
                    ta.append("单击“"+command+"”菜单
    ");
                    if (command.equals("退出")){
                        System.exit(0);
                    }
                }
            };
    
            //为注释菜单项和退出菜单项注册监听器
            commentItem.addActionListener(listener);
            exitItem.addActionListener(listener);
    
            //为文件菜单fileMenu添加菜单项
            fileMenu.add(newItem);
            fileMenu.add(saveItem);
            fileMenu.add(exitItem);
    
            //为编辑菜单editMenu添加菜单项
            editMenu.add(autoWrap);
            editMenu.add(copyItem);
            editMenu.add(pasteItem);
    
            //为格式化菜单formatMenu添加菜单项
            formatMenu.add(commentItem);
            formatMenu.add(cancelItem);
    
            //将格式化菜单添加到编辑菜单中,作为二级菜单
            editMenu.add(new MenuItem("-"));
            editMenu.add(formatMenu);
    
    
            //将文件菜单和编辑菜单添加到菜单条中
            menuBar.add(fileMenu);
            menuBar.add(editMenu);
    
    
            //把菜单条设置到frame窗口上
            frame.setMenuBar(menuBar);
    
            //把文本域添加到frame中
            frame.add(ta);
    
            //设置frame最佳大小并可见
            frame.pack();
            frame.setVisible(true);
        }
    
    
        public static void main(String[] args) {
            new SimpleMenu().init();
        }
    }
    
    

    PopupMenu

    import java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    public class PopupMenuTest {
    
        private Frame frame = new Frame("这里测试PopupMenu");
    
        //创建PopubMenu菜单
        private PopupMenu popupMenu = new PopupMenu();
    
        //创建菜单条
    
        private MenuItem commentItem = new MenuItem("注释");
        private MenuItem cancelItem = new MenuItem("取消注释");
        private MenuItem copyItem = new MenuItem("复制");
        private MenuItem pasteItem = new MenuItem("保存");
    
    
        //创建一个文本域
        private TextArea ta = new TextArea("!!!", 6, 40);
    
        //创建一个Panel
        private  Panel panel = new Panel();
    
        public void init(){
    
            //把菜单项添加到PopupMenu中
            popupMenu.add(commentItem);
            popupMenu.add(cancelItem);
            popupMenu.add(copyItem);
            popupMenu.add(pasteItem);
    
            //设置panel大小
            panel.setPreferredSize(new Dimension(300,100));
    
            //把PopupMenu添加到panel中
            panel.add(popupMenu);
    
            //为panel注册鼠标事件
            panel.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseReleased(MouseEvent e) {
                    boolean flag = e.isPopupTrigger();
                    //判断当前鼠标操作是不是触发PopupMenu的操作
                    if (flag){
                        //让PopupMenu显示在panel上,并且跟随鼠标事件发生的地方显示
                        popupMenu.show(panel,e.getX(),e.getY());
                    }
                }
            });
    
            //把ta添加到frame中间区域中
    
            frame.add(ta);
    
            //把panel添加到frame底部
            frame.add(panel,BorderLayout.SOUTH);
    
            //设置frame最佳大小,并可视;
            frame.pack();
            frame.setVisible(true);
    
        }
    
        public static void main(String[] args) {
            new PopupMenuTest().init();
        }
    
    }
    

    0x04 结尾

    其实,在开发中会发现,Java写gui界面真挺繁杂的。配置页面都得手工去适配,就没有像C#这些这么方便,直接画框,配置事件就完事了。AWT这个类其实不能够做到跨平台,因为他是借助windows的界面。后面会接着学习Swing框架。

  • 相关阅读:
    IE10、IE11下SCRIPT5009: “__doPostBack”未定义
    CSS Hack大全-可区分出IE6-IE10、FireFox、Chrome、Opera
    HTML head 头标签
    html5匹配不同分辨率样式
    html5关键帧动画,一个小例子快速理解关键帧动画
    导入Excel到数据库
    JavaScript树(一) 简介
    深入解析浏览器的幕后工作原理(五) 呈现树
    深入解析浏览器的幕后工作原理(四) DOM树
    深入解析浏览器的幕后工作原理(三) 呈现树和 DOM 树的关系
  • 原文地址:https://www.cnblogs.com/nice0e3/p/14008800.html
Copyright © 2011-2022 走看看