代碼:
import javax.swing.*;
import java.awt.*;
//創建一個計算器實例,並進行測試
public class CalculatorPanelTest {
public static void main(String[] args)
{
EventQueue.invokeLater(() -> {
CalculatorFrame frame = new CalculatorFrame();
frame.setTitle("Calculator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
import javax.swing.*;
//創建一個框架
public class CalculatorFrame extends JFrame
{
public CalculatorFrame()
{
add(new CalculatorPanel());
setLocation(200,200);
pack();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//計算器面板,計算器的主要類
public class CalculatorPanel extends JPanel {
private JButton display; //計算器顯示
private JPanel panel; //計算器數字和運算符按鈕
private double result; //儲存計算結果
private String lastCommand; //上一次輸入的運算符
private boolean start; // 是否爲開始 或 清空
private boolean flag; // 是否更新運算符
public CalculatorPanel() {
setLayout(new BorderLayout()); //總體面板
//初始變量
flag = false;
result = 0;
panel = new JPanel();
lastCommand = "=";
start = true;
display = new JButton("0");
//添加計算器顯示,並佈局在北方(上方)
add(display, BorderLayout.NORTH);
display.setEnabled(false);
//設置按鈕面板佈局
panel.setLayout(new GridLayout(4,4));
//創建 數字 和 運算符 兩種事件監聽器
ActionListener insert = new InsertAction();
ActionListener command = new CommandAction();
//爲按鈕面板添加具體按鈕,並綁定事件
addButton("7", insert);
addButton("8", insert);
addButton("9", insert);
addButton("/", command);
addButton("4", insert);
addButton("5", insert);
addButton("6", insert);
addButton("*", command);
addButton("1", insert);
addButton("2", insert);
addButton("3", insert);
addButton("-", command);
addButton("0", insert);
addButton(".", insert);
addButton("=", command);
addButton("+", command);
//添加按鈕面板,並佈局在中間位置
add(panel,BorderLayout.CENTER);
}
//添加按鈕,並綁定事件監聽器
private void addButton(String s, ActionListener l){
JButton jButton = new JButton(s);
jButton.addActionListener(l);
panel.add(jButton);
}
//創建 數字(insert)類的事件監聽器
private class InsertAction implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String input = e.getActionCommand();
if(start){
display.setText("");
start = false;
}
display.setText(display.getActionCommand()+input);
flag = false;
}
}
//創建 運算符 (command)類的事件監聽器
private class CommandAction implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(flag && command.equals(lastCommand)) return;//多次點擊同一運算符只執行一次
if(flag){
// 多次點擊不同運算符,對運算符進行更新
lastCommand = command;
return;
}
String num = display.getActionCommand();
if(num == "") num="0";
calculate(Double.parseDouble(num));
lastCommand = command;
start = true;
flag = true;
}
}
//計算器進行計算,並計算器將結果顯示
public void calculate(double x){
if(lastCommand.equals("=")){result = x;flag=false;}
else if(lastCommand.equals("+"))result +=x;
else if(lastCommand.equals("-"))result -=x;
else if(lastCommand.equals("*"))result *=x;
else if(lastCommand.equals("/"))result /=x;
display.setText(""+result);
}
//設置面板的大小
@Override
public Dimension getPreferredSize(){
return new Dimension(300,200);
}
}
效果圖: