次计算器可以随意增加按钮,且不影响其它的按钮,如需增加更多的计算按钮只需要修改Answer2.java中的部分代码即可:
switch(ch1)
{
case "=":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 0;
break;
case "+":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 1;
break;
case "-":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 2;
break;
case "*":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 3;
break;
case "/":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 4;
break;
case "sqrt":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 5;
break;
case"del":
flag = 6;
break;
//后面追加case 键值,并赋值标志变量,flag++;
}
}
return zongnum;
}
private static double fflag(double num,double zongnum,int flag){
switch(flag){
case 0:
zongnum=num;
break;
case 1:
zongnum=zongnum+num;
break;
case 2:
zongnum=zongnum-num;
break;
case 3:
zongnum=zongnum*num;
break;
case 4:
zongnum=zongnum/num;
break;
case 5:
zongnum=Math.cbrt(zongnum);
break;
case 6:
zongnum = 0;
//此处填写相应的计算代码,判断flag;
break;
}
return zongnum;
}
以下是源代码,有startFrame.java 和 Answer2.java 分别给出:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import java.util.Vector;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.GroupLayout.Alignment;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
public class statrFrame extends JFrame implements ActionListener{
private int x,y;
private int width, height;
private JFrame jf;
private JPanel contentPane;
private JPanel panel,panel_1;
private JTextField jt;
private String str="",str1="",str2="";
private String[] strindex;
private Vector<JButton> bu = new Vector<>();
public statrFrame(int width,int height,int x,int y,String str){
this.strindex =str.split(",");
this.str = str;
this.x = x;
this.y = y;
this.width = width;
this.height=height;
jf = new JFrame("计算机");
panel = new JPanel();
panel_1 = new JPanel();
jt = new JTextField();
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
jf.setContentPane(contentPane);
GroupLayout gl_contentPane = new GroupLayout(contentPane);
gl_contentPane.setHorizontalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(42)
.addComponent(panel, GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE)
.addGap(38))
.addComponent(panel_1, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 422, Short.MAX_VALUE)
);
gl_contentPane.setVerticalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addComponent(panel, GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(panel_1, GroupLayout.DEFAULT_SIZE, 202, Short.MAX_VALUE))
);
GridLayout gd = new GridLayout(x,y,0,0);
panel_1.setLayout(gd);
jt = new JTextField();
jt.setColumns(10);
GroupLayout gl_panel = new GroupLayout(panel);
gl_panel.setHorizontalGroup(
gl_panel.createParallelGroup(Alignment.LEADING)
.addComponent(jt, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE)
);
gl_panel.setVerticalGroup(
gl_panel.createParallelGroup(Alignment.LEADING)
.addComponent(jt, GroupLayout.PREFERRED_SIZE, 34, GroupLayout.PREFERRED_SIZE)
);
panel.setLayout(gl_panel);
contentPane.setLayout(gl_contentPane);
if(y!=0){
gd.setHgap(y);
panel_1.setLayout(gd);
}
else
panel_1.setLayout(new GridLayout());
for(int i =0;i<strindex.length;i++){
bu.add(new JButton(strindex[i]));
}
}
public statrFrame(int width,int height,int x,String str){
this.strindex =str.split(",");
this.str = str;
this.x = x;
this.width = width;
this.height=height;
jf = new JFrame("计算机");
panel = new JPanel();
panel_1 = new JPanel();
jt = new JTextField();
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
jf.setContentPane(contentPane);
GroupLayout gl_contentPane = new GroupLayout(contentPane);
gl_contentPane.setHorizontalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(42)
.addComponent(panel, GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE)
.addGap(38))
.addComponent(panel_1, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 422, Short.MAX_VALUE)
);
gl_contentPane.setVerticalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addComponent(panel, GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(panel_1, GroupLayout.DEFAULT_SIZE, 202, Short.MAX_VALUE))
);
GridLayout gd = new GridLayout(x,y,0,0);
panel_1.setLayout(gd);
jt = new JTextField();
jt.setColumns(10);
GroupLayout gl_panel = new GroupLayout(panel);
gl_panel.setHorizontalGroup(
gl_panel.createParallelGroup(Alignment.LEADING)
.addComponent(jt, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE)
);
gl_panel.setVerticalGroup(
gl_panel.createParallelGroup(Alignment.LEADING)
.addComponent(jt, GroupLayout.PREFERRED_SIZE, 34, GroupLayout.PREFERRED_SIZE)
);
panel.setLayout(gl_panel);
contentPane.setLayout(gl_contentPane);
if(x!=0){
gd.setRows(x);
panel_1.setLayout(gd);
}
else
panel_1.setLayout(new GridLayout());
for(int i =0;i<strindex.length;i++){
bu.add(new JButton(strindex[i]));
}
}
public void start(){
for(JButton button:bu){
JPanel panel_2= new JPanel();
panel_2.setLayout(new FlowLayout());
panel_1.add(panel_2);
// button.setPreferredSize(new Dimension(130, 50));
panel_2.add(button);
button.setFont(new Font("微软雅黑", Font.PLAIN, 40));
button.addActionListener(this);
jt.setFont(new Font("宋体", Font.PLAIN, 30));
}
jf.setDefaultCloseOperation(EXIT_ON_CLOSE);
jf.setSize(width, height);
jf.setVisible(true);
new Adjust().start();
}
public static void main(String[] args) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
statrFrame sf=new statrFrame(500,600,5,"7,8,9,/,4,5,6,*,1,2,3,-,0,.,+,=,sqrt,->,del,abs");
sf.start();
}
});
} catch (InvocationTargetException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {
JButton jb =(JButton) e.getSource();
if(jb.getText().equals("+")||jb.getText().equals("-")||jb.getText().equals("*")||jb.getText().equals("/")||jb.getText().equals("sqrt"))
{
str2=str2+",";
str2=str2+jb.getText();
str2=str2+",";
str1=str1+jb.getText();
}
if (jb.getText().equals("="))
{
if(Answer2.suanzhi(str2) % 1.0 == 0){
str1 =Long.toString((long)Answer2.suanzhi(str2));
}
else{
str1 =Double.toString(Answer2.suanzhi(str2));
}
}
if(jb.getText().equals("1")||jb.getText().equals("2")||jb.getText().equals("3")||jb.getText().equals("4")||jb.getText().equals("5")
||jb.getText().equals("6")||jb.getText().equals("7")||jb.getText().equals("8")||jb.getText().equals("9")
||jb.getText().equals("0")||jb.getText().equals("."))
{
str1=str1+jb.getText();
str2=str2+jb.getText();
}
if (jb.getText().equals("del"))
{
str1 = "";
}
if(jb.getText().equals("->"))
{
str1 = str1.substring(0, str1.length()-1);
}
jt.setText(str1);
}
public class Adjust extends Thread{
@Override
public void run() {
while(true){
jt.setPreferredSize(new Dimension(jf.getWidth()/6, jf.getHeight()/15));
for(JButton button:bu){
button.setPreferredSize(new Dimension(jf.getWidth()/7, jf.getHeight()/10));
}
}
}
}
}
public class Answer2 {
public static double suanzhi(String str){
double zongnum=0;
double num=0;
int index=0;
int flag=0;
String s1="";
str=str+",=";
String[] ch = str.split(",");
for(int i=0;i<ch.length;i++){
String ch1 = ch[i];
switch(ch1)
{
case "=":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 0;
break;
case "+":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 1;
break;
case "-":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 2;
break;
case "*":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 3;
break;
case "/":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 4;
break;
case "sqrt":
num = Double.parseDouble(ch[i-1]);
zongnum=fflag(num,zongnum,flag);
flag = 5;
break;
case"del":
flag = 6;
break;
}
}
return zongnum;
}
private static double fflag(double num,double zongnum,int flag){
switch(flag){
case 0:
zongnum=num;
break;
case 1:
zongnum=zongnum+num;
break;
case 2:
zongnum=zongnum-num;
break;
case 3:
zongnum=zongnum*num;
break;
case 4:
zongnum=zongnum/num;
break;
case 5:
zongnum=Math.cbrt(zongnum);
break;
case 6:
zongnum = 0;
break;
}
return zongnum;
}
}