2013-06-27 77 views
1

我對我的程序有一個疑問,程序包含一個類Calculator,它應該實現一個計算器,它能夠以+*的類型double進行操作。GUI中的ActionListener。功能不起作用

我寫了一個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(); 
    } 
} 
+0

「*它已經工作得很好,但按鈕不起作用*」 - 那麼它不很好地工作: D – Maroun

+1

1)對代碼塊使用一致的邏輯縮進。代碼的縮進旨在幫助人們理解程序流程。 2)不要延長框架或其他頂層容器。而是創建並使用一個實例。 –

+1

定義「不起作用」。處理程序中的斷點命中了嗎?怎麼了? –

回答

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

工作正常,感謝幫助kuporific。我對nachokk的評論還有一個問題: 如何控制該Action Action?然後我必須將e.getActionCommand()放在每個被覆蓋的actionPerformed方法中,對吧? – rikojir

+0

@rikojir你不需要任何更多的actionCommand,我會更新回答 – nachokk

1

添加ActionListener添加到按鈕而不是文本框

2

問題是什麼@kuporific說,但不是在你的頂層容器,你可以做implements ActionListener

  1. 創建私有類,或
  2. 使用匿名類

例使用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

+0

好吧,謝謝你的幫助 – rikojir

+0

@rikojir我更新了答案 – nachokk

+0

'if-else'構造遠遠好於創建一個新類的開銷對於每個'JComponent'的相關'Action'。雖然你的第一點是更適合的,關於創建私人類,如引用[這裏](http://stackoverflow.com/a/10837751/1057230) –