1、完成书上239页实验题目1和题目2
题目1
package chap10.test;
//awt是一个软件包,包含用于创建用户界面和绘制图形图像的所有分类。
import java.awt.BorderLayout;//边界管理器
import java.awt.Color;
import java.awt.FlowLayout;//流布局一般用来安排面板中的按钮。它使得按钮呈水平放置,直到同一条线上再也没有适合的按钮。
import java.awt.Font;// Font 类表示字体,可以使用它以可见方式呈现文本。
import java.awt.GridLayout;//灵活的布局管理器,它不要求组件的大小相同便可以将组件垂直、水平或沿它们的基线对齐。
import java.awt.event.ActionEvent;//当特定于组件的动作(比如被按下)发生时,由组件(比如 Button)生成此高级别事件。
import java.awt.event.ActionListener;//ActionListener动作事件监听器,当你在点击按钮时希望可以实现一个操作就得用到该接口了
import javax.swing.JButton;//按钮
import javax.swing.JFrame;//一个普通的窗口
import javax.swing.JPanel;//一般轻量级面板容器组件
import javax.swing.JTextField;//文本框
public class Calculation {
//将窗口中需要控制的组件定义为属性
private JFrame jf;
private JTextField field;
private JButton[] allButtons;//所有按钮
//在构造方法中创建组件
public Calculation(){
jf = new JFrame("Swing计算器");
field = new JTextField(20);//文本框大小
field.setText("0");//修改 Field 内容
field.setHorizontalAlignment(JTextField.RIGHT); //文本框内容右对齐
allButtons = new JButton[20];//所有按钮一共20个
String str="←C√±789/456*123-0.=+";//按钮有哪些
for(int i=0; i<str.length(); i++){
allButtons[i]=new JButton(str.substring(i,i+1));
}//排入窗口
}
//初始化窗口,设置布局
public void init(){
JPanel northPanel = new JPanel();//对象实列化吗,创建内存
northPanel.setLayout(new FlowLayout());//设置布局
JPanel centerPanel = new JPanel();
GridLayout grid = new GridLayout(5,4,2,2);//45行4列,小组件之间的距离为2
centerPanel.setLayout(grid);//设置
northPanel.add(field);//添加
for(int i=0; i<allButtons.length; i++){
centerPanel.add(allButtons[i]);//前面按键的大小循环规定
}
jf.add(northPanel,BorderLayout.NORTH);
jf.add(centerPanel,BorderLayout.CENTER); //将创建的组件放入
}
//设置字体和颜色
public void SetFontAndColor(){
Font f_text = new Font("Times New Roman",Font.BOLD,16);
Font f_button = new Font("Batang",Font.BOLD,16);//字体样式,加粗和大小
field.setFont(f_text);
for(int i=0; i<allButtons.length; i++){
allButtons[i].setFont(f_button);
allButtons[i].setBackground(Color.WHITE);
allButtons[i].setForeground(Color.darkGray);
}
}
public void show(){//输出时的样式
init();
SetFontAndColor();
addEventHandler();
jf.pack();
jf.setLocation(300,200);
jf.setResizable(false);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //调用包里自带的函数
}
public static void main(String[] args){//主函数
new Calculation().show();
}//全局静态
public void addEventHandler(){ //添加监听
for(int i=0; i<allButtons.length; i++){ //按钮区监听
allButtons[i].addActionListener(new CalculateActionHandler());
}
}
//全局初值,只被赋值一次
double op1=0, op2=0;//64位来存储浮点数
String operator="",pre_operator="";
boolean flag = true;//下面循环的进入
private class CalculateActionHandler implements ActionListener{ //接口
public void actionPerformed(ActionEvent e) { //方法重写
String command = e.getActionCommand(); //按钮上的文本
if(command.equalsIgnoreCase("c")){
field.setText(null);//清除
}
else if(command.equals("←"))
{//退格
String text = field.getText();//获取添加类容
if(text.length()==0){ //已空
return;
}else if(text.length()==2 && text.substring(0,1).equals("-")){//清空后长度为1且只剩负号
field.setText(null);
}else{
field.setText(text.substring(0, text.length()-1));
}
}
else if("0123456789.".indexOf(command)!=-1){ //数字按钮或小数点按钮
if( field.getText().indexOf(".")!=-1 && command.equals(".") ){ //出现多个小数点的情况
return; //忽略多输入的小数点
}
if(field.getText().length()==1 && field.getText().equals("0")){//开头是0
field.setText(null);
}
if(flag){
field.setText(command);
}else{
field.setText(field.getText()+command);
}
flag=false;//结束循环
}else if("+-*/".indexOf(command)!=-1){ //运算符号按钮
//取文本框中的数据
pre_operator = field.getText();
op1 = Double.valueOf(field.getText());
//记下符号
operator= command;
//清空文本框
field.setText(null);
}else if(command.equalsIgnoreCase("="))
{//等号
//取当前文本框中的数据
double res = 0;//参数
String text =field.getText();//获取类容
if(text.length()>0){
op2 = Double.valueOf(text);
if (operator.equals("+")){
res = op1 + op2;
}else if(operator.equals("-")){
res = op1 - op2;
}else if (operator.equals("*")){
res = op1 * op2;
}else {
res = op1 / op2;
}
if(text.indexOf(".")!=-1 || pre_operator.indexOf(".")!=-1 || operator.equals("/") )//小数
// indexof返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
{
field.setText(String.valueOf(res));
}else{//两个都是整数
field.setText(String.valueOf((int)res));
}
}
flag=true;
}else if(command.equals("√")){//开方
String text =field.getText();
if(text.length()>0){
op2 = Double.valueOf(text);
if(op2>0){
field.setText(String.valueOf(Math.sqrt(op2)));
}else{
field.setText("无效输入");
}
flag=true;
}
}else if(command.equals("±")){ //负号
String text =field.getText();
if(text.length()>0){
op2 = -Double.valueOf(text);
if(text.indexOf(".")!=-1){
field.setText(String.valueOf(op2));
}else{
field.setText(String.valueOf((int)op2));
}
flag=true;
}
}
}
}
}
题目2