GUI编程

组件

  • 窗口

  • 弹窗

  • 面板

  • 文本框

  • 列表框

  • 按钮

  • 图片

  • 监听事件

  • 鼠标

  • 键盘事件

  • 破解工具

1、简介

Gui的核心技术:Swing、AWT

2、AWT

2.1、AWT介绍

1.包含了很多类和接口! GUI:图形用户界面编程

Eeclipse:Java

2.元素:窗口,按钮,文本框

3.java.awt

4.

2.2、组件和容器

2.2.1 Frame

public class TextFrame {
   public static void main(String[] args) {
       //Frame对象
       Frame frame = new Frame("我的第一个Java图形界面窗口");
       //设置可见性
       frame.setVisible(true);
       //设置窗口大小
       frame.setSize(400,400);
       //窗口背景颜色
       frame.setBackground(new Color(78, 61, 151));
       //弹出的初始位置
       frame.setLocation(200,200);
       //设置大小固定
       frame.setResizable(false);
  }
}

问题:发现窗口关闭不掉,终止Java程序运行

尝试回顾封装:

package com.sgd.lesson01;

import java.awt.*;

/**
* @author 邵国栋
* @function:
* @date 2021年07月02日 9:11
*/
public class TestFrame_ {
   public static void main(String[] args) {
       //展示多个窗口

       MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, Color.CYAN);
       MyFrame myFrame2 = new MyFrame(300, 100, 200, 200, Color.GREEN);
       MyFrame myFrame3 = new MyFrame(100, 300, 200, 200, Color.PINK);
  }
}

class MyFrame extends Frame {
   static int id = 0;//肯能存在多个窗口,需要一个计数器

   public MyFrame(int x, int y, int w, int h, Color color) {
       super("MyFrame+" + (id++));
       setBackground(color);
       setBounds(x, y, w, h);
       setVisible(true);
       setResizable(false);
  }
}

2.2.2 面板Panel

解决了关闭事件

package com.sgd.lesson01;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

/**
* @author 邵国栋
* @function:面板Panel的练习
* @date 2021年07月02日 9:49
*/
//可看成空间,但不能单独存在
public class TestPanel {
   public static void main(String[] args) {
       Frame frame = new Frame();
       //布局
       Panel panel = new Panel();
       //设置布局
       frame.setLayout(null);
       //坐标
       frame.setBounds(300, 300, 500, 500);
       frame.setBackground(new Color(65, 191, 18));
       //panel坐标,相对于frame
       panel.setBounds(50, 50, 400, 400);
       panel.setBackground(new Color(10, 101, 10));
       //frame.add(panel);
       frame.add(panel);
       frame.setResizable(false);
       frame.setVisible(true);
       //监听事件,监听窗口关闭事件 System.exit(0);
       //适配器模式:
       frame.addWindowListener(new WindowAdapter() {
           //窗口点击关闭时要做的事情
           @Override
           public void windowClosing(WindowEvent e) {
               //结束程序
               System.exit(0);
          }
      });


  }
}

2.2.3 布局管理器

  • 流式布局

package com.sgd.lesson01;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
* @author 邵国栋
* @function:流式布局的练习
* @date 2021年07月02日 15:48
*/
public class TestFlowLayout {
   public static void main(String[] args) {
       Frame frame = new Frame();
       frame.setLocation(500,500);
       //按钮--组件
       Button button1 = new Button("Button1");
       Button button2 = new Button("Button2");
       Button button3 = new Button("Button3");
       //流式布局的定义
       //自定义为中 frame.setLayout(new FlowLayout());
       //自定义为中
       frame.setLayout(new FlowLayout(FlowLayout.LEFT));
       //弹窗尺寸的定义
       frame.setSize(200, 200);
       //弹窗可视性的定义
       frame.setVisible(true);
       //加入按钮
       frame.add(button1);
       frame.add(button2);
       frame.add(button3);
       //窗口关闭操作
       frame.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               System.exit(0);
          }
      });

  }
}

  • 东西南北中

package com.sgd.lesson01;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
* @author 邵国栋
* @function:东西南北中式布局
* @date 2021年07月02日 16:55
*/
public class TestBorderLayout {
   public static void main(String[] args) {

       Frame frame = new Frame("TestBorderLayout");

       frame.setVisible(true);

       frame.setLocation(200, 200);

       frame.setSize(500, 500);

       frame.setBackground(new Color(104, 16, 16));

       Button east = new Button("East");
       Button west = new Button("West");
       Button south = new Button("South");
       Button north = new Button("North");
       Button center = new Button("Center");

       frame.add(east, BorderLayout.EAST);
       frame.add(west, BorderLayout.WEST);
       frame.add(south, BorderLayout.SOUTH);
       frame.add(north, BorderLayout.NORTH);
       frame.add(center, BorderLayout.CENTER);

       frame.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               System.exit(0);
          }
      });

  }
}

  • 表格布局 Grid

package com.sgd.lesson01;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
* @author 邵国栋
* @function:表格布局
* @date 2021年07月02日 17:10
*/
public class TestGridLayout {
   public static void main(String[] args) {
       Frame frame = new Frame("TestGridLayout");
       Button btn1 = new Button("btn1");
       Button btn2 = new Button("btn2");
       Button btn3 = new Button("btn3");
       Button btn4 = new Button("btn4");
       Button btn5 = new Button("btn5");
       Button btn6 = new Button("btn6");

       frame.setLayout(new GridLayout(3,2));

       frame.add(btn1);
       frame.add(btn2);
       frame.add(btn3);
       frame.add(btn4);
       frame.add(btn5);
       frame.add(btn6);

       frame.pack();//Java函数:布局自动优化;
       frame.setVisible(true);

       frame.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               System.exit(0);
          }
      });


  }
}

练习:

package com.sgd.lesson01;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
* @author 邵国栋
* @function:
* @date 2021年07月02日 17:25
*/
public class Exercise1 {
   public static void main(String[] args) {
       Frame frame = new Frame("Exercise");
       frame.setVisible(true);
       frame.setLocation(100, 100);
       frame.setSize(300, 400);
       frame.setResizable(false);
       Panel p1 = new Panel();
       Panel p2 = new Panel();
       Panel p3 = new Panel();
       Panel p4 = new Panel();

       frame.setLayout(new GridLayout(2, 1));
       p1.setLayout(new BorderLayout());
       p2.setLayout(new GridLayout(2, 1));
       p3.setLayout(new BorderLayout());
       p4.setLayout(new GridLayout(2, 2));

       p1.add(new Button("but1"), BorderLayout.WEST);
       p1.add(new Button("but2"), BorderLayout.EAST);
       p2.add(new Button("p2-but.1"));
       p2.add(new Button("p2-but.2"));
       p1.add(p2, BorderLayout.CENTER);

       p3.add(new Button("but3"), BorderLayout.WEST);
       p3.add(new Button("but4"), BorderLayout.EAST);
       p4.add(new Button("p4-but.1"));
       p4.add(new Button("p4-but.2"));
       p4.add(new Button("p4-but.3"));
       p4.add(new Button("p4-but.4"));
       p3.add(p4, BorderLayout.CENTER);

       frame.add(p1);
       frame.add(p3);
       frame.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               System.exit(0);
          }
      });
     

  }
}

总结:

  1. Frame是顶级窗口

  2. Panel必须添加在某个容器中显示

2.2.4 事件监听

事件监听:当某个事情发生的时候,干什么?

package com.sgd.lesson02;

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

/**
* @author 邵国栋
* @function:对监听的练习
* @date 2021年07月03日 9:50
*/

public class TestActionEvent {
   public static void main(String[] args) {
       //按下按钮,触发一些事件
       Button button = new Button("but");
       Frame frame = new Frame("监听事件");
       //流式分布
       frame.setLayout(new FlowLayout());
       //是否可改变窗口
       frame.setResizable(false);
       //可见性
       frame.setVisible(true);
       //初始位置
       frame.setLocation(100, 100);
       //窗口大小
       frame.setSize(300, 500);
       //添加按钮去窗口
       frame.add(button);
       //自己调节美观
       frame.pack();

       MyActionListener myActionListener = new MyActionListener();
       button.addActionListener(myActionListener);
       frameClose(frame);

  }
   //关闭窗口的事件
   private static void frameClose(Frame frame){
       frame.addWindowListener(new WindowAdapter() {
           @Override
           public void windowClosing(WindowEvent e) {
               System.exit(0);
          }
      });
  }
}
//事件监听
class MyActionListener implements ActionListener {
   @Override
   public void actionPerformed(ActionEvent e) {
       System.out.println("OK!");
  }
}

两个按钮实现同一个监听:

package com.sgd.lesson02;

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

/**
* @author 邵国栋
* @function:两个按钮实现同一个监听: 开始、关闭
* @date 2021年07月19日 17:21
*/
public class TextActionTwo {
public static void main(String[] args) {
Frame frame = new Frame("开始 -- 关闭");
frame.setSize(400, 500);
frame.setLocation(200, 200);
frame.setResizable(false);
frame.setVisible(true);
frame.setBackground(new Color(20, 202, 20));
frame.setLayout(new FlowLayout(FlowLayout.CENTER));
Button button1 = new Button("start");
Button button2 = new Button("stop");

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

MyMonitor myMonitor = new MyMonitor();
//可以显示的定义触发会返回的命令,如果不显示定义,则会走默认的值 (stop) !
//可以多个按钮只写一个监听类
button2.setActionCommand("button2-stop");

button1.addActionListener(myMonitor);
button2.addActionListener(myMonitor);

WindowClose(frame);
}

private static void WindowClose(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}

class MyMonitor implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//e.getActionCommand() -> 获取按钮上的一些信息
System.out.println("按钮被点击了,msg:" + e.getActionCommand());
//可根据按钮判断不同信息的输出
if (e.getActionCommand().equals("start")) {
System.out.println("start");
} else if (e.getActionCommand().equals("stop")) {
System.out.println("stop");
} else if(e.getActionCommand().equals("button2-stop")){
System.out.println("button2-stop");
}
}
}

2.2.5 输入框 TextField 监听

package com.sgd.lesson02;

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

/**
* @author 邵国栋
* @function:对GUI文本框的练习
* @date 2021年07月20日 15:35
*/
public class TextField01 {
public static void main(String[] args) {
//启动!
MyFrame myFrame = new MyFrame();

}
}
class MyFrame extends Frame{
public MyFrame(){
TextField textField = new TextField();
add(textField);

//设置替换编码
textField.setEchoChar('*');

setVisible(true);
pack();

//监听这个文本框输入的文字
MyActionListener02 myActionListener02 = new MyActionListener02();
//按下Enter就会触发这个输入框的事件
textField.addActionListener(myActionListener02);
}
}
class MyActionListener02 implements ActionListener{

@Override
public void actionPerformed(ActionEvent e) {

//获得一些资源,返回的一个对象
TextField field=(TextField) e.getSource();
System.out.println(field.getText());//获得输入框中的文本
field.setText("");//null ""
}
}

2.2.6 简单计算器,组合+内部类回顾复习!

oop原则:组合,大于继承!


目前代码:

package com.sgd.lesson02;

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

/**
* @author 邵国栋
* @function:简易计算器的实现
* @date 2021年07月21日 10:03
*/
public class calExercise {
public static void main(String[] args) {
Calculator calculator = new Calculator();
WindowClose(calculator);
}

private static void WindowClose(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}

//计算器类
class Calculator extends Frame {
public Calculator() {
//3个文本框
TextField num01 = new TextField(10);//字符数
TextField num02 = new TextField(10);
TextField num03 = new TextField(20);
// 1个按钮
Button button = new Button("=");

button.addActionListener(new MyActionListener03(num01, num02, num03));

// 1个标签
Label label = new Label("+");

//流式布局
setLayout(new FlowLayout());
add(num01);
add(label);
add(num02);
add(button);
add(num03);
pack();

setVisible(true);
}
}

//监听器类
class MyActionListener03 implements ActionListener {
//获取3个变量
private TextField num01, num02, num03;

public MyActionListener03(TextField num01, TextField num02, TextField num03) {
this.num01 = num01;
this.num02 = num02;
this.num03 = num03;
}

@Override
public void actionPerformed(ActionEvent e) {
//1.获得两个加数
int n1 = Integer.parseInt(num01.getText());
int n2 = Integer.parseInt(num02.getText());
//2.运算后填到第3个框
num03.setText("" + (n1 + n2));
//3.清除前两个框
num01.setText("");
num02.setText("");
}
}

完全改造为面向对象:

package com.sgd.lesson02;

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

/**
* @author 邵国栋
* @function:简易计算器的实现
* @date 2021年07月21日 10:03
*/
public class calExercise {
public static void main(String[] args) {
Calculator calculator = new Calculator();
calculator.loadFrame();
WindowClose(calculator);
}

//窗口监听
private static void WindowClose(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}

//计算器类
class Calculator extends Frame {

TextField num01, num02, num03;

public void loadFrame() {
//3个文本框
num01 = new TextField(10);//字符数
num02 = new TextField(10);
num03 = new TextField(20);
// 1个按钮
Button button = new Button("=");

button.addActionListener(new MyActionListener03(this));

// 1个标签
Label label = new Label("+");

//流式布局
setLayout(new FlowLayout());
add(num01);
add(label);
add(num02);
add(button);
add(num03);
pack();

setVisible(true);
}
}

//监听器类
class MyActionListener03 implements ActionListener {
//获取计算器这个对象
Calculator calculator = null;
//private TextField num01, num02, num03;

public MyActionListener03(Calculator calculator) {
this.calculator = calculator;
}

@Override
public void actionPerformed(ActionEvent e) {
//1.获得两个加数
int n1 = Integer.parseInt(calculator.num01.getText());
int n2 = Integer.parseInt(calculator.num02.getText());
//2.运算后填到第3个框
calculator.num03.setText("" + (n1 + n2));
//3.清除前两个框
calculator.num01.setText("");
calculator.num02.setText("");
}
}

内部类:

  • 更好的包装

package com.sgd.lesson02;

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

/**
* @author 邵国栋
* @function:简易计算器的实现
* @date 2021年07月21日 10:03
*/
public class calExercise {
public static void main(String[] args) {
Calculator calculator = new Calculator();
calculator.loadFrame();
WindowClose(calculator);
}

//窗口监听
private static void WindowClose(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}

//计算器类
class Calculator extends Frame {

TextField num01, num02, num03;

public void loadFrame() {
//3个文本框
num01 = new TextField(10);//字符数
num02 = new TextField(10);
num03 = new TextField(20);
// 1个按钮
Button button = new Button("=");

button.addActionListener(new MyActionListener03());

// 1个标签
Label label = new Label("+");

//流式布局
setLayout(new FlowLayout());
add(num01);
add(label);
add(num02);
add(button);
add(num03);
pack();

setVisible(true);
}
private class MyActionListener03 implements ActionListener {
/*
//获取计算器这个对象
Calculator calculator = null;
//private TextField num01, num02, num03;

public MyActionListener03(Calculator calculator) {
this.calculator = calculator;
}
*/

@Override
public void actionPerformed(ActionEvent e) {
//1.获得两个加数
int n1 = Integer.parseInt(num01.getText());
int n2 = Integer.parseInt(num02.getText());
//2.运算后填到第3个框
num03.setText("" + (n1 + n2));
//3.清除前两个框
num01.setText("");
num02.setText("");
}
}
}

//监听器类
class MyActionListener03 implements ActionListener {
/*
//获取计算器这个对象
Calculator calculator = null;
//private TextField num01, num02, num03;

public MyActionListener03(Calculator calculator) {
this.calculator = calculator;
}
*/

@Override
public void actionPerformed(ActionEvent e) {
//1.获得两个加数
int n1 = Integer.parseInt(num01.getText());
int n2 = Integer.parseInt(num02.getText());
//2.运算后填到第3个框
num03.setText("" + (n1 + n2));
//3.清除前两个框
num01.setText("");
num02.setText("");
}
}

2.2.7 画笔

package com.sgd.lesson03;

import java.awt.*;

/**
* @author 邵国栋
* @function:画笔练习
* @date 2021年07月26日 15:13
*/
public class TextPaint {
public static void main(String[] args) {
MyPaint myPaint = new MyPaint();
myPaint.loadFrame();
}
}

class MyPaint extends Frame {
public void loadFrame() {
setBounds(200,200,600,500);
setVisible(true);
}

@Override
public void paint(Graphics g) {

//super.paint(g);
//画笔需要有颜色,可以画画
g.setColor(Color.red);
g.drawOval(100,100,100,100);
g.fillOval(200,200,100,100);//实心的圆
g.setColor(Color.green);
g.fillRect(150,200,200,200);
//养成习惯,将画笔还原成最初的颜色

}
}

2.2.8 鼠标监听

目的:想要实现鼠标画画

2.2.9 窗口监听

2.2.10 键盘监听

3、Swing

GUI图形界面编程(Java)的更多相关文章

  1. Java基础(二十三)GUI图形界面编程(Java基础完)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  2. java之 22天 GUI 图形界面编程(一)

    转自:http://takeme.iteye.com/blog/1876850 GUI(图形用户界面) import java.awt.Button; import java.awt.FlowLayo ...

  3. java之 22天 GUI 图形界面编程(二)

    转自:http://takeme.iteye.com/blog/1876853 模拟window开打文件 import java.awt.Button; import java.awt.Dialog; ...

  4. Java中的图形界面编程

    前言 正文 Java中的图形界面编程 AWT/Swing AWT(Abstract Window ToolKits,抽象窗体工具集) 1.容器类:用来存储组件,实现容器布局 2.组件类:实现界面的一些 ...

  5. Quartz(GUI)图形界面程序----Quartz Web

    下载.设置和运行Quartz(GUI)图形界面程序----Quartz Web 一.获取Quartz Web程序(Quartz GUI).早期的 Quartz 框架开发者意识到一个 GUI 对于某类用 ...

  6. 图形界面编程成就了C++

    听有人说C#.VB比C++好是因为做界面方便还算傻得可爱,听有人说用C++做数值计算而不屑于做界面可就对不起咱C++的恩人了.这我可要说道说道. 想当年C++刚出江湖,名门出身,自立门派,想抢Obje ...

  7. Linux C 程序 GTK+图形界面编程(22)

    GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...

  8. centOS7下安装GUI图形界面

    1.如何在centOS7下安装GUI图形界面 当你安装centOS7服务器版本的时候,系统默认是不会安装GUI的图形界面程序,这个需要手动安装CentOS7 Gnome GUI包. 2.在系统下使用命 ...

  9. CentOS7安装GUI图形界面

    本文转自centOS7下安装GUI图形界面,侵权删. 1. 在命令行下 输入下面的命令来安装Gnome包. # yum groupinstall "GNOME Desktop" & ...

  10. CentOS7 下安装GUI图形界面GNOME

    在安装Gnome包之前,需要检查一下网络是否有网络(使用ping www.baidu.com) 一.先装X windows,-y表示参数同意所有软件安装操,当出现 Complete!说明这里安装成功了 ...

随机推荐

  1. 【MySQL】求和查询,目标值int,但空数据时返回null的问题(Java)

    问题分析 int selectDeviceMonthRepairCount(String deviceType, String month); <select id="selectDe ...

  2. 【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框

    [重要]不要边看文本边操作,本文由错误纠正,先看完一遍再说. 要使用的FFmpeg命令 ffmpeg -list_devices true -f dshow -i dummy 会输出的信息 通过正则取 ...

  3. Ubuntu sudo nopasswd方法

    1 运行 visudo 2 假设用户名为yourname, 则在最后一行添加: # User privilege specificationroot ALL=(ALL:ALL) ALL# Member ...

  4. Specifications动态查询

    [前言说明] 针对CRUD种的查询,因为我们的查询总是具有各种各样的筛选条件 为了我们的程序能够更加适应筛选条件的变化,SpringDataJpa提供了Specifications这种解决方案 Spe ...

  5. Spring Boot 2.4 中文

    Spring Boot 2.4 中文 https://runebook.dev/zh-CN/docs/spring_boot/spring-boot-features

  6. Qt编写跨平台视频监控系统(64通道占用7%CPU/支持win_linux_mac等)

    一.前言 视频监控组件经历过数十年的迭代,从最初的只简单播放个rtsp视频流,到现在支持各种音频视频文件格式(mp3.wav.mp4.asf.rm.rmvb.mkv等).支持各种视频流格式(rtp.r ...

  7. [转]VS2019生成项目文件.lib或.dll或exe后如何拷贝到指定的目录文件夹

    VS2019编译CloudCompare,发现生成的项目文件都是分开的,每个项目下都有自己的文件夹Debug/Release,生成Dll都放在这些单独的项目文件夹内. 目标 (1)通常,我们要求所有的 ...

  8. Java GUI控件SwingX之JXTaskPane的使用示例

    JXTaskPane 类似XP 左边的导航栏,在开发Swing应用的时候很好用的.下面两张截图反应了JXTaskPane的动画效果.可以自由的卷起和展开.   JXTaskPane的的使用步骤:1.新 ...

  9. 收藏几个常用的vue自定义组件,抄自 他人,以防丢失

    在 Vue,除了核心功能默认内置的指令 ( v-model 和 v-show ),Vue 也允许注册自定义指令.它的作用价值在于当开发人员在某些场景下需要对普通 DOM 元素进行操作. Vue自定义指 ...

  10. CyclicBarrier底层实现和原理

    1.CyclicBarrier 字面意思是可循环(Cyclic)使用的屏障(Barrier).它要做的事情是让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时候,屏障才会开门.所有被 ...