GUI图形界面编程(Java)


GUI编程

组件

  • 窗口

  • 弹窗

  • 面板

  • 文本框

  • 列表框

  • 按钮

  • 图片

  • 监听事件

  • 鼠标

  • 键盘事件

  • 破解工具

1、简介

Gui的核心技术:Swing、AWT

2、AWT

2.1、AWT介绍

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

Eeclipse:Java

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

3.java.awt

4.image-20210625174228935

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

image-20210625181132142

问题:发现窗口关闭不掉,终止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);
  }
}

image-20210702094233218

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


  }
}

image-20210702105741678

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

  }
}

image-20210702164932065

  • 东西南北中

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

  }
}

image-20210702170857625

 

  • 表格布局 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);
          }
      });


  }
}

image-20210702172341388

练习:

image-20210703091026560

 

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

  }
}

image-20210703091115262

总结:

  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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM