- 编写Java GUI程序,实现一个简单计算器。要求如下:
package Ex4;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Ex4 {
public static void main(String[] args) {
MainWindow mainWindow = new MainWindow();
MyListener myListener = new MyListener();
mainWindow.setMyListener(myListener);
}
}
class MainWindow extends JFrame {
MainWindow() {
init();
}
static String name[] = {"C", "÷", "×", "←", "7", "8", "9", "-", "4",
"5", "6", "+", "1", "2", "3", "√", "%", "0", ".", "="};
private JButton button[];
JLabel label;
private void init() {
setTitle("模拟计算器—江海大");
setLayout(new BorderLayout());
Panel panel = new Panel();
Panel panel2 = new Panel();
panel.setPreferredSize(new Dimension(this.getWidth(), 50));
//计算器一般都是靠右
panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
label = new JLabel();
//设置字体大小
label.setFont(new Font("宋体", Font.BOLD, 36));
panel.add(label);
button = new JButton[name.length];
for (int i = 0; i < button.length; i++) {
button[i] = new JButton(name[i]);
}
panel2.setLayout(new GridLayout(5, 4));
for (JButton i : button)
panel2.add(i);
add(panel, BorderLayout.NORTH);
add(panel2, BorderLayout.CENTER);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setSize(500, 500);
setVisible(true);
}
public void setMyListener(MyListener myListener) {
for (JButton b : button)
b.addActionListener(myListener);
myListener.setLabel(label);
}
}
class MyListener implements ActionListener {
private JLabel label;
@Override
public void actionPerformed(ActionEvent e) {
String op = e.getActionCommand();
String text = label.getText();
switch (op) {
case "C":
label.setText("");
break;
case "←":
text = text.substring(0, text.length() - 1);
label.setText(text);
break;
case "=":
text = fun(text);
label.setText(text);
break;
case "√":
text = fun(text);
label.setText(Math.sqrt(Double.valueOf(text))+"");
break;
case "%":
text = fun(text);
label.setText(Double.valueOf(text)/100+"");
break;
default:
label.setText(text + op);
}
}
private String fun(String text){
//正则表达式,匹配乘除
Pattern pattern = Pattern.compile("\\d+(\\.\\d+)?[×÷]\\d+(\\.\\d+)?");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
//以乘除作为分割符
String s[] = matcher.group().split("[×÷]");
//计算
double res = compute(Double.valueOf(s[0]), text.charAt(s[0].length()), Double.valueOf(s[1]));
//将乘除得到的结果替换算式
text = text.replace(matcher.group(), res + "");
matcher = pattern.matcher(text);
}
pattern = Pattern.compile("\\d+(\\.\\d+)?[+\\-]\\d+(\\.\\d+)?");
matcher = pattern.matcher(text);
//正则表达式匹配加减
while (matcher.find()) {
String s[] = matcher.group().split("[+\\-]");
double res = compute(Double.valueOf(s[0]), text.charAt(s[0].length()), Double.valueOf(s[1]));
text = text.replace(matcher.group(), res + "");
matcher = pattern.matcher(text);
}
return text;
}
//用于字符串解析计算
public static double compute(double num1, char s, double num2) {
switch (s) {
case '-':
return num1 - num2;
case '+':
return num1 + num2;
case '×':
return num1 * num2;
case '÷':
return num1 / num2;
default:
return 0;
}
}
public void setLabel(JLabel label) {
this.label = label;
}
}
- 总体来说还是比较简单的,在字符运算的时候我使用了正则表达式,会方便一些,如果不用正则表达式,可以考虑直接循环迭代,比如直接搜索±*/的位置,然后再进行相应的数值计算,会稍微麻烦一点.
- 单目运算符,如果屏幕里面有算式,比如:2+2 此时按开方会先算出2+2再开方.
- 待改进的地方:没有完善的错误输入处理,显示框的大小是固定的,比较理想应该是拉伸frame,显示框也跟着拉伸
- 程序填空题:完善程序,实现包括一个复选框的窗体。点选复选框,通过相应的事件处理后,能够在控制台显示复选框的选择信息。
- 比第一题简单很多,没有太特别的地方
package Ex4;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
/*---在(1)处进行类声明:类名为MyCheck,继承自Frame类---*/
//(1)
class MyCheck extends JFrame {
public MyCheck() {
super("GUI程序设计实验");
/*---在(2)处创建面板对象,并设置其布局管理方式为FlowLayout---*/
//(2)
JPanel p = new JPanel(new FlowLayout());
Checkbox cbx = new Checkbox("isPassed");
/*---在(3)处完成两个功能:向面板中加入组件cbx,为组件cbx注册监听器。此处填写两行语句---*/
//(3)
p.add(cbx);
cbx.addItemListener(new MyListener());
add(p);
/*---在(4)处设置窗体的属性:设置大小为(250,100),设置为可见。此处填写两行语句---*/
//(4)
setSize(250, 100);
setVisible(true);
}
public static void main(String[] args) {
new MyCheck();
}
/*---在(5)处声明内部类的类头:类名自定义---*/
//(5)
class MyListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
System.out.println(e);
}
}
}