• 2019暑假第一周总结


    这周数据结构小学期,完成了自己“24点游戏”的报告,学习了Java图形化界面(GUI)的许多东西,下面是在学习网上代码(学习地址:https://www.cnblogs.com/sysu-blackbear/p/3259408.html)过程中自己学习的东西。

    24点计算,Java的图形用户界面(GUI)

    一、 引包:

    import java.awt.*;

    import javax.swing.*;

    import java.awt.event.*;

    import java.util.*;

    import javax.swing.JOptionPane;

    1. awt 抽象组件窗口包,java最早的用于编写图形应用程序的开发包。

    包含用于创建用户界面和绘制图形图像的所有类。在 AWT 术语中,诸如按钮或滚动条之类的用户界面对象称为组件。Component 类是所有 AWT 组件的根。(本次开发主要应用按钮组件)当用户与组件交互时,一些组件会激发事件。AWTEvent 类及其子类用于表示 AWT 组件能够激发的事件。容器是一个可以包含组件和其他容器的组件。容器还可以具有布局管理器,用来控制容器中组件的可视化布局。AWT 包带有几个布局管理器类和一个接口,此接口可用于构建自己的布局管理器。

    由于AWT 是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件

      2. swing 为了补充awt的一些功能性的缺失问题而开发的包,以awt为基础。

    提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。

    JoptionPane类:四种消息提示框(showConfirmDialog():确认对话框 、showInputDialog():输入对话框(下拉列表形式、文本框形式) 、showMessageDialog():消息对话框 、showOptionDialog():选择对话框);五种消息类型(ERROR_MESSAGE 、INFORMATION_MESSAGE (自定义标题,自定义图标)、WARNING_MESSAGE 、QUESTION_MESSAGE 、PLAIN_MESSAGE (自定义标题,但没有图标))类型不同,图形化界面的图标也不同。JOptionPane.showMessageDialog(null, "友情提示");(默认标题、默认图标)

    区别:由于实现的不同,awt是基于本地方法的C/C++程序,运行速度比较快,消耗资源少;Swing是基于awt的Java程序,所以运行速度慢。对于嵌入式应用,往往采用AWT;通常在标准的Java应用中,使用Swing牺牲运行速度换取开发效率和功能。

    (百度文库、https://blog.csdn.net/tjk123456/article/details/77868034)

      3.util  在这个包中,Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历 (Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack)、向量 (Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。

    (详情见:https://www.cnblogs.com/frankliiu-java/articles/1944276.html)

      4.util中的stack类,实现了一个标准的后进先出的栈。本题利用栈来实现数学表达式的计算。

      5.extends JFrame 继承JFrame类,初始化窗口,添加按钮、显示框、文本框等,设置大小、设置可见、设置字体、添加响应事件,将容器JFrame实例设置为可见。

    https://blog.csdn.net/weinihecaihktk/article/details/78880364

      6.JButton AbstractButton类的扩展,当按钮被选中,点击时会出现不同的状态,Swing本身的展示效果在绘制面板的时候不尽人意,因此可以通过更改按钮的鼠标事件来美化按钮。

    https://blog.csdn.net/llwwlql/article/details/51635403

      7.JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐。默认情况下,标签在其显示区内垂直居中对齐。默认情况下,只显示文本的标签是开始边对齐;而只显示图像的标签则水平居中对齐。 还可以指定文本相对于图像的位置。默认情况下,文本位于图像的结尾边上,文本和图像都垂直对齐。

    https://blog.csdn.net/lzm18064126848/article/details/48048143

      8.JTextField 想要实时监听键盘输入内容必须实现DocumentListener接口

    insertUpdate 是实时监听输入的内容,该方法可以跟踪文本框中输入的内容

    removeUpdate是实时监听删除内容,该方法可以跟踪文本框中移除的内容

    changedUpdate是更新内容,该方法可以跟踪当文本框中已存在的内容改变时(这个方法比较少用)

    https://blog.csdn.net/LQdesolation/article/details/81263261

      9.JPanel 缓冲区部分

      10. ImageIcon 此类用于向窗口中添加图片,它根据 Image 绘制 Icon。可使用 MediaTracker 预载根据 URL、文件名或字节数组创建的图像,以监视该图像的加载状态。

    二、 变量:

    1.定义图形化界面中的按钮变量

    private JButton jbsolution = new JButton("正确答案");

            private JButton jbrefresh = new JButton("刷新");

    private JButton jbverify = new JButton("提交答案");

    2.定义图形化界面中要输入的文本部分。

    private JLabel jlmessage = new JLabel("输入你的答案:");

    3.定义实时监听窗口中的键盘输入内容的函数,

    private JTextField jtsolution = new JTextField();

    private JTextField jtexpression = new JTextField();

    4.引用定义类ImagePanel,定义pp绘制图像部分

    private ImagePanel pp = new ImagePanel();

    5.Card 整形数组【4】用于记录img文件夹中的图片的数组下标/ bcard double型数组【4】用于记录4张图片中的数值。

    6.Sum double计算总值 / temp1 double型数组【3】存顺序存储初次计算成功的数值、temp2 double型数组【2】存储之后的 / sign char型数组【】 定义符号,加减乘除

    三、 函数:

    1.ImagePanel类

    继承javax.swing.JPanel类

    Ÿ Public void sshow()函数,将52张扑克牌大小,随机(利用random)显示4张,里面用到了void java.awt.Component.repaint()方法【repaint()】用来重绘图像,实现,刷新4张扑克牌的图形化界面。

    Ÿ protected void paintComponent(Graphics g) 函数,继承java.awt.Graphics中的paint(java.awt.Graphics)函数,用于绘制此组件,即将4张扑克牌大小随机显示在窗口,绘制组件的内容调用此方法,参数g用于绘制组件的上下文;使用ImageIcon添加图片;定义一个新的image用于表示使用getImage()函数返回能被绘制到屏幕上的 Image 对象。url 参数必须指定绝对 URL。是否返回,返回,则为真;然后利用g.drawImage()用来根据x、y坐标绘制图像。该方法用于绘制指定图像中已缩放到适合指定矩形内部的图像。

    参数:

    img - 要绘制的指定图像。如果 img 为 null,则此方法不执行任何动作。

    x - x 坐标。

    y - y 坐标。

    width - 矩形的宽度。

    height - 矩形的高度。

    • observer - 当转换了更多图像时要通知的对象。

                  返回:

    如果图像像素仍在更改,则返回 false;否则返回 true。

     2.Count24()

    利用java.awt.GridLayout.GridLayout(int rows, int cols)这个布局管理器实现窗口的布局;

    利用BorderLayout是Frame的默认的布局管理器;是上下左右中形式的,用add方法添加Component时;第二个参数指定位置;不指定加入部位,默认放入center区;同一部位只能放一组件,放多个会覆盖以前的;必须有center。英语表示为东南西北中心的英语。

    然后给三个不同按钮增添事件监听器

     3.ButtonListener 类

    使用java.awt.event.ActionListener接口,用于接收操作事件的侦听器接口,此处用于定义的4个按钮;在发生操作事件时,调用该对象的 actionPerformed 方法public void actionPerformed(ActionEvent e)。

    如果按钮名为“正确答案”,则进行计算,首先利用card和bcard进行对应照片数值,然后,调用search()方法。

    如果按钮名为“刷新”,调用图像pp的展示图像方法,重新展示图像。

    如果按钮名为“提交答案“,定义expression,用来监听从键盘输入的内容,并得到键盘输入的内容,计算结果result,调用evaluateExpression方法,计算结果,判断结果正确与否,并输出相应的窗口。4.Search()方法

    首先定义 judge为boolean类型,值为false

    使用for嵌套循环,实现对4张扑克牌数值的计算。

    最内层for循环,相邻数字顺序计算,并顺序存储,计算一直调用calcute函数

    计算完成后,若sum数值为24,则judge变为true,

    根据括号放置位置的不同(6种情况),输出正确答案。

    若judge一直为空,则输出“无解“

    5.public static int evaluateExpression(String expression)

    扫描表达式,使用StringTokenizer对象来分离运算符与操作数,并将运算符和操作数,压入不同的栈中,先进后出的原则。其中在对分离的运算符与操作数进行计算时,调用processAnOperator方法。

    6.public static void processAnOperator(java.util.Stack<Integer> operandStack,java.util.Stack<Character> operatorStack)

    如果,运算符匹配结果为+,则+出栈,对应,两个数出栈,将其相加结果入栈;

    其余同理。

    7.public static double calcute(double a,double b,char c)

    进行左右计算式的计算。C为计算符号,a、b为数值。C值为其他符号或,做除法b为0,均返回-1.

    8.主函数 public static void main(String[] args)

    四、 Bug1 无解结果错误;Bug2  刷新只刷新图像,文本框内容不会刷新。

  • 相关阅读:
    置换笔记
    7.23
    Conveyor Belts
    CF #134 A~D
    Blocks && Fixing the Great wall
    Kakuro
    Deadlock Detection
    关于KeyFile的破解,含注册机源代码
    BMP位图之代码实现
    BMP位图之8位位图(三)
  • 原文地址:https://www.cnblogs.com/Qi77/p/11146803.html
Copyright © 2020-2023  润新知