这是入门java以来的第一个小项目,希望可以从中学到东西,而不是单纯地懂得Swing的一些功能,持续更新中
/*************************************************************************/
19.5.14
//第一个类:主类
package Calculator_advance;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
public class Calculator_advance {
public static void main(String[] args) {
// TODO Auto-generated method stub
new WindowFlow("计算器");
}
}
//第二个类:布局
package Calculator_advance;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
public class WindowFlow extends JFrame implements ActionListener{
JMenuBar menubar;
JMenu menu;
JMenuItem item1,item2,item3;
JLabel inputScreen = new JLabel();
int count=0;
String str;
static int choose=0;
WindowFlow(String s)
{
setTitle(s);
setBounds(100,100,300,450);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//第一种:菜单选择
menubar = new JMenuBar();
menu = new JMenu("模式选择");
item1 = new JMenuItem("基本型");
item2 = new JMenuItem("科学型");
item3 = new JMenuItem("关闭");
menu.add(item1);
menu.add(item2);
menu.add(item3);
menubar.add(menu);
setJMenuBar(menubar);
inputScreen.setSize(280,100);
add(inputScreen,BorderLayout.NORTH);
inputScreen.setText("0");
inputScreen.setFont(new Font("SERIF",Font.BOLD,40));
inputScreen.setHorizontalAlignment(JLabel.RIGHT);
inputScreen.setBorder(BorderFactory.createLineBorder(Color.black));
JPanel ButtonContainer = new JPanel();
add(ButtonContainer);
String Buttonnumbers[] = {"7","8","9","+",
"4","5","6","-",
"1","2","3","*",
"0",".","/","=",
"clear"};
for(String string:Buttonnumbers)
{
JButton b = new JButton(string);
if(string !="clear")
b.setPreferredSize(new Dimension(60,60));
else b.setPreferredSize(new Dimension(240,60));
ButtonContainer.add(b);
b.addActionListener(this);
}
setVisible(true);
validate();
/*
* 事件处理
*/
item1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
choose=1;
System.out.println(choose);
}
});
item2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
choose=2;
System.out.println(choose);
}
});
item3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
MathSampleOperation Math =new MathSampleOperation();
count++;
if(count==1)
inputScreen.setText("");//不显示0
if(e.getActionCommand()!="=")
inputScreen.setText(inputScreen.getText()+e.getActionCommand());
else
{
inputScreen.setText(inputScreen.getText()+"="+Math.eval(inputScreen.getText()));
}
if(e.getActionCommand().equals("clear")==true)
{
inputScreen.setText("0");
count=0;
}
}
}
//第三个类:算术操作
package Calculator_advance;
public class MathSampleOperation {
public String str;
public double numa,numb;
public double eval(String str)//此处划分可以再优化
{
String[] strnum = str.split("[\\p{Punct}]+");//\n 6\n9
String[] strstr = str.split("[\\d]+");// \n +
numa = Double.parseDouble(strnum[0]);
numb = Double.parseDouble(strnum[1]);
switch (strstr[1]) {
case "+":
return numa+numb;
case "-":
return numa-numb;
case "*":
return numa*numb;
case "/":
return numa/numb;
default:
return Math.E;
}
}
}
效果如图:
上面主要实现的仅仅是基本型的整体布局和简单的两个数之间的运算!
接下来就需要不断完善功能啦,我会分时间段来完善,希望最后呈现给大家的是一个功能齐全的计算器!
/*************************************************************************/
19.5.15——>主要实现了基本型的混合运算,只改了混合型运算的代码
//仅改动了第三个类——算术操作类(但这个方法比较麻烦,而且实现过程中自己忽略了一些知识点,导致找了很久)
//String类型的比较一定要用str.equals();不能用'=='
我开始习惯性地用了'==',之后过程测试中发现出现并没有进入条件语句中
package Calculator_advance;
import java.util.Scanner;
public class MathSampleOperation {
public String str;
public double eval(String str)//此处划分可以再优化
{
int i,k=0,count=0;
double sum=0;
double[] number = new double[20];
String[] strArray =new String[20];
double[] newnumber = new double[20];
String[] newstrArray =new String[20];
String[] strnum = str.split("[\\p{Punct}]+");
String[] strstr = str.split("[\\d]+");
//输出部分为过程测试
for(i=0;i<strnum.length;i++) //数字串
{
number[i] = Double.parseDouble(strnum[i]);
// System.out.print(number[i]+" ");
}
// System.out.println();
for(i=0;i<strstr.length-1;i++) //字符串
{
strArray[i] = strstr[i+1];
// System.out.print(strArray[i]+" ");
}
// System.out.println();
//String类型的比较一定要用str.equals();不能用'=='
for(i=0;i<strstr.length-1;i++)
{
if((strArray[i].equals("*") || strArray[i].equals("/")) && count==0)
{
sum=sum+number[i];
count++;
switch(strArray[i])
{
case "*":
sum=sum*number[i+1];
break;
case "/":
sum=sum/number[i+1];
break;
}
}
else if((strArray[i].equals("*") || strArray[i].equals("/")) && count!=0)
{
switch(strArray[i])
{
case "*":
sum=sum*number[i+1];
break;
case "/":
sum=sum/number[i+1];
break;
default:
break;
}
}
else if(!strArray[i].equals("*") && !strArray[i].equals("/") && i!=0 && count==0)
{
newnumber[k]=number[i];
newstrArray[k]=strArray[i];
k++;
sum=0;
count=0;
}
else if(!strArray[i].equals("*") && !strArray[i].equals("/") && i!=0 && count!=0)
{
newnumber[k]=sum;
newstrArray[k]=strArray[i];
k++;
sum=0;
count=0;
}
else if(!strArray[i].equals("*") && !strArray[i].equals("/") && i==0)
{
newnumber[k]=number[0];
newstrArray[k]=strArray[0];
k+