这个问题烦死我了。大虾们进来看看啊。 在 Canculator.java 的 101 行有引用为空,而且,你还使用了 . 来访问其成员。我这里没有环境,不能帮你调试,你自己看看是什么原因吧。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 LinkedList dataList没有初始化,另外“1 2 3 4 4 ”这样的字符串不能用numFormat被转化为数字,如果想把数字转化外字符串,可以用,Integer.toString(int num,int radix)第二个参数是进制,这里一般用10。validate()是 Container类的一个方法,在上面的子组件删除或者添加的时候,迫使 Container重新放置它上面的饿组件。(可以参考sun的java 文档,说的很清楚)修改后的代码如下,(仍有错误,不过是算法的问题,你自己再看看吧)package caculator;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.util.*;import javax.swing.border.*;import java.text.NumberFormat;class Canculator extends JFrame implements ActionListener { NumberButton[] numberButtons; OperationButton[] operatorButtons; JTextField resultShow; JPanel p; JButton pointButton = new JButton("."); JButton resultButton = new JButton("="); LinkedList dataList = new LinkedList(); //存贮数据用链表 boolean flag = false; //是否按下等号的标记 final String[] s = { "+", "-", "*", "/"}; public Canculator() { //构造函数完成面板的设计 super("Simple Calculator"); Container content = this.getContentPane(); p = new JPanel(); p.setLayout(new GridLayout(4, 4)); resultShow = new JTextField(10); resultShow.setHorizontalAlignment(JTextField.RIGHT); resultShow.setBorder(new SoftBevelBorder(BevelBorder.LOWERED)); resultShow.setBackground(Color.white); resultShow.setEditable(false); numberButtons = new NumberButton[10]; for (int i = 0; i <= 9; i++) { numberButtons[i] = new NumberButton(i); numberButtons[i].addActionListener(this); } operatorButtons = new OperationButton[4]; for (int i = 0; i <= 3; i++) { operatorButtons[i] = new OperationButton(s[i]); operatorButtons[i].addActionListener(this); } pointButton.setForeground(Color.blue); pointButton.addActionListener(this); resultButton.setForeground(Color.red); resultButton.addActionListener(this); p.add(numberButtons[7]); p.add(numberButtons[8]); p.add(numberButtons[9]); p.add(operatorButtons[0]); p.add(numberButtons[4]); p.add(numberButtons[5]); p.add(numberButtons[6]); p.add(operatorButtons[1]); p.add(numberButtons[1]); p.add(numberButtons[2]); p.add(numberButtons[3]); p.add(operatorButtons[2]); p.add(numberButtons[0]); p.add(pointButton); p.add(resultButton); p.add(operatorButtons[3]); content.add(resultShow, "North"); content.add(p, "Center"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent ee) { System.exit(0); } }); setBounds(100, 50, 240, 180); setVisible(true); content.setVisible(true); validate(); //顺便问一下这个函数是干什么用的? } public void actionPerformed(ActionEvent e) { if (e.getSource() instanceof NumberButton) { NumberButton b = (NumberButton) e.getSource(); int num = b.getNumber(); if (dataList.size() == 0 && flag == false) { String s = Integer.toString(num, 10); dataList.add(s); resultShow.setText(s); } else if (dataList.size() == 1 && flag == false) { String s = (String) dataList.getFirst(); s = s.concat(Integer.toString(num, 10)); dataList.set(0, s); resultShow.setText(s); } else if (dataList.size() == 1 && flag == true) { String s = Integer.toString(num, 10); dataList.set(0, s); resultShow.setText(s); flag = false; } else if (dataList.size() == 2) { //第二个为运算符 String s = Integer.toString(num, 10); dataList.add(0, s); resultShow.setText(s); } else if (dataList.size() == 3 && flag == false) { String s = (String) (dataList.getLast()); s = s.concat(Integer.toString(num, 10)); dataList.set(2, s); resultShow.setText(s); } } //代码太长了,分开了。 if (e.getSource() instanceof OperationButton) { OperationButton b = (OperationButton) e.getSource(); String oper = b.getOperator(); if (dataList.size() == 1) { dataList.add(oper); } if (dataList.size() == 2) { //改变运算符号 dataList.set(1, oper); } if (dataList.size() == 3) { try { String number1 = (String) dataList.getFirst(); String number2 = (String) dataList.get(1); double n1 = Double.parseDouble(number1); double n2 = Double.parseDouble(number2); String op = (String) dataList.getLast(); double n = 0; if (op.equals("+")) { n = n1 + n2; } if (op.equals("-")) { n = n1 - n2; } if (op.equals("*")) { n = n1 * n2; } if (op.equals("/")) { n = n1 / n2; } String result = (String) (" " + n); dataList.set(0, result); dataList.removeLast(); dataList.removeLast(); resultShow.setText(result); dataList.add(oper); } catch (Exception e1) { System.out.println(e1); } } } if (e.getSource() == pointButton) { String dot = "."; if (dataList.size() == 1) { String num = (String) (dataList.getFirst()); if (num.indexOf(dot) == -1) { String s = (String) (num.concat(dot)); dataList.set(0, s); resultShow.setText(s); } } if (dataList.size() == 3) { String num = (String) (dataList.getLast()); if (num.indexOf(dot) == -1) { String s = (String) (num.concat(dot)); dataList.set(2, s); resultShow.setText(s); } } } if (e.getSource() == resultButton) { flag = true; try { String number1 = (String) dataList.getFirst(); String number2 = (String) (dataList.get(1)); double n1 = Double.parseDouble(number1); double n2 = Double.parseDouble(number2); String op = (String) (dataList.getLast()); double n = 0; if (op.equals("+")) { n = n1 + n2; } if (op.equals("-")) { n = n1 - n2; } if (op.equals("*")) { n = n1 * n2; } if (op.equals("/")) { n = n1 / n2; } String result = (String) (" " + n); dataList.set(0, result); dataList.removeLast(); dataList.removeLast(); resultShow.setText(result); } catch (Exception e2) { System.out.println(e2); } } }}class OperationButton extends JButton { public OperationButton(String operator) { super(operator); this.operator = operator; } private String operator; public String getOperator() { return operator; }}class NumberButton extends JButton { public NumberButton(int aNumber) { super(Integer.toString(aNumber, 10)); this.aNumber = aNumber; } public int getNumber() { return aNumber; } private int aNumber;}public class CalculatorTest { public static void main(String[] args) { Canculator cal = new Canculator(); cal.show(); }} 没有这两个类的定义,没法帮你测试。NumberButtonOperationButton 后面那两个类hotforever在他的回复中已经加上了。就在你们楼上,麻烦看看谢谢hotforever的指教,麻烦你把修改过的句子标记一下,太长了。不好意思 我只改了几个地方,一个地方是 LinkList dataList = new LinkList();另外那些地方只是把数字的字符串表示Integer.toString(int num,int radix)这个方法,而不是用" " + int num 这种方式。 java作业网上超市购物结算功能模拟 jdk1.6+tomcat6.0+myeclipse8.5(all-in-one)搭配的环境问题 文件中数据抽取 一个关于AWT的新手问题,请各位大侠指教!在线等待 请问<<java编程思想>>里的包那里下载? 一个超简单的问题,我已经想跳楼了。。 webService初级问题, 將數組轉換成字符 俏俏問一聲 请教:java中汉字是以什么方式排序的? 怎样把从文件中读出的字符串写到一个String里面去? 求“字符串近似匹配算法”的java实现 在線等待 關羽修改文件的程序
另外“1 2 3 4 4 ”这样的字符串不能用numFormat被转化为数字,如果想把数字转化外字符串,
可以用,Integer.toString(int num,int radix)第二个参数是进制,这里一般用10。
validate()是 Container类的一个方法,在上面的子组件删除或者添加的时候,
迫使 Container重新放置它上面的饿组件。(可以参考sun的java 文档,说的很清楚)
修改后的代码如下,(仍有错误,不过是算法的问题,你自己再看看吧)
package caculator;import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.border.*;
import java.text.NumberFormat;class Canculator
extends JFrame
implements ActionListener {
NumberButton[] numberButtons;
OperationButton[] operatorButtons;
JTextField resultShow;
JPanel p;
JButton pointButton = new JButton(".");
JButton resultButton = new JButton("=");
LinkedList dataList = new LinkedList(); //存贮数据用链表
boolean flag = false; //是否按下等号的标记
final String[] s = {
"+", "-", "*", "/"};
public Canculator() { //构造函数完成面板的设计
super("Simple Calculator");
Container content = this.getContentPane();
p = new JPanel();
p.setLayout(new GridLayout(4, 4));
resultShow = new JTextField(10);
resultShow.setHorizontalAlignment(JTextField.RIGHT);
resultShow.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
resultShow.setBackground(Color.white);
resultShow.setEditable(false);
numberButtons = new NumberButton[10];
for (int i = 0; i <= 9; i++) {
numberButtons[i] = new NumberButton(i);
numberButtons[i].addActionListener(this);
}
operatorButtons = new OperationButton[4];
for (int i = 0; i <= 3; i++) {
operatorButtons[i] = new OperationButton(s[i]);
operatorButtons[i].addActionListener(this);
}
pointButton.setForeground(Color.blue);
pointButton.addActionListener(this);
resultButton.setForeground(Color.red);
resultButton.addActionListener(this);
p.add(numberButtons[7]);
p.add(numberButtons[8]);
p.add(numberButtons[9]);
p.add(operatorButtons[0]);
p.add(numberButtons[4]);
p.add(numberButtons[5]);
p.add(numberButtons[6]);
p.add(operatorButtons[1]);
p.add(numberButtons[1]);
p.add(numberButtons[2]);
p.add(numberButtons[3]);
p.add(operatorButtons[2]);
p.add(numberButtons[0]);
p.add(pointButton);
p.add(resultButton);
p.add(operatorButtons[3]);
content.add(resultShow, "North");
content.add(p, "Center");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ee) {
System.exit(0);
}
});
setBounds(100, 50, 240, 180);
setVisible(true);
content.setVisible(true);
validate(); //顺便问一下这个函数是干什么用的?
} public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof NumberButton) {
NumberButton b = (NumberButton) e.getSource();
int num = b.getNumber();
if (dataList.size() == 0 && flag == false) {
String s = Integer.toString(num, 10);
dataList.add(s);
resultShow.setText(s);
}
else if (dataList.size() == 1 && flag == false) {
String s = (String) dataList.getFirst();
s = s.concat(Integer.toString(num, 10));
dataList.set(0, s);
resultShow.setText(s);
}
else if (dataList.size() == 1 && flag == true) {
String s = Integer.toString(num, 10);
dataList.set(0, s);
resultShow.setText(s);
flag = false;
}
else if (dataList.size() == 2) { //第二个为运算符
String s = Integer.toString(num, 10);
dataList.add(0, s);
resultShow.setText(s);
}
else if (dataList.size() == 3 && flag == false) {
String s = (String) (dataList.getLast());
s = s.concat(Integer.toString(num, 10));
dataList.set(2, s);
resultShow.setText(s);
}
}
if (e.getSource() instanceof OperationButton) {
OperationButton b = (OperationButton) e.getSource();
String oper = b.getOperator();
if (dataList.size() == 1) {
dataList.add(oper);
}
if (dataList.size() == 2) { //改变运算符号
dataList.set(1, oper);
}
if (dataList.size() == 3) {
try {
String number1 = (String) dataList.getFirst();
String number2 = (String) dataList.get(1);
double n1 = Double.parseDouble(number1);
double n2 = Double.parseDouble(number2);
String op = (String) dataList.getLast();
double n = 0;
if (op.equals("+")) {
n = n1 + n2;
}
if (op.equals("-")) {
n = n1 - n2;
}
if (op.equals("*")) {
n = n1 * n2;
}
if (op.equals("/")) {
n = n1 / n2;
}
String result = (String) (" " + n);
dataList.set(0, result);
dataList.removeLast();
dataList.removeLast();
resultShow.setText(result);
dataList.add(oper);
}
catch (Exception e1) {
System.out.println(e1);
}
}
}
if (e.getSource() == pointButton) {
String dot = ".";
if (dataList.size() == 1) {
String num = (String) (dataList.getFirst());
if (num.indexOf(dot) == -1) {
String s = (String) (num.concat(dot));
dataList.set(0, s);
resultShow.setText(s);
}
}
if (dataList.size() == 3) {
String num = (String) (dataList.getLast());
if (num.indexOf(dot) == -1) {
String s = (String) (num.concat(dot));
dataList.set(2, s);
resultShow.setText(s);
}
}
}
if (e.getSource() == resultButton) {
flag = true;
try {
String number1 = (String) dataList.getFirst();
String number2 = (String) (dataList.get(1));
double n1 = Double.parseDouble(number1);
double n2 = Double.parseDouble(number2);
String op = (String) (dataList.getLast());
double n = 0;
if (op.equals("+")) {
n = n1 + n2;
}
if (op.equals("-")) {
n = n1 - n2;
}
if (op.equals("*")) {
n = n1 * n2;
}
if (op.equals("/")) {
n = n1 / n2;
}
String result = (String) (" " + n);
dataList.set(0, result);
dataList.removeLast();
dataList.removeLast();
resultShow.setText(result);
}
catch (Exception e2) {
System.out.println(e2);
}
}
}}class OperationButton
extends JButton {
public OperationButton(String operator) {
super(operator);
this.operator = operator;
} private String operator;
public String getOperator() {
return operator;
}
}class NumberButton
extends JButton {
public NumberButton(int aNumber) {
super(Integer.toString(aNumber, 10));
this.aNumber = aNumber;
} public int getNumber() {
return aNumber;
} private int aNumber;
}public class CalculatorTest {
public static void main(String[] args) {
Canculator cal = new Canculator();
cal.show();
}
}
NumberButton
OperationButton
谢谢hotforever的指教,麻烦你把修改过的句子标记一下,太长了。不好意思
另外那些地方只是把数字的字符串表示Integer.toString(int num,int radix)这个方法,而不是用
" " + int num 这种方式。