日常生活中,人們需要對某些常見圖形和幾何體做計算面積,體積,周長等相關計算。設計一個形狀計算器,完成此功能。通過對菜單的選擇,可以對不同的形狀進行計算。

日常生活中,人們需要對某些常見圖形和幾何體做計算面積,體積,周長等相關計算。設計一個形狀計算器,完成此功能。通過對菜單的選擇,可以對不同的形狀進行計算。

1 作業中的接口與類
在這裏插入圖片描述
2 抽象類用於所有空間實現JPANE

package comprehensive;

import javax.swing.JPanel;
import javax.swing.JTextField;

public abstract class AbstractPanel extends JPanel {
	private static final long serialVersionUID = 1L;
	public abstract JTextField getInputTextField();
}

2 通用接口和抽象了

// 通用抽象類
package comprehensive;
public abstract class Shape {
public abstract double area();
}

//通用接口
package comprehensive;
public interface cal {
final double PI=3.14;
double perimeter();
}


3 圓形矩形三角形圓柱的JPANE及實現類
1)接口 及實現類

//圓形jpane
package comprehensive;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JLabel;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.text.DecimalFormat;

public class CirclePanel extends AbstractPanel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JTextField txtradius;
	private JTextField txtpre;
	private JTextField txtarea;
	private JTextField input;  //用於獲取當前獲得焦點的文本框
	JButton btncal,btnclear;
	/**
	 * 創建圓形計算面板.
	 */
	public CirclePanel() {
	//	圓面板設爲網格佈局方式,屏蔽setSize方法設置的大小,使用setPreferredSize(new Dimension(200, 220))設置大小
		setLayout(new GridLayout(4, 1, 0, 0));
	//設置半徑信息面板	
		JPanel panelradius = new JPanel();
		add(panelradius);
		JLabel lblradius = new JLabel("圓的半徑是");
		panelradius.add(lblradius);
		txtradius = new JTextField();
		txtradius.addFocusListener(new Handle());
		panelradius.add(txtradius);
		txtradius.setColumns(10);
		//設置放置按鈕的面板
		JPanel panelbutton = new JPanel();
		add(panelbutton);	
		btncal = new JButton("計算");
		panelbutton.add(btncal);
		btnclear = new JButton("清除");
		panelbutton.add(btnclear);	
		JPanel panelper = new JPanel();
		add(panelper);
		//設置顯示周長信息的面板
		JLabel lblpre = new JLabel("圓的周長是");
		panelper.add(lblpre);	
		txtpre = new JTextField();
		panelper.add(txtpre);
		txtpre.setColumns(10);
		//設置顯示面積信息的面板
		JPanel panelarea = new JPanel();
		add(panelarea);
		JLabel lblarea = new JLabel("圓的面積是");
		panelarea.add(lblarea);
		txtarea = new JTextField();
		panelarea.add(txtarea);
		txtarea.setColumns(10);
		//爲“計算”按鈕和“清除”按鈕設置監聽
		btnclear.addActionListener(new ActionListener() {
			//清除兩個文本框中信息
			@Override
			public void actionPerformed(ActionEvent e) {
				txtarea.setText("");
				txtpre.setText("");
				txtradius.setText("");
			}
		});
		btncal.addActionListener(new ActionListener() {
			//計算並顯示在文本框中
			@Override
			public void actionPerformed(ActionEvent e) {
				double r=Double.parseDouble(txtradius.getText());
				Circle cir=new Circle(r);
				double ar=cir.area();
				String formatAr=new DecimalFormat(".##").format(ar);
				double per=cir.perimeter();
				String formatPer=new DecimalFormat(".##").format(per);
				txtpre.setText(formatPer);
			    txtarea.setText(formatAr);
			}
		});
	}
class Handle extends FocusAdapter{
	public void focusGained(FocusEvent e) {
		input=(JTextField) e.getSource();   //設置輸入文本框爲當前獲取焦點的文本框
	}
}
	public JTextField getInputTextField(){
			return input;   //該方法在keyPanel中調用,用於設置接收輸入的文本框
	}
}

//圓形計算接類
package comprehensive;
public class Circle extends Shape implements cal{
	private double radius;
	
public Circle(double radius) {
		super();
		this.radius = radius;
	}
	public double perimeter() {
		return 2*Math.PI*radius;
	}
	public double area() {
		return radius*radius*PI;
	}
}

//Cyiner.java
package comprehensive;

public class Cyiner extends Shape implements cal {
	private double radius;
	private double height;
	public Cyiner(double radius,double height) {
		super();
		this.radius = radius;
		this.height = height;
	}
	public double perimeter() {
		return PI * radius * radius * height;
	}
	public double area() {
		double s1 = 2 * PI * radius * height;
		double s2 = PI * radius * radius;
		return s1 + s2;
	}
}

//CyPanel.java
package comprehensive;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class CyPanel extends AbstractPanel {
	private static final long serialVersionUID = 1L;
	JTextField input;
	private JTextField txt_radius;
	private JTextField txt_height;
	private JTextField txt_per;
	private JTextField txt_area;
	JButton button_calc,button_clear;
	public CyPanel() {
		setLayout(new GridLayout(5, 1));
		
		Handle handle = new Handle();
		
		JPanel p1 = new JPanel();
		JLabel l1 = new JLabel("圓柱體的半徑是");
		txt_radius = new JTextField(8);
		txt_radius.addFocusListener(handle);
		p1.add(l1);
		p1.add(txt_radius);
		add(p1);
		
		JPanel p2 = new JPanel();
		JLabel l2 = new JLabel("  圓柱體的高是  ");
		txt_height = new JTextField(8);
		txt_height.addFocusListener(handle);
		p2.add(l2);
		p2.add(txt_height);
		add(p2);
		
		JPanel p3 = new JPanel();
		button_calc = new JButton("計算");
		button_calc.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Cyiner cy = new Cyiner(Double.parseDouble(txt_radius.getText()), 
						Double.parseDouble(txt_height.getText()));
				txt_area.setText("" + cy.area());
				txt_per.setText("" + cy.perimeter());
			}
		});
		button_clear = new JButton("清除");
		button_clear.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent arg0) {
				txt_area.setText(null);
				txt_height.setText(null);
				txt_per.setText(null);
				txt_radius.setText(null);
			}
		});
		p3.add(button_calc);
		p3.add(button_clear);
		add(p3);
		
		JPanel p4 = new JPanel();
		JLabel l3 = new JLabel("圓柱體的體積是");
		txt_per = new JTextField(10);
		p4.add(l3);
		p4.add(txt_per);
		add(p4);
		
		JPanel p5 = new JPanel();
		JLabel l4 = new JLabel("圓柱體的面積是");
		txt_area = new JTextField(10);
		p5.add(l4);
		p5.add(txt_area);
		add(p5);
	}
	public JTextField getInputTextField() {
		return input;
	}
	class Handle extends FocusAdapter{
		public void focusGained(FocusEvent e) {
			input=(JTextField) e.getSource();   //設置輸入文本框爲當前獲取焦點的文本框
		}
	}

}

//Triangle.java
package comprehensive;

public class Triangle extends Shape implements cal{
	private double a,b,c;
	public Triangle(double x,double y,double z) {
		super();
		a = x;
		b = y;
		c = z;
	}
	public double perimeter() {
		return a + b + c;
	}
	public double area() {
		double p = perimeter() / 2;
		double s = Math.sqrt(p * (p-a) * (p-b) * (p-c));
		return s;
	}
}

//TrianglePanel.java
package comprehensive;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TrianglePanel extends AbstractPanel {
	private static final long serialVersionUID = 1L;
	private JTextField txt_a;
	private JTextField txt_b;
	private JTextField txt_c;
	private JTextField txtpre;
	private JTextField txtarea;
	private JTextField input;  //用於獲取當前獲得焦點的文本框
	JButton btncal,btnclear;
	
	public TrianglePanel() {
		setLayout(new GridLayout(6, 1));
		
		JPanel pan = new JPanel();
		JLabel l1 = new JLabel("第一條邊長是");
		txt_a = new JTextField(8);
		pan.add(l1);
		pan.add(txt_a);
		add(pan);
		
		JPanel p2 = new JPanel();
		JLabel l2 = new JLabel("第二條邊長是");
		txt_b = new JTextField(8);
		p2.add(l2);
		p2.add(txt_b);
		add(p2);
		
		JPanel p3 = new JPanel();
		JLabel l3 = new JLabel("第三條邊長是");
		txt_c = new JTextField(8);
		p3.add(l3);
		p3.add(txt_c);
		add(p3);
		
		Handle handle = new Handle();
		Handles handles = new Handles();
		txt_a.addFocusListener(handle);
		txt_b.addFocusListener(handle);
		txt_c.addFocusListener(handle);
		
		
		JPanel p4 = new JPanel();
		btncal = new JButton("計算");
		btnclear = new JButton("清除");
		p4.add(btncal);
		p4.add(btnclear);
		add(p4);
		btncal.addActionListener(handles);
		btnclear.addActionListener(handles);
		
		JPanel p5 = new JPanel();
		JLabel l4 = new JLabel("三角形的周長是");
		txtpre = new JTextField(10);
		p5.add(l4);
		p5.add(txtpre);
		add(p5);
		
		JPanel p6 = new JPanel();
		JLabel l5 = new JLabel("三角形的面積是");
		txtarea = new JTextField(10);
		p6.add(l5);
		p6.add(txtarea);
		add(p6);
	}
	class Handle extends FocusAdapter{
		public void focusGained(FocusEvent e) {
			input=(JTextField) e.getSource();   //設置輸入文本框爲當前獲取焦點的文本框
		}
	}
		public JTextField getInputTextField(){
				return input;   //該方法在keyPanel中調用,用於設置接收輸入的文本框
		}
	class Handles implements ActionListener{

		public void actionPerformed(ActionEvent arg0) {
			if(arg0.getSource() == btncal) {
				Triangle t = new Triangle(Double.parseDouble(txt_a.getText()),
						Double.parseDouble(txt_b.getText()), Double.parseDouble(txt_c.getText()));
				txtarea.setText("" + t.area());
				txtpre.setText("" + t.perimeter());
			}
			if(arg0.getSource() == btnclear) {
				txt_a.setText(null);
				txt_b.setText(null);
				txt_c.setText(null);
				txtarea.setText(null);
				txtpre.setText(null);
			}
		}
		
	}
}

//Rect.java
package comprehensive;
public class Rect extends Shape implements cal{
	private double len;
	private double wedth;
	public Rect(double len,double wedth) {
		super();
		this.len = len;
		this.wedth = wedth;
	}
	public double perimeter() {
		return len + wedth;
	}
	public double area() {
		return len * wedth;
	}
}

//RectPanel.java
package comprehensive;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JLabel;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

public class RectPanel extends AbstractPanel {
	private static final long serialVersionUID = 1L;
	private JTextField txtlength,txtwidth;
	private JTextField txtpre;
	private JTextField txtarea;
	private JTextField input;  //用於獲取當前獲得焦點的文本框
	JButton btncal,btnclear;
	/**
	 * 創建圓形計算面板.
	 */
	public RectPanel() {
	//	圓面板設爲網格佈局方式,屏蔽setSize方法設置的大小,使用setPreferredSize(new Dimension(200, 220))設置大小
		setLayout(new GridLayout(5, 1, 0, 0));
	//設置長度信息面板	
		JPanel panellength = new JPanel();
		add(panellength);
		JLabel lbllength = new JLabel("矩形的長是");
		panellength.add(lbllength);
		txtlength = new JTextField();
		txtlength.addFocusListener(new Handle());
		panellength.add(txtlength);
		txtlength.setColumns(10);
		//設置寬度信息面板	
				JPanel panelwidth= new JPanel();
				add(panelwidth);
				JLabel lblwidth = new JLabel("矩形的寬是");
				panelwidth.add(lblwidth);
				txtwidth = new JTextField();
				panelwidth.add(txtwidth);
				txtwidth.addFocusListener(new Handle());
				txtwidth.setColumns(10);
		//設置放置按鈕的面板
		JPanel panelbutton = new JPanel();
		add(panelbutton);
		btncal = new JButton("計算");
		panelbutton.add(btncal);
		btncal.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				double a = Double.parseDouble(txtlength.getText());
				double b = Double.parseDouble(txtwidth.getText());
				Rect rect = new Rect(a, b);
				txtpre.setText(""+rect.perimeter());
				txtarea.setText(""+rect.area());
			}
		});
		btnclear = new JButton("清除");
		panelbutton.add(btnclear);	
		btnclear.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				txtarea.setText(null);
				txtlength.setText(null);
				txtwidth.setText(null);
				txtpre.setText(null);
			}
		});
		JPanel panelper = new JPanel();
		add(panelper);
		//設置顯示周長信息的面板
		JLabel lblpre = new JLabel("矩形的周長是");
		panelper.add(lblpre);	
		txtpre = new JTextField();
		panelper.add(txtpre);
		txtpre.setColumns(10);
		//設置顯示面積信息的面板
		JPanel panelarea = new JPanel();
		add(panelarea);
		JLabel lblarea = new JLabel("矩形的面積是");
		panelarea.add(lblarea);
		txtarea = new JTextField();
		panelarea.add(txtarea);
		txtarea.setColumns(10);
	}
	class Handle extends FocusAdapter{
		public void focusGained(FocusEvent e) {
			input=(JTextField) e.getSource();   //設置輸入文本框爲當前獲取焦點的文本框
		}
	}
		public JTextField getInputTextField(){
				return input;   //該方法在keyPanel中調用,用於設置接收輸入的文本框
		}
	}


//輸入鍵盤
package comprehensive;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;

public class KeyPanel extends JPanel {

	private static final long serialVersionUID = 1L;
	/**
	 * 創建輸入鍵盤面板
	 */
	JButton[] keyButton=new JButton[12];
	String[] num={"1","2","3","4","5","6","7","8","9","0",".","BackSpace"};
	AbstractPanel selectedPanel;  //表示當前選擇的圖形面板,鍵入數據要傳遞到當前選擇的面板中
	JTextField inputTextField;
	
	public KeyPanel() {
		setPreferredSize(new Dimension(350, 230));
		setLayout(new GridLayout(4,3));
		Border lb=BorderFactory.createLineBorder(Color.gray, 2);
		setBorder(lb);
		Handle handle=new Handle();
		for(int i=0;i<12;i++){
			keyButton[i]=new JButton(num[i]);
		    keyButton[i].setFont(new Font("Arial",Font.BOLD,15));
			keyButton[i].setForeground(Color.BLACK);
			keyButton[i].addActionListener(handle);
			add(keyButton[i]);
		}
	}
class Handle implements ActionListener{
	@Override
	public void actionPerformed(ActionEvent e) {
		JButton button=(JButton)e.getSource();  //獲取事件源,看是哪個按鈕被按下
		inputTextField=selectedPanel.getInputTextField();   //從傳遞來的形狀面板中獲取當前得到焦點的文本框
		inputNumber(inputTextField, button);  //調用inputNumber方法,在該文本框中輸入數據	
	}
}
public void setSelectedPanel(AbstractPanel selected){
	selectedPanel = selected;
}

public void  inputNumber(JTextField tf,JButton button){  //根據不同事件源在文本框中顯示不同信息
	String oldString=tf.getText();  //獲取文本框中已有信息
	if(oldString==null){
		tf.setText(" ");
	}
	String subStr=oldString.substring(0, oldString.length());  //根據不同事件源的不同情況,設置不同的值
	String newString=button.getText();   
	if(newString.equals("BackSpace")){
		tf.setText(subStr);
	}
	else if(newString.equals(".")){
		tf.setText(oldString+".");
	}
	else{
		tf.setText(oldString+newString);
	}
}

}

//主運行程序 採用網格佈局管理方式
package comprehensive;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;

public class CalculatorWindow extends JFrame {

	private static final long serialVersionUID = 1L;
	private KeyPanel keypanel;
	private AbstractPanel cirPanel,rectPanel,trianPanel,cyPanel;
	private CardLayout card;
	//菜單選項需要進行事件處理
	JMenuItem menuExit;
	JRadioButtonMenuItem menuCircle, menuRect,menuTangle,menuCyinder;
	JPanel panelWest;  //根據選項顯示面板
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					CalculatorWindow frame = new CalculatorWindow();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public CalculatorWindow() {
		setTitle("圖形計算器");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 590, 306);
		Container con=getContentPane();
		//con.setLayout(new GridLayout(1,2));
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		Handle handle=new Handle();
		//添加“文件”菜單、菜單項及爲菜單項添加監聽
		JMenu menuFile = new JMenu("文件");
		menuBar.add(menuFile);
		menuExit = new JMenuItem("退出");
		menuExit.addActionListener(handle);
		menuFile.add(menuExit);
		//添加“計算”菜單、菜單項及爲菜單項添加監聽
		JMenu menuCalcu = new JMenu("計算");
		menuBar.add(menuCalcu);
		ButtonGroup group = new ButtonGroup();
		menuCircle = new JRadioButtonMenuItem("圓形");
		menuCircle.addActionListener(handle);
		menuCalcu.add(menuCircle);
		
		menuRect = new JRadioButtonMenuItem("矩形");
		menuRect.addActionListener(handle);
		menuCalcu.add(menuRect);
		
		menuTangle = new JRadioButtonMenuItem("三角形");
		menuTangle.addActionListener(handle);
		menuCalcu.add(menuTangle);
		
		menuCyinder = new JRadioButtonMenuItem("圓柱體");
		menuCyinder.addActionListener(handle);
		menuCalcu.add(menuCyinder);
		
		group.add(menuCyinder);
		group.add(menuTangle);
		group.add(menuRect);
		group.add(menuCircle);
		
		//主窗口左方面板爲卡片佈局方式,按需求顯示形狀面板
		panelWest = new JPanel();
		panelWest.setPreferredSize(new Dimension(220, 0));
		panelWest.setSize(220, 280);
		card = new CardLayout();
		panelWest.setLayout(card);
		//添加卡片面板,併爲其取卡片名
		cirPanel=new CirclePanel();
		rectPanel=new RectPanel();
		trianPanel = new TrianglePanel();
		cyPanel = new CyPanel();
		panelWest.add("0",cirPanel);
		panelWest.add("1",rectPanel);
		panelWest.add("2",trianPanel);
		panelWest.add("3",cyPanel);
		con.add(panelWest,BorderLayout.WEST);
		
		//主窗口右側面板中顯示keyPanel,用於輸入數字
		JPanel panelEast = new JPanel();
		panelEast.setPreferredSize(new Dimension(360, 0));
		keypanel=new KeyPanel();
		keypanel.setSelectedPanel(cirPanel);  //設置啓動時,顯示的圖形面板爲cirPanel,通過參數傳遞給keypanel,用於接收輸入
		panelEast.add(keypanel);
		con.add(panelEast,BorderLayout.EAST);	
	}
	
//ActionEvent事件處理,根據菜單選項,顯示對應卡片
	class Handle implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
			if(e.getSource() == menuExit){
                System.exit(0);
			}else if(e.getSource() == menuCircle){
				card.show(panelWest, "0");
				keypanel.setSelectedPanel(cirPanel);
			}else if(e.getSource() == menuRect){
				card.show(panelWest, "1");
				keypanel.setSelectedPanel(rectPanel);
			}else if(e.getSource() == menuTangle) {
				card.show(panelWest, "2");
				keypanel.setSelectedPanel(trianPanel);
			}else if(e.getSource() == menuCyinder) {
				card.show(panelWest, "3");
				keypanel.setSelectedPanel(cyPanel);
			}
		}
		
	}

}

運行結果

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章