2011-02-23 72 views
2

我是一個新的Java程序員,我一直在嘗試設置一個簡單的Swing程序,允許用戶將兩個整數輸入到JTextFields中,並且當單擊「添加」JButton時,兩個數字是相加在一起,並且總和以JLabel輸出。Java Swing簡單程序

但是,我可以處理,但我遇到困難的地方是能夠設置兩個JTextFields將無效數字視爲零。例如,如果輸入了字符「x」或「xxx」,則這將導致該JTextField的值爲0以用於添加目的。到目前爲止,我已經使用try/catch和if/else語句,但沒有取得任何成功。過去兩天,我還在互聯網上搜尋了幾個小時,尋找解決這個問題的方法,但沒有任何結果。

任何幫助將不勝感激!我迄今在下列代碼...

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 


public class Adder extends JPanel implements ActionListener { 

    JButton addBut = new JButton("Add"); 
    JTextField field1 = new JTextField("Number 1"), 
    field2 = new JTextField("Number 2"); 
    JLabel numSum = new JLabel("="); 

     Adder() { 
      this.setPreferredSize(new Dimension(299, 43)); 
      addBut.addActionListener(this); 
      setLayout(new FlowLayout()); 
      add(field1); 
      add(field2); 
      add(numSum); 
      add(addBut);    
     } 

     public void actionPerformed(ActionEvent ae) { 
      if(ae.getSource().equals(addBut)){ 

      try { 
       double one = Double.parseDouble(field1.getText()); 
       double two = Double.parseDouble(field2.getText()); 
       numSum.setText("" + (one + two)); 
      }   

       catch(Exception ex) { 
      } 
     } 

       else { 
        field1.setText(" "); 
        field2.setText(" "); 
        numSum.setText(""); 
      } 
     } 

       public static void main(String[] args){ 
        JFrame jf=new JFrame(); 
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        Adder x = new Adder(); 
        jf.add(x); 
        jf.pack(); 
        jf.setVisible(true); 
       } 
     } 

回答

-1

嘗試

double one = 0.0; 
double two = 0.0; 
try { 
    one = Double.parseDouble(field1.getText()); 
} 
catch(Exception ex) { 
    field1.setText("0"); 
} 

try { 
    two = Double.parseDouble(field2.getText()); 
} 
catch(Exception ex) { 
    field2.setText("0"); 
} 

numSum.setText("" + (one + two)); 
+0

非常感謝!這有很多幫助! – astroDude1 2011-02-24 01:32:01

2

使用JFormattedTextFiled和設置的NumberFormat只允許有效的數字。

或者在你的代碼添加拋出的異常的一些處理

double one = Double.parseDouble(field1.getText());     
double two = Double.parseDouble(field2.getText()); 

顯示一條消息,一個或兩個是在你的catch塊不正確。

1

這裏有幾個問題。

首先,永遠不要通過提供一個空的catch塊來「吞噬」異常。這根本不是一個好主意。至少,如果不期望異常,那麼只需使用printStackTrace()或(更好)記錄器來打印堆棧跟蹤。如果預計異常(如你的情況),做一些有意義的事情。在你的情況,如果你真的想治療無效數爲零(這是不是一個好主意要麼),那麼你或許應該這樣做:

double one; 
    double two; 
    try { 
    one = Double.parseDouble(field1.getText()); 
    } 
    catch(NumberFormatException ex) { 
    one = 0.0; 
    } 
    try { 
    two = Double.parseDouble(field2.getText()); 
    } 
    catch(NumberFormatException ex) { 
    two = 0.0; 
    } 
    numSum.setText("" + (one + two)); 

當然,你可以先可以達到同樣的結果將兩個變量初始化爲零,然後只是「吞食」例外。但是這樣做的可讀性較差,因爲當應該使用零時就不會馬上看到。該方法的另一個問題是,如果有其他代碼路徑不會將任何內容分配給一個和兩個,那麼編譯器將不會發出「可能未初始化的變量錯誤」。

其次,你可以看到,你需要兩個try/catch塊。這就是爲什麼這些行爲是獨立的,並且即使第一個失敗,您仍然希望第二個運行。使用單個try塊時,它會在中斷時立即停止執行,這可能會使第二個變量保持不變,因爲第一個變量格式不正確。第三,除了可能在main()方法或線程的run()方法中,不要捕獲「Exception」類或更高級別的類。即使在那裏也不會發現「Throwable」,因爲錯誤不應該被捕獲。在這種特殊情況下,您對格式錯誤的數字感興趣,所以NumberFormatException是正確的。你不關心其他的例外情況,如果存在一些不同的問題,你肯定不希望文本被視爲零數字。

最後,不是真的在話題上,但if(ae.getSource().equals(addBut))事情真的是多餘的。您不需要訂閱其他任何操作,因此您的其他操作不會執行。即使你訂閱了其他動作,爲每個動作創建使用內部類的單獨偵聽器可能也會更好,但並不是要將所有內容放在一個大型偵聽器中,並且有大量的if

+0

您在這裏提出了很多優秀的觀點。我對Java相對來說比較新(尤其是Swing),所以我對這些東西有點混淆。當然,在上述程序中使用您描述的方法有很多優化和更清晰的編碼空間。再次感謝你的幫助! – astroDude1 2011-02-24 01:35:40