Java GUI 实现的计算器
前言
0.如何设置布局管理器
1.边界布局管理器BorderLayout
2.网格布局管理器GridLayout
3.String类
4.类的继承
5.java事件监听器
6.基于eclipse
提示:以下是本篇文章正文内容,下面案例可供参考
一、实现一个空白窗口
import javax.swing.JFrame;
public class Computer {
public static void main(String[] args) {
JFrame frame = new JFrame("我的计算器");//创建一个窗口
frame.setSize(300,300);//设置窗口的大小
frame.setLocationRelativeTo(null);//设置窗口居中
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口每次关闭后程序结束
frame.setVisible(true);//设置窗口的可视化
}
}
二、实现计算器界面
1.重新定义一个类来写主要功能
用构造方法来实现类的调用
public class ComputerFace {
public static void main(String[] args) {
new Computer();//在main方法调用构造方法
}
public class Computer {
public Computer(){//构造方法方法名必须与类名一样
JFrame frame = new JFrame("我的计算器");//创建一个窗口
frame.setSize(300,300);//设置窗口的大小
frame.setLocationRelativeTo(null);//设置窗口居中
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口每次关闭后程序结束
frame.setVisible(true);//设置窗口的可视化
2.将组件添加到窗口中
窗口默认边界布局管理器BorderLayout
添加组件到窗口的方式
frame.add(组件,布局管理器);
将文本框添加到窗口
JTextField text =new JTextField();//创建文本框的对象text
frame.add(text,BorderLayout.NORTH);//将文本框添加到窗口的北部
创建JPanel面板
将其设置为网格布局管理器
再添加到窗口中间
JPanel center = new JPanel();//创建面板对象center
center.setLayout(new GridLayout(4,4));//将面板设置为网格布局
JButton[] btns =new JButton[16];//创建按钮字符串数组对象
String lables[]= {"7","8","9","/","4","5","6","*","1","2","3","-","0",".","=","+"};//用lables标签保存按钮上的字符
for (int i = 0; i < btns.length; i++) {//用for循环遍历按钮数组
btns[i]=new JButton(lables[i]);//将lables数组传进按钮数组
center.add(btns[i]);//将按钮数组添加到面板center
}
frame.add(center,BorderLayout.CENTER);//把center设置在窗口的中间
添加一个删除按钮以实现每次运算完清空文本框的内容
JButton delete = new JButton("删除");//创建一个删除按钮的对象
frame.add(delete,BorderLayout.SOUTH);//将删除按钮添加到窗口的南部
最后的实现效果
完整的代码
public class ComputerFace {
public static void main(String[] args) {
new Computer();//在main方法调用构造方法
}
package computerPractice;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Computer {
// 放在方法的前面方便后面的调用
JFrame frame = new JFrame("我的计算器");// 创建一个窗口
JTextField text = new JTextField();
JButton[] btns = new JButton[16];
JButton delete = new JButton("删除");
public Computerpractice() {
JPanel center = new JPanel();// 创建面板对象center
center.setLayout(new GridLayout(4, 4));// 将面板设置为网格布局
String lables[] = { "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+" };// 用lables标签保存按钮上的字符
for (int i = 0; i < btns.length; i++) {// 用for循环遍历按钮数组
btns[i] = new JButton(lables[i]);// 将lables数组传进按钮数组
center.add(btns[i]);// 将按钮数组添加到面板center
}
frame.add(delete, BorderLayout.SOUTH);
frame.add(text, BorderLayout.NORTH);
frame.add(center, BorderLayout.CENTER);// 把center设置在窗口的中间
frame.setSize(300, 300);// 设置窗口的大小
frame.setLocationRelativeTo(null);// 设置窗口居中
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗口每次关闭后程序结束
frame.setVisible(true);// 设置窗口的可视化
}
}
4.类的继承
1.class computer extends JFrame{}
2.父类包含没有实现体的抽象方法-------“接口”
class computer implements ActionListener{
给出父接口中所有抽象的实现体
}
需要写一个监听器的类
1)监听到事件的发生
2)捕获这个事件对象
3)把事件对象通过响应方法的参数传递给我(我通过这个传来的事件对象获得事件的细节)
怎样写一个我自己的类computer,让他有另一个类 ActionListener的功能方法:
a.实现某种监听器的接口
b.给出父类接口中所有抽象方法的实现体
public class Computer implements ActionListener {
Computer有红色的下划线,鼠标移动过去点击未实现的方法,将自动添加未实现的方法
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
给组件添加监听器
delete.addActionListener(frame);
btns[i].addActionListener(frame);
5.关于计算功能的实现
在前面定义两个变量
StringBuilder inputStr=new StringBuilder();//保存字符串
String op=" ";//定义一个变量保存运算符
计算功能的实现完整代码
public void actionPerformed(ActionEvent e) {
String s = e.getActionCommand(); // 获得按钮上的标签
if (s.equals("删除")) {
inputStr.setLength(0); // 清空字符串
} else {
inputStr.append(s); // 字符串串接--append追加
}
tResult.setText(inputStr.toString());
if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
op = s;
}
if(s.equals("=")) {
String str = inputStr.toString();
str = str.substring(0, str.length() - 1);
String[] t = str.split("\\" + op);
double d1 = Double.parseDouble(t[0]);
double d2 = Double.parseDouble(t[1]);
double result = 0;
switch (op) {
case "+":result = d1 + d2;break;
case "-":result = d1 - d2;break;
case "*":result = d1 * d2;break;
case "/":result = d1 / d2;break;
}
tResult.setText(inputStr.append(result + " ").toString());
}
}
}
实现计算功能的String类知识点
String类
1.字符串串接 +
2.字符串是常量,不可以被改变,对字符串做的任何改变都是产生了一个新的字符串----写在循环里,会产生大量新字符串
StringBuilder—字符串改变的时候是在原有字符串上做改变,不会产生新字符串
StringBuiler用法
StringBuilder inputStr=new StringBuilder(" ");//创建StrinBuilder对象
inputStr.append(s);//字符串串接–append追加,不会产生新的字符串
tResult.setText(inputStr.toString());
3.取子串:String类substring()方法
4.字符串的分拆:String 类split()方法
例如:
String s=’124.5+45”;
String[]result =s.split(“\ +”);
System.out.println(result[0]);
System.out.println(result[1]);
5.把字符串转换对应的数:“123.4”转换double数123.4
例如:
double d=Double.parseDouble(“123.4”);
System.out.println(d/2);
Float f=Float.parseFloat(“2.3”);
Int a=Integer.parseInt(“123”);
包装类:Double,Float,Integer,Charater
完整的代码
package computerPractice;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Computer implements ActionListener {
JFrame frame = new JFrame("我的计算器");// 创建一个窗口
JTextField text = new JTextField();
JButton[] btns = new JButton[16];
JButton delete = new JButton("删除");
StringBuilder inputStr = new StringBuilder();// 保存字符串
String op = " ";// 定义一个变量保存运算符
public Computer() {
JPanel center = new JPanel();// 创建面板对象center
center.setLayout(new GridLayout(4, 4));// 将面板设置为网格布局
JButton[] btns = new JButton[16];// 创建按钮字符串数组对象
String lables[] = { "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+" };// 用lables标签保存按钮上的字符
for (int i = 0; i < btns.length; i++) {// 用for循环遍历按钮数组
btns[i] = new JButton(lables[i]);// 将lables数组传进按钮数组
center.add(btns[i]);// 将按钮数组添加到面板center
btns[i].addActionListener(this);
}
frame.add(center, BorderLayout.CENTER);// 把center设置在窗口的中间
JButton delete = new JButton("删除");
delete.addActionListener(this);
frame.add(delete, BorderLayout.SOUTH);
frame.add(text, BorderLayout.NORTH);
frame.add(center, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(200, 200);
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String s = e.getActionCommand();// 获得按钮上的标签
if (s.equals("删除")) {// 将获取的标签与删除进行内容的对比equals
inputStr.setLength(0);// 将inputStr长度设置为零,以实现清空
} else {
inputStr.append(s);// 否则继续追加字符串
}
text.setText(inputStr.toString());// toString是将StringBuilder强制转换String
if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
op = s;
}
if (s.equals("=")) {
String str = inputStr.toString();
str = str.substring(0, str.length() - 1);
String[] reult = str.split("\\" + op);
double d1 = Double.parseDouble(reult[0]);
double d2 = Double.parseDouble(reult[1]);
double endResult = 0;
switch (op) {
case "+":
endResult = d1 + d2;
break;
case "-":
endResult = d1 - d2;
break;
case "*":
endResult = d1 * d2;
break;
case "/":
endResult = d1 / d2;
break;
}
text.setText(inputStr.append(endResult + " ").toString());
}
}
}