java awt编程_Java学习之AWT GUI编程

Java学习之AWT GUI编程

0x00 前言

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

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

f41a5470f6049cb4c8710bb2de25fac1.png

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

a9344a1881db6be79ae224ebd39fd888.png

4f23499a4ad543eb9a6b33269ffd2a37.png

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 (菜单项)等子类。

660c934df31fad0d5843b4ffb9f909e1.png

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

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);

}

}

2330b6a19edb5a92a9c762c23530526f.png

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);

}

});

}

}

48672fb622cf2ec35663e2d021d26963.png

布局管理器

流式布局

代码:

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);

}

}

5f1d30891bc15648f0d7bf74b5831899.png

东西南北中布局

代码:

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);

}

}

7d90f124491fa5c0db29e938537672d3.png

表格布局

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);

}

}

8ebe6ab59766eeefeb1aed9a36a7e8b2.png

文本框

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);

}

}

8081a81f11d132a70ffe216b7105d172.png

常用组件

组件名

功能

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);

}

}

025b0fe0511152e82bd9cb4fa3d97267.png

330690cf810a36e1da43fdf956284045.png

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);

}

}

e7266e7d5a6538a506f1011683247635.png

事件监听器

定义:

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

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

事件源(Event Source):操作发生的场所,通常指某个组件,例如按钮、窗口等;

事件(Event):在事件源上发生的操作可以叫做事件,GUI会把事件都封装到一个Event对象中,如果需要知道该事件的详细信息,就可以通过Event对象来获取。

事件监听器(Event Listener):当在某个事件源上发生了某个事件,事件监听器就可以对这个事件进行处理。

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

52d363e58a637593a6200f2008b0999f.png

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();

}

}

3dee6d3a343e8125b08cec94a20a1fe4.png

代码二:

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);

}

}

c86f305770128201659136b68e9a09fb.png

菜单组件

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+"”菜单\n");

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框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值