JAVA入坑之GUI编程

news2024/12/23 15:25:27

一、相关概述

GUI编程是指通过图形化的方式来实现计算机程序的编写,它可以让用户通过鼠标、键盘等设备来操作计算机,而不是通过命令行来输入指令。在Java中,GUI编程主要使用的是Swing和AWT两种技术

二、AWT

2.1介绍

AWT是Java提供的用来建立和设置Java的图形用户界面的基本工具,它提供了一套与本地图形界面进行交互的接口12。AWT的图形函数与操作系统提供的图形函数有着一一对应的关系,也就是说,当使用AWT时,Java程序会调用操作系统的图形函数来绘制界面

2.2组件和容器

容器是Component的子类,一个容器可以容纳多个组件,并使他们成为一个整体。容器可以简化图形化界面的设计,以整体结构来布置界面,所有的组件都可以通过add()方法加入容器中。

组件

  • 窗口
  • 弹窗
  • 面板
  • 文本框
  • 列表框
  • 按钮
  • 图片
  • 监听事件
  • 鼠标
  • 键盘事件
  • 破解工具

2.2.1窗口(Frame)

package com.tanchise;

import java.awt.*;


public class FirstFrame extends Frame{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FirstFrame fr = new FirstFrame("Hello world!"); //构造方法
        fr.setSize(240,240);  //设置Frame的大小
        fr.setBackground(Color.blue); //设置Frame的背景色
        fr.setLocation(200,200);//弹出初始位置
        fr.setVisible(true); //设置Frame为可见,默认不可见
        fr.setResizable(false);//设置Frame大小固定
    }

    public FirstFrame(String str){
        super(str);
    }

}

 效果图

注:awt在实际运行过程中,是调用所在平台的图形系统,底层实现依赖操作系统,为此在Windows平台下运行,则显示Windows风格。

package com.tanchise;

import java.awt.*;

public class FirstFrame2 {
    public static void main(String[] args) {
        MyFrame myFrame1 = new MyFrame(100,100,200,200,Color.yellow);
        MyFrame myFrame2 = new MyFrame(300,200,200,200,Color.blue);
    }

}
class MyFrame extends Frame{
    static int count = 0;

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

 2.2.2、面板(Panel) 

    Panel是一种透明的容器,既没有标题,也没有边框。它不能作为最外层的容器单独存在,首先必须先作为一个组件放置在其他容器中,然后在把它当做容器。

package com.tanchise;

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

public class panel {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Frame fr = new Frame("Hello");
        fr.setSize(240,240);
        fr.setBackground(Color.green);
        fr.setLayout(null); //取消默认的布局BorderLayout

        Panel pan = new Panel(); //创建面板
        pan.setSize(100,100);
        pan.setBackground(Color.yellow);
        fr.add(pan);
        fr.setVisible(true);
        //
        fr.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

}

效果图

 2.3、布局管理器(LayoutManager)

为了实现跨平台并获得动态的布局效果,java将容器内的所有组件安排给一个“布局管理器”负责管理,如:排列顺序、组件大小、位置、当窗口移动或调整大小后组件变化等功能授权给对应的容器布局管理器来管理。

  • 流式布局
  • 东、西、南、北、中布局
  • 表格布局

2.3.1、FlowLayout——流式布局管理器

FlowLayout 会将组件按照从上到下、从左到右的放置规律逐行进行定位。与其他布局管理器不同的是,FlowLayout 布局管理器不限制它所管理组件的大小,而是允许它们有自己的最佳大小。FlowLayout 布局管理器的构造方法如下:

  • FlowLayout ():创建一个布局管理器,使用默认的居中对齐方式和默认 5 像素的水平和垂直间隔。
  • FlowLayout (int align):创建一个布局管理器,使用默认 5 像素的水平和垂直间隔。
package com.tanchise;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FlowLayoutDemo {

    public static void main(String[] args) {
        Frame frame = new Frame("FlowLayout"); //Frame默认的布局管理器为BorderLayout
        frame.setBounds(100, 100, 400, 300);
        frame.setLayout(new FlowLayout(FlowLayout.CENTER)); //设置布局管理器为FlowLayout

        Button but1 = new Button("button1");
        Button but2 = new Button("button2");
        Button but3 = new Button("button3");
        Button but4 = new Button("button4");
        Button but5 = new Button("button5");

        but1.setBackground(Color.blue);
        but2.setBackground(Color.yellow);
        but3.setBackground(Color.red);
        but4.setBackground(Color.green);
        but5.setBackground(Color.pink);

        frame.add(but1);
        frame.add(but2);
        frame.add(but3);
        frame.add(but4);
        frame.add(but5);

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

}

效果图

FlowLayout的对齐方式默认为居中对齐,但是我们也可以自己指定对齐方式及横纵向间隔。

2.3.2、BorderLayout——边框布局管理器

 边框布局管理器是Java Swing中的一种布局管理器,它将容器分为五个区域:东、南、西、北和中。每个区域只能包含一个组件,如果没有指定组件的位置,则默认将其放置在中央区域。

package com.tanchise;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class BorderLayoutDemo {

    public static void main(String[] args) {
        Frame frame = new Frame("BorderLayt");
        frame.setBounds(100, 100, 400, 300);
        //frame.setLayout(new BorderLayout()); //设置 frame的布局为BorderLayout,默认也是此布局

        Button btn1 = new Button("button1");
        Button btn2 = new Button("button2");
        Button btn3 = new Button("button3");
        Button btn4 = new Button("button4");
        Button btn5 = new Button("button5");

        btn1.setBackground(Color.blue);
        btn2.setBackground(Color.yellow);
        btn3.setBackground(Color.pink);
        btn4.setBackground(Color.green);
        btn5.setBackground(Color.red);

        frame.add(btn1,BorderLayout.EAST);
        frame.add(btn2,BorderLayout.NORTH);
        frame.add(btn3,BorderLayout.SOUTH);
        frame.add(btn4,BorderLayout.WEST);
        frame.add(btn5);

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

效果图

2.3.3、GridLayout——网格布局管理器

 网格布局管理器是Java Swing中的一种布局管理器,它将容器分成行数和列数相等的网格,每个网格放置一个组件,按照从左往右,从上往下的顺序依次添加

package com.tanchise;

import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class GridLayoutDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Frame frame = new Frame("GridLayout");
        frame.setBounds(400, 400, 500, 400);

        GridLayout gl = new GridLayout(3,2,5,5); //设置表格为3行两列排列,表格横向间距为5个像素,纵向间距为5个像素
        frame.setLayout(gl);

        Button but1 = new Button("button1");
        Button but2 = new Button("button2");
        Button but3 = new Button("button3");
        Button but4 = new Button("button4");
        Button but5 = new Button("button5");

        but1.setBackground(Color.blue);
        but2.setBackground(Color.yellow);
        but3.setBackground(Color.red);
        but4.setBackground(Color.green);
        but5.setBackground(Color.pink);

        frame.add(but1);
        frame.add(but2);
        frame.add(but3);
        frame.add(but4);
        frame.add(but5);
       // frame.pack();//自动布局
        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

}

效果图 

2.3.4GridBagLayout——网格包布局管理器

GridBagLayout是Java Swing中的一个布局管理器,它可以在一个网格中放置组件,每个组件占用一个或多个网格单元格。GridBagLayout是最灵活和复杂的布局管理器之一,它可以让指定的组件跨越多行或多列。不是所有的行都必须具有相同的高度

package com.tanchise;

import java.awt.Button;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class GridBagLayoutDemo {

    // 创建一个 Frame 对象,名为 "GridBagLayout Test"
    private Frame f = new Frame("GridBagLayout Test");

    // 创建一个 GridBagLayout 布局管理器对象
    private GridBagLayout gbl = new GridBagLayout();

    // 创建一个 GridBagConstraints 对象
    private GridBagConstraints gbc = new GridBagConstraints();

    // 创建一个 Button 类型的数组对象,长度为 10
    private Button[] btns = new Button[10];

    // 添加按钮的方法,接收一个 Button 类型的参数 btn
    private void addButton(Button btn) {
        // 使用 gbl 对象设置按钮的约束条件
        gbl.setConstraints(btn, gbc);
        // 将按钮添加到 Frame 对象中
        f.add(btn);
    }

    // 初始化方法
    public void init() {
        // 循环创建 10 个按钮,将它们添加到数组中
        for (int i = 0; i < 10; i++) {
            btns[i] = new Button("button" + i);
        }

        // 设定 Frame 的布局模式为 GridBagLayout
        f.setLayout(gbl);

        // 设置组件填充方式为 BOTH,即组件完全填满其显示区域
        gbc.fill = GridBagConstraints.BOTH;
        // 设置组件水平所占用的格子数为 1,如果为 0,说明该组件是该行的最后一个,为 1 则只占一格
        gbc.weighty = 1;

        // 第 1 行的 4 个按钮
        // 设置组件水平的拉伸幅度为 1,即随着窗口增大进行拉伸,0 到 1 之间
        gbc.weightx = 1;
        // 将按钮 0、1、2 添加到 Frame 中
        addButton(btns[0]);
        addButton(btns[1]);
        addButton(btns[2]);
        // 该组件是该行的最后一个,第 4 个添加后就要换行了
        gbc.gridwidth = GridBagConstraints.REMAINDER;
       
        // 将按钮 3 添加到 Frame 中
        addButton(btns[3]);

        // 第 2 行 1 个按钮,仍然保持 REMAINDER 换行状态
        // 将按钮 4 添加到 Frame 中
        addButton(btns[4]);

        // 第 3 行
        // 按钮分别横跨 2 格
        gbc.gridwidth = 2;
        // 设置组件水平的拉伸幅度为 1
        gbc.weightx = 1;
        // 将按钮 5 添加到 Frame 中
        addButton(btns[5]);
        // 该组件是该行的最后一个
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        // 将按钮 6 添加到 Frame 中
        addButton(btns[6]);

        // 按钮 7 纵跨 2 个格子,8、9 一上一下
        // 按钮 7 纵跨 2 格
        gbc.gridheight = 2;
        gbc.gridwidth = 1;
        gbc.weightx = 1;
        addButton(btns[7]);
        // 该组件是该行的最后一个
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.gridheight = 1;
        gbc.weightx = 1;
        addButton(btns[8]);
        addButton(btns[9]);

        // 将 Frame 自适应大小,并显示
        f.pack();
        f.setVisible(true);
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

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

2.3.5CardLayout——卡片布局管理器

卡片布局管理器(CardLayout)是Java Swing中的一种布局管理器,它能够帮助用户实现多个成员共享同一个显示空间,并且一次只显示一个容器组件的内容。CardLayout布局管理器将容器分为很多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个组件。

package com.tanchise;


import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class aaa {
    Frame f = new Frame("测试窗口");
    String[] names = { "one", "two", "three", "four", "five" };
    Panel p1 = new Panel(); //显示的面板

    public void init() {
        final CardLayout c = new CardLayout(); //卡片局部
        p1.setLayout(c); //面板布局使用卡片布局
        for (int i = 0; i < names.length; i++) {
            p1.add(names[i], new Button(names[i])); //设置面板的名字和组件
        }
        Panel p = new Panel(); //创建一个放按钮的面板

        // 控制显示上一张的按钮
        Button previous = new Button("pre");
        //为按钮添加监听
        previous.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                c.previous(p1);
            }
        });

        // 控制显示下一张的按钮
        Button next = new Button("next");
        next.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                c.next(p1);
            }
        });

        // 控制显示第一张的按钮
        Button first = new Button("first");
        first.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                c.first(p1);
            }
        });

        // 控制显示最后一张的按钮
        Button last = new Button("last");
        last.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                c.last(p1);
            }
        });

        // 控制根据Card显示的按钮
        Button third = new Button("Third");
        third.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                c.show(p1, "three");
            }
        });

        p.add(previous);
        p.add(next);
        p.add(first);
        p.add(last);
        p.add(third);
        f.add(p1);
        f.add(p, BorderLayout.SOUTH);

        f.pack(); //紧凑排列
        f.setVisible(true);
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

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

}

 

2.4、组件(Component)

   awt组件库中还有很多比较常用的组件,如:按钮(Button)、复选框(Checkbox)、复选框组(CheckboxGroup)、下拉菜单(Choice)、单行文本输入框(TextField)、多行文本输入框(TextArea)、列表(List)、对话框(Dialog)、文件对话框(Filedialog)、菜单(Menu)、MenuBar、MenuItem、Canvas等;

2.4.1、基本组件

package com.tanchise;

import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Choice;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.List;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;

public class ComponentTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Frame frame = new Frame("基本组件测试");
        frame.setBounds(100, 100, 600, 300);
        GridLayout gl = new GridLayout(4,2,5,5); //设置表格为3行两列排列,表格横向间距为5个像素,纵向间距为5个像素
        frame.setLayout(gl);

        //按钮组件
        Button but1 = new Button("bottom");
        Panel pn0 = new Panel();
        pn0.setLayout(new FlowLayout());
        pn0.add(but1);
        frame.add(pn0);

        //复选框组件
        Panel pn1 = new Panel();
        pn1.setLayout(new FlowLayout());
        pn1.add(new Checkbox("one",null,true));
        pn1.add(new Checkbox("two"));
        pn1.add(new Checkbox("three"));
        frame.add(pn1);

        //复选框组(单选)
        Panel pn2 = new Panel();
        CheckboxGroup cg = new CheckboxGroup();
        pn2.setLayout(new FlowLayout());
        pn2.add(new Checkbox("one",cg,true));
        pn2.add(new Checkbox("two",cg,false));
        pn2.add(new Checkbox("three",cg,false));
        frame.add(pn2);

        //下拉菜单
        Choice cC = new Choice();
        cC.add("red");
        cC.add("green");
        cC.add("yellow");
        frame.add(cC);

        //单行文本框
        Panel pn3 = new Panel();
        pn3.setLayout(new FlowLayout());
        TextField tf = new TextField("",30); //30列长度
        pn3.add(tf);
        frame.add(pn3);

        //多行文本框
        TextArea ta = new TextArea();
        frame.add(ta);

        //列表
        List ls = new List();
        ls.add("a");
        ls.add("b");
        ls.add("c");
        ls.add("d");
        ls.add("e");
        ls.add("f");
        ls.add("g");
        frame.add(ls);
        frame.setVisible(true);
    }

}

2.4.2Menu组件

Java中的Menu组件是一个下拉菜单,它可以从菜单栏中部署。菜单可以选择是撕开式菜单。撕开式菜单可以从其父菜单栏或菜单中打开并拖动。鼠标按钮释放后,它仍然保留在屏幕上。

package com.tanchise;

import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;

public class MenuDemo {

    private Frame f;
    public MenuDemo(){
        f = new Frame("测试菜单");
        f.setBounds(100, 100, 200, 200);
        //Menu无法直接添加到容器中,只能直接添加到菜单容器中
        MenuBar mb = new MenuBar(); //创建菜单容器
        f.setMenuBar(mb);
        //添加菜单
        Menu m1 = new Menu("File");
        Menu m2 = new Menu("Edit");
        Menu m3 = new Menu("Help");
        mb.add(m1);
        mb.add(m2);
        mb.add(m3);

        //添加菜单项
        MenuItem mi1 = new MenuItem("Save");
        MenuItem mi2 = new MenuItem("Load");
        MenuItem mi3 = new MenuItem("Quit");
        m1.add(mi1);
        m1.add(mi2);
        m1.addSeparator(); //添加分隔线
        m1.add(mi3);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MenuDemo md = new MenuDemo();
    }

}

三、事件监听

在Java GUI编程中,事件监听器是一种机制,用于处理用户与GUI组件交互时发生的事件。Java中,事件处理的基本思路是:一个源(事件源)产生一个事件,并把它送到监听器那里,监听器只是简单的对待,直到它收到一个事件,一旦事件被接收,监听器将处理这些事件。一个事件源必须注册监听器以便监听器可以接收关于一个特定事件的通知

    与AWT有关的所有事件类都由AWTEvent类派生,它是EventObject类的子类。这些AWT事件分为两大类:低级事件和高级事件。低级事件是指基于组件和容器的事件,当一个组件上发生事件,如鼠标进入、点击、拖放或组件的窗口开关等都是低级事件。高级事件是语义事件,它不可以和特点的动作相关联,而依赖于触发此类事件的类,如选中项目列表中的某一项就会触发ActionEvent事件。

    低级事件:

    1)ComponentEvent 构件事件,构件尺寸的变化以及移动·
    2)ContainerEvent 容器事件,构件增加,移动
    3)WindowEvent 窗口事件,关闭窗口,窗口闭合,图标化
    4)FocusEvent 焦点事件,焦点的获得与丢失
    5)KeyEvent 键盘事件,键按下,释放
    6)MouseEvent 鼠标事件,鼠标点击,移动

    高级事件(语义事件):

    1)ActionEvent 动作事件,按键按下,TextField中按下Enter键
    2)AdjustmentEvent 调节事件,在滚动条上移动滑块以调节数值
    3)ItemEvent 项目事件,选择项目,不选择“项目改变”
·   4)TextEvent 文本事件,文本对象改变

3.1、事件监听器概述

    每类事件都有对应的事件监听器,AWT一共10类事件,11个接口。

 3.2Button按钮监听器

package com.tanchise;

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 buttonActionEvent {
    public static void main(String[] args) {
        //按下按钮,触发一些事件
        Frame frame = new Frame();
        frame.setBounds(100, 100, 400, 400);
        Button button = new Button("Button");
        button.setBackground(Color.blue);
        button.setSize(1,1);
        //因为,addActionListener()需要ActionListener,所以需要构造一个ActionListener
        MyActionListener myActionListener = new MyActionListener();
        button.addActionListener(myActionListener);
        frame.add(button);
       // frame.pack();
        windowClose(frame);//关闭窗口
        frame.setVisible(true);
    }
    //关闭窗体事件
    private  static void windowClose(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("aab");
    }
}

 多个按钮,共享一个事件

package com.tanchise;
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 TestActionTwo {
    public static void main(String[] args) {
        //两个按钮,实现同一个监听
        //开始 停止
        Frame frame = new Frame("开始-停止");
        frame.setBounds(100, 100, 400, 400);
        Button button1 = new Button("start");
        button1.setBackground(Color.blue);
        button1.setSize(10, 10);
        Button button2 = new Button("stop");
        //可以显示的定义触发会返回的命令,如果不显示定义,会走默认的值
        //可以多个按钮只写一个监听
        button2.setActionCommand("button2-stop");
        MyMonitor myMonitor = new MyMonitor();
        button1.addActionListener(myMonitor);
        button2.addActionListener(myMonitor);
        frame.add(button1, BorderLayout.NORTH);
        frame.add(button2, BorderLayout.WEST);
       // frame.pack();
        windowClose(frame);//关闭窗口
        frame.setVisible(true);
    }

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

3.3输入框TextField监听

package tanchishe;

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 TextField1 {
    public static void main(String[] args) {
        new myframe();
    }
}
class myframe extends Frame {
    public myframe(){
        TextField textField = new TextField();
        add(textField);
        //监听这个文本框输入的文字
        MyActionListener2 myActionListener2 = new MyActionListener2();
        //按下enter,就会触发这个输入框的事件
        textField.addActionListener(myActionListener2);
        //设置替换编码
        textField.setEchoChar('*');
        setVisible(true);
        pack();
    }
}
class MyActionListener2 implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        TextField field = (TextField)e.getSource();//获得一些资源,返回一个对象
        System.out.println(field.getText());//获得输入框的文本
        field.setText("");
    }
}

简易计算机

package tanchishe;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextCale {
    public static void main(String[] args) {
        new Calculator().loadFrame();
    }
}
//计算机类
class Calculator extends Frame{
    //属性
    TextField num1,num2,num3;
    //方法
    public void loadFrame(){
        //3个文本框
        num1 = new TextField(10);
        num2 = new TextField(10);
        num3 = new TextField(20);
        //1个按钮
        Button button = new Button("=");
        button.addActionListener(new MyCalculatorListener(this));
        //1个标签
        Label label = new Label("+");
        //布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);
        pack();
        setVisible(true);
    }
}
//监听器类
class MyCalculatorListener implements ActionListener{
    //获取计算机这个对象,在一个类中组合另一个类
    Calculator calculator = null;
    public MyCalculatorListener(Calculator calculator){
        this.calculator=calculator;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //1、获得加数和被加数
        //2、将这个值+法运算后,放到第三个框
        //3、清楚前两个框
        int n1 = Integer.parseInt(calculator.num1.getText());
        int n2 = Integer.parseInt(calculator.num2.getText());
        calculator.num3.setText(""+(n1+n2));
        calculator.num1.setText("");
        calculator.num2.setText("");
    }
}

3.4画笔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【构造】CF851div2 C. Matching Numbers

Problem - C - Codeforces 题意&#xff1a; 有1~2*n的一个排列&#xff0c;进行数与数之间两两匹配&#xff0c;问如何组合可以使n个 数对 aibi排列起来是一个连续序列&#xff0c;如果无解输出No 思路&#xff1a; 构造题&#xff0c;考虑将构造的条件特殊化 手推样例可知…

【数据生成】——Semantic Image Synthesis via Diffusion Models语义分割数据集生成论文浅读

语义分割&#xff0c;数据生成 摘要 Denoising Diffusion Probabilistic Models (DDPMs) 在各种图像生成任务中取得了显著的成功&#xff0c;相比之下&#xff0c;生成对抗网络 (GANs) 的表现不尽如人意。最近的语义图像合成工作主要遵循事实上的基于 GAN 的方法&#xff0c;…

QT QHBoxLayout 水平布局控件

本文详细的介绍了QHBoxLayout控件的各种操作&#xff0c;例如&#xff1a;新建界面、添加控件、布局控件、显示控件、添加空白行、设置间距 、添加间距、设置位置、设置外边距、设置边距、添加固定宽度、方向上、方向下、方向左、方向右等等、 样式表等操作。 实际开发中&#…

无距离障碍:远程桌面Ubuntu实现全球办公【内网穿透】

目录 前言 视频教程 1. ubuntu安装XRDP 2.局域网测试连接 3. Ubuntu安装cpolar内网穿透 4.cpolar公网地址测试访问 5.固定域名公网地址 [TOC] 转载自远程穿透文章&#xff1a;Windows通过RDP异地远程桌面Ubuntu【内网穿透】 前言 XRDP是一种开源工具&#xff0c;它允许…

范数详解-torch.linalg.norm计算实例

文章目录 二范数F范数核范数无穷范数L1范数L2范数 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 范数是一种数学概念&#xff0c;可以将向量或矩阵映射到非负实数上&#xff0c;通常被…

Python使用pytorch深度学习框架构造Transformer神经网络模型预测红酒分类例子

1、红酒数据介绍 经典的红酒分类数据集是指UCI机器学习库中的Wine数据集。该数据集包含178个样本&#xff0c;每个样本有13个特征&#xff0c;可以用于分类任务。 具体每个字段的含义如下&#xff1a; alcohol&#xff1a;酒精含量百分比 malic_acid&#xff1a;苹果酸含量&a…

Python之硬汉巴特勒

一、前言 2023年4月27日&#xff0c;NBA季后赛热火4:1淘汰雄鹿&#xff0c;实现黑八。全NBA联盟最硬气的男人——巴特勒&#xff0c;再次向全世界证明了他是NBA最硬气的男人。上一场刚狂轰56分大比分逆转雄鹿&#xff0c;这一场又是带领球队打出了血性&#xff0c;超高难度绝平…

快速搭建简单图床 - 远程访问本地搭建的EasyImage图床【内网穿透】

文章目录 1.前言2. EasyImage网站搭建2.1. EasyImage下载和安装2.2. EasyImage网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 一个好的图床&#xff0c;是网站或者文章图片能稳定显示的关键&#xff0c;…

驱动管理软件推荐

最近发现电脑右下角的任务栏中有一个叹号图标&#xff0c;如下&#xff1a; 点进去之后发现是Windows自家的安全中心的内核隔离出现了点问题&#xff0c;内核隔离功能打不开 点击“查看不兼容的驱动程序”&#xff0c;发现是一些驱动作祟 我的电脑中显示了好多不兼容的驱动程序…

跟着我学习 AI丨语音识别:将语音转为数字信号

语音识别是一种人工智能技术&#xff0c;其主要目的是将人类说话转化为计算机可以理解的信息。语音识别技术的应用非常广泛&#xff0c;包括智能家居、汽车导航、语音搜索、人机交互、语音翻译等。 语音识别的技术原理 语音识别的技术原理是将人类的语音信号转化为数字信号。这…

『python爬虫』06. 数据解析之re正则解析(保姆级图文)

目录 1. 什么是re解析2. 正则规则元字符量词匹配模式测试 3. 正则案例4. re模块的使用4.1 findall: 匹配字符串中所有的符合正则的内容4.2 finditer: 匹配字符串中所有的内容[返回的是迭代器]4.3 search, 找到一个结果就返回, 返回的结果是match对象4.4 match 从头开始匹配&…

Windows forfiles命令详解,Windows按时间搜索特定类型的文件。

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 forfiles 一、结果输出格式二、按时间搜索三、搜索指定类型文件四、批量删除文件 forfile…

Ubuntu远程SSH连接与远程桌面连接

目录 一、远程桌面连接 二、远程SSH连接 1、安装客户端 2、安装服务端 3、SSH客户端和服务端的区别 一、远程桌面连接 首先需要在Ubuntu里进行些设置&#xff0c;点击界面右上角的控制区&#xff0c;选择设置选项&#xff1b; 弹出界面进入网络中&#xff0c;点击设置图…

【致敬未来的攻城狮计划】— 连续打卡第十八天:FSP固件库开发GPT — PWM输出波形 — LED呼吸灯

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

Rust开发环境搭建到运行第一个程序HelloRust

一、Rust语言 1.1 Rust语言介绍 Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率&#xff0c;它的执行效率也是令人称赞的&#xff0c;是一种少有的兼顾开发效率和执行效率的语言。 Rust 语言由 Mozilla 开发&#xff0c;最早发布于2014年 9月。Rust 的编…

《ADC和DAC的基本架构》----学习记录(二)

2 模数转换器 2.1 ADC架构I&#xff1a;Flash转换器 2.1.1 比较器&#xff1a;1位ADC 转换开关是 1 位 DAC&#xff0c;而比较器是 1 位 ADC&#xff0c;如图所示。如果输入超过阈值&#xff0c;输出即会具有一个逻辑值&#xff0c;而输入低于阈值时输出又会有另一个值。此外…

寻找2020+跳蚱蜢(蓝桥杯JAVA解法)

目录 寻找2020&#xff1a;用户登录 题目描述 运行限制 跳蚱蜢&#xff1a;用户登录 题目描述 运行限制 寻找2020&#xff1a;用户登录 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有一个数字矩阵&a…

使用ChatGPT生成了十种排序算法

前言 当前ChatGPT非常火爆&#xff0c;对于程序员来说&#xff0c;ChatGPT可以帮助编写很多有用的代码。比如&#xff1a;在算法的实现上&#xff0c;就可以替我们省很多事。所以&#xff0c;小试牛刀一下&#xff0c;看看ChatGPT生成了排序算法怎么样&#xff1f; 简介 排序…

网站搭建之配置tomcat

【 本次配置架构】 【安全配置】 1.删除后台登录 在tomcat安装目录下的/conf文件下编辑tomcat-users.xml,删除里面带有标签的内容块&#xff0c;默认这部分是被注释了的。注释了任然会显示后台登录&#xff0c;需要彻底删除。 进入末行模式&#xff0c;也就是使用vim进去后&…

Flask开发之环境搭建

目录 1、安装flask 2、创建Flask工程 ​编辑 3、初始化效果 4、运行效果 5、设置Debug模式 6、设置Host 7、设置Port 8、在app.config中添加配置 1、安装flask 如果电脑上从没有安装过flask&#xff0c;则在命令行界面输入以下命令&#xff1a; pip install flask 如果电…