GUI中的ActionListener。功能不起作用

时间:2013-06-27 16:23:47

标签: java swing user-interface actionlistener actionevent

我对我的程序有疑问,该程序包含一个单Calculator个课程,该课程应该实现一个能够与+*一起使用的计算器double

我已经为该计算器编写了一个GUI,它已经正常工作,但按钮不起作用,虽然我已经实现了这个功能

public void actionPerformed(ActionEvent e)

我猜这个错误必须在某个地方。我只是不知道为什么按钮的功能不起作用。这是代码。

public class Calculator extends JFrame implements ActionListener {

    Calculator () {}

    JTextField parameter1;
    JTextField parameter2;
    JTextField ergebnis;
    JFrame window;
    Container cont;
    /* this function works fine */
    public void calculator_GUI() {     
       builds the GUI of the calculator,     
       this.window = new JFrame("Calculator");
       window.setSize(300,300);
       this.parameter1 = new JTextField("Parameter1...", 10);
       parameter1.addActionListener(this);
       this.parameter2 = new JTextField("Parameter1...", 10);
       parameter2.addActionListener(this);
       this.ergebnis = new JTextField("Ergebnis...", 5);
       ergebnis.addActionListener(this);
       JButton multiplizieren = new JButton("*");
       parameter1.addActionListener(this);
       JButton addieren = new JButton("+");
       parameter1.addActionListener(this);
       JButton clear = new JButton("clear");
       parameter1.addActionListener(this);
       this.cont = window.getContentPane();

       FlowLayout flowLayout = new FlowLayout(FlowLayout.RIGHT);
       cont.setLayout(flowLayout);

       cont.add(parameter1);
       cont.add(parameter2);
       cont.add(ergebnis);
       cont.add(multiplizieren);
       cont.add(addieren);
       cont.add(clear);
       window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       window.pack();
       window.setVisible(true);;
   }

   public void actionPerformed(ActionEvent e) {  
       String label = e.getActionCommand();
       if (label.equals("*")) {
           String a = parameter1.getText();
           String b = parameter2.getText();
           double zahl1=Double.parseDouble(a);
           double zahl2=Double.parseDouble(b);
           double result = zahl1*zahl2;
           String c = String.valueOf(result);
           ergebnis.setText(c);
       }
       else if (label.equals("+")) {
           String a = parameter1.getText();
           String b = parameter2.getText();
           double zahl1=Double.parseDouble(a);
           double zahl2=Double.parseDouble(b);
           double result = zahl1+zahl2;
           String c = String.valueOf(result);
           ergebnis.setText(c);
      }

      else if (label.equals("clear")) {
           String z = "";
           ergebnis.setText(z);
      }
      else { 
           window.dispose(); 
      }
}


  public static void main (String[] args) {   
      Calculator MyCalculator = new Calculator();
      MyCalculator.calculator_GUI();
  }
}

3 个答案:

答案 0 :(得分:2)

看起来你有一个复制粘贴错误:

此:

    JButton multiplizieren = new JButton("*");
    parameter1.addActionListener(this);
    JButton addieren = new JButton("+");
    parameter1.addActionListener(this);
    JButton clear = new JButton("clear");
    parameter1.addActionListener(this);

应该是:

    JButton multiplizieren = new JButton("*");
    multiplizieren.addActionListener(this);
    JButton addieren = new JButton("+");
    addieren.addActionListener(this);
    JButton clear = new JButton("clear");
    clear.addActionListener(this);

答案 1 :(得分:2)

问题是@kuporific所说的,但你可以在顶层容器中执行implements ActionListener,而不是:{/ p>

  1. 创建私有类,或
  2. 使用匿名类
  3. 使用Swing Action(匿名类)

    的示例
    JButton multiplizieren = new JButton("*");
    multiplizieren.addActionListener(new ActionListener(){
             @Override
             public void actionPerformed(ActionEvent evt){
                    String a = parameter1.getText();
                    String b = parameter2.getText();
                    double zahl1=Double.parseDouble(a); // this can cause NumberFormatException
                    double zahl2=Double.parseDouble(b); // this can cause NumberFormatException
                    double result = zahl1*zahl2;
                    String c = String.valueOf(result);
                    ergebnis.setText(c);
             }
    });
    JButton addieren = new JButton("+");
    addieren.addActionListener((new ActionListener(){
             @Override
             public void actionPerformed(ActionEvent evt){
                String a = parameter1.getText();
                String b = parameter2.getText();
                double zahl1=Double.parseDouble(a);
                double zahl2=Double.parseDouble(b);
                double result = zahl1+zahl2;
                String c = String.valueOf(result);
                ergebnis.setText(c);
             }
    });
    

    因此,您无需在任何地方使用ìf-else,而是可以隔离每个按钮的关联操作。

    此外,您可以在文本字段中添加仅接受数字的documentFilter,或使用JFormattedTextField

答案 2 :(得分:1)

将actionListener添加到按钮而不是textfield