去年夏天那个闷热的下午,我在朋友圈看到朋友炫耀他用Python写的计算器,界面确实挺漂亮。作为Java开发者,我当即决定要用Java Swing打造一个更强大的计算器。这个决定开启了我与Swing框架的深度互动之旅。
计算器看似简单,但要实现一个功能完善、界面美观的版本,需要考虑很多细节。从基本的加减乘除运算,到科学计算功能;从简单的按钮布局,到复杂的表达式解析;从基础的鼠标点击事件,到键盘快捷键支持——每个环节都充满挑战。
Swing作为Java的标准GUI工具包,有几个显著优势:
提示:虽然JavaFX是更新的GUI框架,但Swing在现有项目中仍有广泛应用,学习价值很高。
要开始Swing开发,你需要:
计算器界面通常分为三部分:
我选择使用BorderLayout作为主容器:
java复制JFrame frame = new JFrame("Java计算器");
frame.setLayout(new BorderLayout());
// 显示屏
JTextField display = new JTextField();
frame.add(display, BorderLayout.NORTH);
// 按钮面板
JPanel buttonPanel = new JPanel();
frame.add(buttonPanel, BorderLayout.CENTER);
按钮面板使用GridLayout布局管理器,设置为4行5列的网格:
java复制buttonPanel.setLayout(new GridLayout(4, 5, 5, 5));
这种布局方式可以:
计算器的核心是运算逻辑,我采用状态机模式管理计算过程:
java复制// 状态枚举
enum CalcState {
INIT, FIRST_NUMBER, OPERATOR, SECOND_NUMBER, RESULT
}
为按钮添加ActionListener处理点击事件:
java复制JButton button = new JButton("7");
button.addActionListener(e -> {
if(currentState == CalcState.RESULT) {
display.setText("");
currentState = CalcState.FIRST_NUMBER;
}
display.setText(display.getText() + "7");
});
要实现科学计算器功能,需要:
java复制// 计算sin函数示例
if(command.equals("sin")) {
double value = Double.parseDouble(display.getText());
double result = Math.sin(Math.toRadians(value));
display.setText(String.valueOf(result));
}
为提升用户体验,添加键盘事件监听:
java复制frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_0:
// 处理0键
break;
// 其他按键处理...
}
}
});
Java中浮点数运算可能存在精度问题:
java复制// 错误方式
double result = 0.1 + 0.2; // 得到0.30000000000000004
// 正确方式
BigDecimal bd1 = new BigDecimal("0.1");
BigDecimal bd2 = new BigDecimal("0.2");
BigDecimal result = bd1.add(bd2); // 精确得到0.3
Swing布局管理器使用不当会导致界面混乱:
注意:混合使用多种布局管理器时,务必理解每种布局的特性。建议先在纸上画出界面结构,再选择合适的布局组合。
这个计算器项目还可以进一步扩展:
我在实际开发中发现,Swing虽然有些老旧,但依然强大灵活。通过这个项目,不仅掌握了GUI开发技巧,更深入理解了状态管理和事件处理机制。建议初学者可以从这样的小项目入手,逐步构建完整的知识体系。
计算器看似简单,但要做得专业,需要考虑很多细节。比如处理连续运算时的逻辑、除零错误的预防、输入限制的实现等。这些经验对后续开发更复杂的GUI应用很有帮助。