覆盖actionPerformed

时间:2014-08-06 08:06:33

标签: java swing

有问题覆盖函数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 ();
    }
}

4 个答案:

答案 0 :(得分:1)

op1op2仅限于构造函数的范围。要在全班中使用它们,请将它们移到顶部(实例成员)。

喜欢

public class Arithmetic extends JFrame implements ActionListener {
private    JTextField op1,op2;

稍后在构造函数中初始化它们。

Arithmetic() {
    op1 = new JTextField(10);
    op2 = new JTextField(10);
//.....

答案 1 :(得分:1)

您遇到了上下文问题... addop1op2是在构造函数的本地上下文中声明的...

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);

奇怪的是,您可能希望为divsubmulex按钮以及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 FieldsHow 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();
        }

    }
}

人们会说使用它在这里是多余的,但我认为它使代码更清晰。