用Java gui写一个实现加减乘除和求余的计算器,其上面要有查看、编辑和帮助的菜单栏,它的旁边有计算的历史记录,可以清除和保存计算的历史记录,可以滚动查看
时间: 2023-12-03 16:44:18 浏览: 174
Java Swing版本计算器
好的,我会为你提供一个简单的Java GUI计算器程序,包括菜单栏和历史记录功能。
首先,我们需要导入必要的包:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import java.util.ArrayList;
```
接下来,我们定义一个名为Calculator的类,该类继承了JFrame类,并实现了ActionListener接口和ItemListener接口。
```java
public class Calculator extends JFrame implements ActionListener, ItemListener {
// 声明变量
private JPanel panel;
private JTextField displayField;
private JMenuBar menuBar;
private JMenu fileMenu, editMenu, helpMenu;
private JMenuItem saveItem, clearItem, exitItem, copyItem, pasteItem, aboutItem;
private JCheckBoxMenuItem historyItem;
private JTextArea historyArea;
private ArrayList<String> historyList;
// 构造函数
public Calculator() {
// 设置窗口标题
super("简单计算器");
// 初始化历史记录列表
historyList = new ArrayList<String>();
// 创建面板并设置布局
panel = new JPanel(new BorderLayout());
// 创建文本框并添加到面板中
displayField = new JTextField();
displayField.setEditable(false);
panel.add(displayField, BorderLayout.NORTH);
// 创建菜单栏并添加到窗口中
menuBar = new JMenuBar();
setJMenuBar(menuBar);
// 添加文件菜单和菜单项
fileMenu = new JMenu("文件");
menuBar.add(fileMenu);
saveItem = new JMenuItem("保存历史记录");
clearItem = new JMenuItem("清除历史记录");
exitItem = new JMenuItem("退出");
fileMenu.add(saveItem);
fileMenu.add(clearItem);
fileMenu.addSeparator();
fileMenu.add(exitItem);
saveItem.addActionListener(this);
clearItem.addActionListener(this);
exitItem.addActionListener(this);
// 添加编辑菜单和菜单项
editMenu = new JMenu("编辑");
menuBar.add(editMenu);
copyItem = new JMenuItem("复制");
pasteItem = new JMenuItem("粘贴");
editMenu.add(copyItem);
editMenu.add(pasteItem);
copyItem.addActionListener(this);
pasteItem.addActionListener(this);
// 添加帮助菜单和菜单项
helpMenu = new JMenu("帮助");
menuBar.add(helpMenu);
aboutItem = new JMenuItem("关于");
historyItem = new JCheckBoxMenuItem("历史记录");
helpMenu.add(historyItem);
helpMenu.add(aboutItem);
historyItem.addItemListener(this);
aboutItem.addActionListener(this);
// 创建历史记录区域并添加到面板中
historyArea = new JTextArea(10, 20);
historyArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(historyArea);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
panel.add(scrollPane, BorderLayout.CENTER);
// 添加面板到窗口中
add(panel);
// 设置窗口大小并显示
setSize(400, 300);
setVisible(true);
}
// 实现ActionListener接口
public void actionPerformed(ActionEvent e) {
if (e.getSource() == saveItem) {
saveHistory();
} else if (e.getSource() == clearItem) {
clearHistory();
} else if (e.getSource() == exitItem) {
System.exit(0);
} else if (e.getSource() == copyItem) {
displayField.copy();
} else if (e.getSource() == pasteItem) {
displayField.paste();
} else if (e.getSource() == aboutItem) {
JOptionPane.showMessageDialog(this, "简单计算器\n版本:1.0\n作者:XXX");
}
}
// 实现ItemListener接口
public void itemStateChanged(ItemEvent e) {
if (e.getItem() == historyItem) {
if (historyItem.isSelected()) {
panel.setPreferredSize(new Dimension(400, 500));
pack();
} else {
panel.setPreferredSize(new Dimension(400, 300));
pack();
}
}
}
// 保存历史记录
private void saveHistory() {
String result = displayField.getText();
historyList.add(result);
historyArea.setText("");
for (int i = 0; i < historyList.size(); i++) {
historyArea.append(historyList.get(i) + "\n");
}
}
// 清除历史记录
private void clearHistory() {
historyList.clear();
historyArea.setText("");
}
// 运算方法
private void calculate(String operator) {
try {
// 获取文本框中的数值
double num1 = Double.parseDouble(displayField.getText());
// 弹出对话框输入第二个数字
String input = JOptionPane.showInputDialog(this, "请输入第二个数字:");
if (input == null) {
return;
}
double num2 = Double.parseDouble(input);
// 计算结果
double result = 0;
DecimalFormat df = new DecimalFormat("#.##");
switch (operator) {
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
if (num2 == 0) {
JOptionPane.showMessageDialog(this, "除数不能为零!");
return;
}
result = num1 / num2;
break;
case "%":
if (num2 == 0) {
JOptionPane.showMessageDialog(this, "除数不能为零!");
return;
}
result = num1 % num2;
break;
}
// 显示结果
displayField.setText(df.format(result));
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, "请输入正确的数字!");
}
}
// 主函数
public static void main(String[] args) {
new Calculator();
}
}
```
在上述代码中,我们创建了一个Calculator类,并继承了JFrame类。我们在构造函数中完成了以下工作:
- 初始化历史记录列表。
- 创建面板并设置布局。
- 创建文本框并添加到面板中。
- 创建菜单栏并添加到窗口中,并添加文件、编辑和帮助菜单,并添加相应的菜单项。同时,我们也实现了ActionListener接口和ItemListener接口。
- 创建历史记录区域,并添加到面板中。
- 最后,我们添加面板到窗口中,并设置窗口大小并显示。
在Calculator类中,我们实现了ActionListener接口和ItemListener接口。在actionPerformed方法中,我们根据事件源来执行不同的操作。例如,当用户点击保存历史记录菜单项时,我们调用saveHistory方法来保存历史记录。
在itemStateChanged方法中,我们根据复选框的状态来调整历史记录区域的大小。
我们还实现了calculate方法来完成加减乘除和求余的计算,在这个方法中,我们使用JOptionPane类来弹出对话框输入第二个数字,并计算结果。最后,我们使用DecimalFormat类将结果格式化为两位小数,并显示在文本框中。
最后,在main函数中,我们创建了一个Calculator对象来启动程序。
希望这个例子能够对你有所帮助!
阅读全文