String operator; //记录运算符
boolean unfinishedReading; //记录是否读数完成
Frame frame = new Frame(“高齐勉的计算器!”); // frame窗口对象
TextField inputBox = new TextField(30); // inputBox 文本框对象
Button[] button = new Button[20]; //创建一组按钮
2.3 Calulation类的构造方法
2.3.1设置文本框的位置
设置窗口的打开位置以及窗口的长和宽
frame.setBounds(200, 200, 400, 320);
将文本框添加在窗口北部区域
frame.add(inputBox, BorderLayout.NORTH);
2.3.2 设置按钮布局
Panel panel = new Panel();
panel.setLayout(new GridLayout(5, 4, 3, 3));
Panel
是内嵌式容器,必须内嵌在其它容器中使用,不能独立存在。其默认使用FlowLayout
布局管理器。但我使用的是GridLayout
网式布局管理器,可以将区域划分为 row*col
个小区域,GridLayout
构造方法GridLayout(rows,cols,hgap,vgap)
四个参数分别指定了要划分的行、列、水平间距和垂直间距。
2.3.3 设置按钮
String[] s = {“sqrt”, “<-”, “AC”,“%”,
“7”, “8”, “9”, “+”,
“4”, “5”, “6”, “-”,
“1”, “2”, “3”, “*”,
“0”, “.”, “=”, “/”};
for (int i = 0; i < s.length; i++) {
button[i] = new Button(s[i]);//设置按钮上的字符
button[i].addActionListener(new ActionListen());//设置按钮监听
panel.add(button[i]);//将按钮放入Panel容器中
}
2.3.4 设置窗口可见,注册窗口监听
将panel设置在中部区域
frame.add(panel,BorderLayout.CENTER);
设置窗口可见
frame.setVisible(true);
窗口监听器,注册监听,可以关闭窗口
frame.addWindowListener(new WindowAdapter() { //匿名内部类
//窗口监听器,注册监听,可以关闭窗口
@Override
public void windowClosing(WindowEvent e) {
System.exit(0); //关闭程序
}
});
WindowAdapter
适配器实现了所有的接口方法,以空方法的形式,在其子类中只要重写需要的就行,也是一种设计模式,适配器模式:因为如果要实现所有接口实在太多,不方变,采用这种过渡类.
2.4 ActionListen类实现ActionListener接口
2.4.1 public void actionPerformed(ActionEvent e)
这是接口 ActionListener
里面定义的一个抽象方法,所有实现这个接口的类都要重写这个方法。一般情况下,这是在编写GUI程序时,组件发生“有意义”的事件时会调用这个方法,比如按钮被按下,文本框内输入回车时都会触发这个事件,然后调用你编写的事件处理程序。实现过程大体如下:编写一个 ActionListener
类的监听器,组件注册该监听器,监听器内部要编写这个 actionPerformed
方法。
2.4.2 动作事件(ActionEvent e)
ActionEvent
包含一个事件,该事件为执行动作事件ACTION_PERFORMED
.触发这个事件的动作为:
• 点击按钮。
• 双击列表中选项。
• 选择菜单项。
• 在文本框中输入回车。
常用方法如下:
public String getActionCommand()
返回引发某个事件的命令按钮的名字,如果名字为空,那么返回标签值。
public void setActionCommand(String command)
设置引发事件的按钮的名字,默认设置为按钮的标签。
2.4.3 number1 = Double.parseDouble(inputBox.getText())
Double.parseDouble
方法是把数字类型的字符串,转换成double
类型。
• parseDouble
方法得到的数据类型不能继续编译,因为这个方法得到的是 double
,是Java的基本数据类型。
• valueOf
方法得到的数据类型可以继续往下编,因为这个方法得到的是 Double
,是对象,属于Java的引用数据类型。
2.4.4 inputBox.getText() & inputBox.setText()
获得文本框的内容和设置文本框的内容
2.4.5 expression = expression.substring(0, expression.length() - 1);
public String substring (int beginIndex, int endIndex);
这个方法截取的字符串从 beginIndex
开始,到字符串索引的 endIndex - 1
结束,即截取的字符串不包括 endIndex
这个索引对应的字符,所以 endIndex
的最大值为整个字符串的长度,所以使用这个方法的时候需要特别注意容易发生字符串截取越界的问题
3.1 Java版本:
java version “1.8.0_231”
Java™ SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot™ 64-Bit Server VM (build 25.231-b11, mixed mode)
3.2 IDE:
IntelliJ IDEA 2021.2.1
3.3 完整代码
package Calculator;
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 Calculation{
double number1, number2;//记录运算的两个数字
String operator;
boolean unfinishedReading;
Frame frame = new Frame(“高齐勉的计算器!”);
TextField inputBox = new TextField(30);
Button[] button = new Button[20];
Calculation() {
//设置输入文本框位置
frame.setBounds(200, 200, 400, 320);
frame.add(inputBox, BorderLayout.NORTH);
//设置按钮布局
Panel panel = new Panel();
panel.setLayout(new GridLayout(5, 4, 3, 3));
//设置按钮,并将按钮加入panel
String[] s = {“sqrt”, “<-”, “AC”,“%”, “7”, “8”, “9”, “+”, “4”, “5”, “6”, “-”, “1”, “2”, “3”, “*”, “0”, “.”, “=”, “/”};
for (int i = 0; i < s.length; i++) {
button[i] = new Button(s[i]);
button[i].addActionListener(new ActionListen());
panel.add(button[i]);
}
frame.add(panel,BorderLayout.CENTER);//将panel设置在中部区域
frame.setVisible(true);//设置窗口可见
frame.addWindowListener(new WindowAdapter() {//窗口监听器,注册监听,可以关闭窗口
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public class ActionListen implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {//获取事件源的标签
String label = e.getActionCommand();
if (label.equals(“=”)) {
number2 = Double.parseDouble(inputBox.getText());
unfinishedReading = true;
switch (operator) {
case “+”:
inputBox.setText(number1 + number2 + “”);
break;
case “-”:
inputBox.setText(number1 - number2 + “”);
break;
case “*”:
inputBox.setText(number1 * number2 + “”);
break;
case “/”:
if (number2 != 0)
inputBox.setText(number1 / number2 + “”);
else
inputBox.setText(“inf”);
break;
case “%”:
inputBox.setText(number1 % number2 + “”);
break;
case “sqrt”:
inputBox.setText( Math.sqrt(number1) + “”);
break;
case “^2”:
inputBox.setText(number2 * number2 + “”);
break;
}
} else if (label.equals(“+”) || label.equals(“*”) || label.equals(“/”) || label.equals(“%”) || label.equals(“sqrt”)) {
number1 = Double.parseDouble(inputBox.getText());
operator = e.getActionCommand();
unfinishedReading = false;
} else if (label.equals(“-”)) {
if (!unfinishedReading) {
inputBox.setText(“-”);
unfinishedReading = true;
} else {
number1 = Double.parseDouble(inputBox.getText());
operator = e.getActionCommand();
unfinishedReading = false;
}
} else if (label.equals(“<-”)) {
String expression = inputBox.getText();
if (expression.length() != 0) {
expression = expression.substring(0, expression.length() - 1);
inputBox.setText(expression);
} else if (expression.length() == 0 && inputBox.getText().length() != 0)
// 对于计算结果后避免删除键不能清楚结果显示
inputBox.setText(expression);
} else if (label.equals(“AC”)) {
inputBox.setText(“”);
unfinishedReading = false;
} else {
String s = inputBox.getText();
if (!unfinishedReading)
inputBox.setText(label);
else
inputBox.setText(s + label);
unfinishedReading = true;
}
}
}
public static void main(String[] args) {
new Calculation();
最后
ActiveMQ消息中间件面试专题
- 什么是ActiveMQ?
- ActiveMQ服务器宕机怎么办?
- 丢消息怎么办?
- 持久化消息非常慢怎么办?
- 消息的不均匀消费怎么办?
- 死信队列怎么办?
- ActiveMQ中的消息重发时间间隔和重发次数吗?
ActiveMQ消息中间件面试专题解析拓展:
redis面试专题及答案
- 支持一致性哈希的客户端有哪些?
- Redis与其他key-value存储有什么不同?
- Redis的内存占用情况怎么样?
- 都有哪些办法可以降低Redis的内存使用情况呢?
- 查看Redis使用情况及状态信息用什么命令?
- Redis的内存用完了会发生什么?
- Redis是单线程的,如何提高多核CPU的利用率?
Spring面试专题及答案
- 谈谈你对 Spring 的理解
- Spring 有哪些优点?
- Spring 中的设计模式
- 怎样开启注解装配以及常用注解
- 简单介绍下 Spring bean 的生命周期
Spring面试答案解析拓展
高并发多线程面试专题
- 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
- Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。
- Java 中 wait 和 sleep 方法有什么区别?
- 如何在 Java 中实现一个阻塞队列?
- 如何在 Java 中编写代码解决生产者消费者问题?
- 写一段死锁代码。你在 Java 中如何解决死锁?
高并发多线程面试解析与拓展
jvm面试专题与解析
- JVM 由哪些部分组成?
- JVM 内存划分?
- Java 的内存模型?
- 引用的分类?
- GC什么时候开始?
JVM面试专题解析与拓展!
链图片转存中…(img-8HJ9oPOA-1721161692652)]
高并发多线程面试专题
- 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
- Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。
- Java 中 wait 和 sleep 方法有什么区别?
- 如何在 Java 中实现一个阻塞队列?
- 如何在 Java 中编写代码解决生产者消费者问题?
- 写一段死锁代码。你在 Java 中如何解决死锁?
高并发多线程面试解析与拓展
[外链图片转存中…(img-qEYTga64-1721161692653)]
jvm面试专题与解析
- JVM 由哪些部分组成?
- JVM 内存划分?
- Java 的内存模型?
- 引用的分类?
- GC什么时候开始?
JVM面试专题解析与拓展!
[外链图片转存中…(img-BnnuoqGV-1721161692653)]