利用Java制作简易计算器

osc_46995132 发布于 2021/12/16 09:26
阅读 991
收藏 0

这个怎么制作 有点绕不过来

加载中
1
李嘉图
李嘉图

你好,自己的作业自己写

0
majiajue
majiajue

java swing 或者现在交java flex了

0
0
艾皮狗
艾皮狗

Java Swing其实很强大.

但同时swing也是一个怪兽, 在训服怪兽之前, 你更多时候是憎恶它.

swing的两大难题:

1. 谜一样的布局组件和布局行为, 与传统WEB上的div布局差异巨大. 其实原因也很简单, 二者的编程理念不同: swing是命令式的, 可定制任何细节(不过代价是: 陡峭的学习路径+大量编码), web的div是声明式的, 就像SQL语言一样, 只能使用它已提供的有限特性, 为外观和行为指定属性, 但绝大多数情况下, 这就够用了, 而且开发效率高, 代码量很少. 性能可能差点.

2. 业务代码与UI组件代码混杂一起. 这是个很麻烦的事, 如果你的项目比较大. 那就更糟糕了. 当前流行的MVVM双相绑定模式很好的解决了这个问题. 但很不幸, swing很古老, 它是变种的MVC模式. 因此, 如果有效地组织和隔离业务代码与UI组件代码, 将会是一大挑战

0
tcxu
tcxu
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JOptionPane;

public class Ca extends JFrame implements ActionListener {
	
	private JPanel calJPanel; // 装载按钮的面板
   	private JButton buttons[]; //按钮数组
   	private JTextField textField1, textField2; //输入双精度数据的文本框
   	private final int N = 4; //四则运算,四个按钮

   	private JLabel label1 = new JLabel("数 1 = ");
   	private JLabel lavel2 = new JLabel("数 2 = ");
   	String symbol[]={"+","-","*","/"}; // 运算符数组
   	
   	public void actionPerformed(ActionEvent e){ 
   		for (int i=0;i<N;i++)
   		if (e.getSource() == buttons[i]){
   			double d1 = Double.parseDouble(textField1.getText());
   			double d2 = Double.parseDouble(textField2.getText());
   			double result;
   			if(i==0)
   			result = d1 + d2;
   			else if(i==1)
   			result = d1 - d2;
   			else if (i==2)
   			result = d1 * d2;
   			else
   			result = d1/d2;
   		
   		String s = Double.toString(d1) + symbol[i] + Double.toString(d2) + " = " + Double.toString(result);
   		System.out.println(s);
   		JOptionPane.showMessageDialog(null, s ,"运算结果",2);

   		continue;
   		}
   	}
   	
   
	public Ca(){
	  super( "简单计算器" ); //标题栏的字符串居中
	  JLabel title = new JLabel("简单计算器", JLabel.CENTER);
	  	Font f = new Font("宋体",Font.BOLD,36); //设置字体
		title.setFont(f);
		title.setForeground(Color.blue); // 设置标题的颜色
	
	  add(new JPanel().add(title), BorderLayout.NORTH);

	  JPanel centerPanel = new JPanel();
	  
	  centerPanel.setLayout(null);	  
	  
	  JLabel num1 = new JLabel("数 1 = ");
	  num1.setBounds(70,30,100,10);
	  centerPanel.add(num1);
	  
	  textField1 = new JTextField();
	  textField1.setBounds(140,20,150,30);
	  centerPanel.add(textField1);
	  
	   JLabel num2 = new JLabel("数 2 = ");
	  num2.setBounds(70,100,100,40);
	  centerPanel.add(num2);
	  
	  textField2 = new JTextField();
	  textField2.setBounds(140,100,150,30);
	  centerPanel.add(textField2);
		
	  add(centerPanel, BorderLayout.CENTER);
	  	
	  	buttons = new JButton[N];
      calJPanel = new JPanel(); // set up panel
      calJPanel.setLayout( new GridLayout( 2, buttons.length+2, 5,10 ) );
	
		calJPanel.add(new JLabel(" "));
	  String symbol[]={"加","减","乘","除"};
      for ( int count = 0; count < buttons.length; count++ ) {
         buttons[ count ] = new JButton(  symbol[count]  );
         buttons[ count ].addActionListener(this);
         calJPanel.add( buttons[ count ] ); // add button to panel
      } // end for
      calJPanel.add(new JLabel());
      
      for(int i=0;i<7;i++)
      calJPanel.add(new JLabel());
    add( calJPanel, BorderLayout.SOUTH ); // add panel to JFrame
    
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setSize(450,300);
	setVisible(true);
	}
	
   public static void main( String args[] ){ 
   new Ca();
   } // end main
} // end class Ca

使用java布局管理器的说明:

无论是边界 Border-,还是网格 Grid- 布局管理器Layout,其分区面板里 (如 EAST,WEST,SOUTH, NORTH, CENTER, 或每个网格)的组件(如 标签 JLabel,文本框 JTextField, 按钮 JButton 等 ), 都要被 “拉伸”, 即充满给定的面板。在这种场合下,调用组件的 setPreferredSize(Dimension preferredSize) 方法是无济于事的,。比如,要缩小文本框(或按钮) 的尺寸,用上述方法就不可能奏效。只能使用其它手段:

  1. 在按钮之间添加不显示的无用元素,或 增加横向 hgap 或纵向 vgap间隙(指定组件的间隔),使按钮尺寸变小。
  2. 放弃使用现有的布局管理器, 即 setLayout(null),调用的是 每个组件的 setBounds(int x, int y, int w, int h),如此来 自定义各个组件的位置和尺寸。

目前的做法是:

总的布局采用 东西南北中边界布局管理器 BorderLayout。

北区 BorderLayout.NORTH 只显示一个名称”简单计算器”,设置一个 标签JLabel即可。调用它自身的方法,就可以搞定字体尺寸、颜色、位置等。

中区 BorderLayout.CENTER 若采用 GridLayout, 两个文本框会被”拉伸”,无法搞定给定的宽和高。  所以,放弃现成的布局管理器,使用 手段  2 (自定义的办法  setBounds(int x, int y, int w, int h)。

0
tcxu
tcxu

当然,最直接的办法是自定义各种组件的位置和宽高, 即调用组件的方法 setBounds(int x, int y, int w, int h), 逐个搞定每个组件的位置和尺寸。这样可以避免使用各种布局管理器的短板。 

import javax.swing.*;
import java.awt.*;

public class Calculator extends JFrame{
	  
 JTextField f[] = new JTextField[2];
 JButton bt[] = new JButton[4];
 
 public Calculator(){
 	super("简单计算器");
 	setLayout(null);
  	JLabel title = new JLabel("简单计算器");
  	title.setFont(new Font("黑体",Font.BOLD,30));
  	title.setBounds(120,50,300,50);
  	add(title);
 	String name [] = {"加","减","乘","除"};
  	for(int i=0;i<4;i++){
  		bt[i] = new JButton(name[i]);
  		bt[i].setFont(new Font("黑体",Font.BOLD,16));
    	add(bt[i]);
  		bt[i].setBounds((50 + 80*i), 200 , 60, 30);
  };
  
  	for(int i=0;i<2;i++){
  		JLabel j = new JLabel("数" + (i+1));
  		j.setBounds(60, 120+ i*40, 50,30);
  		j.setFont(new Font("黑体",Font.BOLD,16));
  		add(j);
  		f[i] = new JTextField();
  		f[i].setBounds(160, 120+ i*40, 150,30);
  		add(f[i]);
  	};
   DrawPanel drawpanel = new DrawPanel();
   drawpanel.setBounds(0,0,420,340);
   add(drawpanel); //添加坐标网格
 setSize(420, 340);
 setVisible(true);
 }
	
 public static void main(String args[]){
   new Calculator();
 	}
 }

class DrawPanel extends JPanel{ // 画坐标系网格的面板类
 
 public void paintComponent(Graphics g){
 super.paintComponent(g);
/* 画坐标线 */	
 for (int i=0;i<=30;i++){
 if (i%10 == 0)
 	g.setColor(Color.red);
 	else
 	g.setColor(Color.blue);
 g.drawLine(0,10*i, 400, 10*i);
 	}
 for (int i=0;i<=40;i++){
 if (i%10 == 0)
 	g.setColor(Color.red);
 	else
 	g.setColor(Color.blue);
 g.drawLine(10*i,0, 10*i, 300);
 	} 
  }
}

注意:组件一定要在类 Calculator 定义中的构造方法中搞定, 不得通过 画板类 DrawPanel 的 paint Component(Graphics g) 搞定。因为,画板类中的 paintComponen(Graphics g) 方法, 是专门为画笔 g 画图而设计的,这个方法有时,如创建动画,可以重复多次调用。

其实,不用 import javax.swing.*; 就能完成任务。

import java.awt.*;
import java.awt.event.*;

public class Cal extends Frame{
	  
 TextField f[] = new TextField[2];
 Button bt[] = new Button[4];
 
 public Cal(){
 	super("简单计算器");
 	setLayout(null);
  	Label title = new Label("简单计算器");
  	title.setFont(new Font("黑体",Font.BOLD,30));
  	title.setBounds(120,50,300,50);
  	add(title);
 	String name [] = {"加","减","乘","除"};
  	for(int i=0;i<4;i++){
  		bt[i] = new Button(name[i]);
  		bt[i].setFont(new Font("黑体",Font.BOLD,16));
    	add(bt[i]);
  		bt[i].setBounds((50 + 80*i), 200 , 60, 30);
  };
  
  	for(int i=0;i<2;i++){
  		Label j = new Label("数" + (i+1));
  		j.setBounds(60, 120+ i*40, 50,30);
  		j.setFont(new Font("黑体",Font.BOLD,16));
  		add(j);
  		f[i] = new TextField();
  		f[i].setBounds(160, 120+ i*40, 150,30);
  		add(f[i]);
  	};
 
  addWindowListener(new WindowAdapter(){
 	public void windowClosing(WindowEvent e){
 	System.exit(0);
 		}
 	});  
 setSize(420, 340);
 setVisible(true);
 
 }
	
 public static void main(String args[]){
   new Cal();
 	}
 }

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部