有问题覆盖函数actionPerformed,它说无法找到符号op1,op2&加。我究竟做错了什么 ?注意:这不是完整的程序。 我正在尝试创建一个简单的程序来添加,分割,减去和乘以从文本字段中提取的数字,然后将其显示在另一个名为result的文本字段中。
package arithmetic;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class Arithmetic extends JFrame implements ActionListener {
private JPanel Pbutton;
private JPanel Ptext ;
private JPanel result;
private JPanel main;
Arithmetic () {
main = new JPanel();
Pbutton = new JPanel();
Ptext = new JPanel ();
result = new JPanel();
JButton add = new JButton("ADD");
JButton div = new JButton("DIVIDE");
JButton sub = new JButton("SUBTRACT");
JButton mul = new JButton("MULTIPLY");
JButton ex = new JButton ("EXIT");
JTextField op1 = new JTextField(10);
JTextField op2 = new JTextField(10);
JTextField res = new JTextField(10);
JLabel frst = new JLabel("Operand 1");
JLabel sec = new JLabel("Operand 2");
JLabel rel = new JLabel ("Result");
main.add(Pbutton);
main.add(Ptext);
main.add(result);
Ptext.add(frst);
Ptext.add(op1);
Ptext.add(sec);
Ptext.add(op2);
add(main);
Pbutton.add(add);
Pbutton.add(div);
Pbutton.add(mul);
Pbutton.add(sub);
result.add(rel);
result.add(res);
result.add(ex);
add.addActionListener(this);
sub.addActionListener(this);
mul.addActionListener(this);
div.addActionListener(this);
ex.addActionListener(this);
setSize(800,145);
Pbutton.setBackground(Color.BLACK);
Ptext.setBackground(Color.BLACK);
result.setBackground(Color.BLACK);
setVisible(true);
setLayout(null);
main.setLayout(new BoxLayout(main,BoxLayout.X_AXIS));
Pbutton.setLayout( new BoxLayout(Pbutton, BoxLayout.Y_AXIS));
}
@Override
public void actionPerformed(ActionEvent a) {
if (a.getSource() == add) {
int sum = op1.getText() + op2.getText();
}
}
public static void main(String[] args) {
new Arithmetic ();
}
}
答案 0 :(得分:1)
op1
和op2
仅限于构造函数的范围。要在全班中使用它们,请将它们移到顶部(实例成员)。
喜欢
public class Arithmetic extends JFrame implements ActionListener {
private JTextField op1,op2;
稍后在构造函数中初始化它们。
Arithmetic() {
op1 = new JTextField(10);
op2 = new JTextField(10);
//.....
答案 1 :(得分:1)
您遇到了上下文问题... add
,op1
和op2
是在构造函数的本地上下文中声明的...
Arithmetic() {
//...
JButton add = new JButton("ADD");
//...
JTextField op1 = new JTextField(10);
JTextField op2 = new JTextField(10);
JTextField res = new JTextField(10);
这意味着无法从任何其他上下文访问它们
相反,将它们声明为实例/类字段,例如......
private JButton add;
private JTextField op1;
private JTextField op2;
private JTextField res;
Arithmetic() {
//...
add = new JButton("ADD");
//...
op1 = new JTextField(10);
op2 = new JTextField(10);
res = new JTextField(10);
奇怪的是,您可能希望为div
,sub
,mul
和ex
按钮以及res
按钮执行相同操作场...
请查看Understanding Class Members了解详情
我还建议您查看How to Use Actions,这可能有助于简化您的代码
您将面临的下一个问题是......
int sum = op1.getText() + op2.getText();
当getText
返回String
时,无法将int
分配给int sum = Integer.parseInt(op1.getText()) + Integer.parseInt(op2.getText());
。您需要解析结果,例如......
JTextField
这不是世界上最好的主意,因为NumberFormatException
允许用户输入他们喜欢的内容,这意味着他们可能会输入一些无法解析的文本。现在,您可以捕获Integer.parseInt
JFormattedTextField
,当JSpinner
无法解析值时,您可以使用{{1}}或{{1}}来验证用户输入直接...
有关详细信息,请查看How to Use Formatted Text Fields和How to Use Spinners
答案 2 :(得分:1)
您只在构造函数中声明变量op1,op2和其他变量,因此它们是局部变量。方法actionPerformed()无权访问其他方法的局部变量 - 在您的情况下是构造函数。
将它们作为类的成员变量,就像使用result
一样。
答案 3 :(得分:1)
您需要创建Arithmetic类的op1和op2实例成员。
public class Arithmetic extends JFrame implements ActionListener {
//...
private JTextField op1;
private JTextField op2;
Arithmetic () {
this.op1 = new JTextField(10);
this.op2 = new JTextField(10);
}
//...
@Override
public void actionPerformed(ActionEvent a) {
if (a.getSource() == add) {
int sum = this.op1.getText() + this.op2.getText();
}
}
}
人们会说使用它在这里是多余的,但我认为它使代码更清晰。