【实验七】界面化和事件处理

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellenionia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值