2013-04-02 51 views
1

IM試圖用Java/eclipse製作一個計算器。我怎樣才能讓數字值可以輸入到文本區域?所以當我運行該應用程序時,它運行完美。所有的按鈕功能完美。但我希望它只允許在文本區域輸入數字。在java中製作計算器,如何僅允許數字輸入

import java.awt.Color; 
    import java.awt.FlowLayout; 
import java.awt.LayoutManager; 
import java.awt.TextField; 

    import javax.swing.JButton; 
    import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.text.ParseException; 
    import java.util.Scanner; 

    public class calculator_gui<reutrn> implements ActionListener { 

JFrame frame = new JFrame("Calculator"); 
JPanel Panel = new JPanel (new java.awt.FlowLayout()); 

JTextArea text = new JTextArea(1,20); 
JButton but1= new JButton("1"); 
JButton but2= new JButton("2"); 
JButton but3= new JButton("3"); 
JButton but4= new JButton("4"); 
JButton but5= new JButton("5"); 
JButton but6= new JButton("6"); 
JButton but7= new JButton("7"); 
JButton but8= new JButton("8"); 
JButton but9= new JButton("9"); 
JButton but0= new JButton("0"); 


JButton butadd= new JButton("+"); 
JButton butsub= new JButton("-"); 
JButton butmulti= new JButton("*"); 
JButton butdiv= new JButton("/"); 
JButton buteq= new JButton("="); 
JButton butclear= new JButton("C"); 

Double number1,number2,result; 
int addc=0,subc=0,multic=0,divc=0; 



public void gui(){ 

    Panel.setLayout(FlowLayout()); 
    frame.setVisible(true); 
    frame.setBounds(100, 100, 450, 285); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    // frame.setResizable(false); 

    frame.add(Panel); 
    Panel.setBackground(Color.green); 

    Panel.add(text); 
    text.setBounds(10, 32, 361, 29); 



    Panel.add(but1); 
    but1.setBackground(Color.red); 
    but1.setBounds(10, 81, 89, 23); 

    Panel.add(but2); 
    but2.setBounds(126, 81, 89, 23); 

    Panel.add(but3); 
    but3.setBounds(225, 81, 89, 23); 

    Panel.add(but4); 
    but4.setBounds(10, 115, 89, 23); 

    Panel.add(but5); 
    but5.setBounds(126, 115, 89, 23); 

    Panel.add(but6); 
    but6.setBounds(225, 115, 89, 23); 

    Panel.add(but7); 
    but7.setBounds(10, 149, 89, 23); 

    Panel.add(but8); 
    but8.setBounds(126, 149, 89, 23); 

    Panel.add(but9); 
    but9.setBounds(225, 149, 89, 23); 

    Panel.add(but0); 
    but0.setBounds(126, 183, 89, 23); 

    Panel.add(butadd); 
    butadd.setBounds(324, 81, 89, 23); 

    Panel.add(butsub); 
    butsub.setBounds(324, 115, 89, 23); 

    Panel.add(butmulti); 
    butmulti.setBounds(324, 183, 89, 23); 

    Panel.add(butdiv); 
    butdiv.setBounds(324, 149, 89, 23); 

    Panel.add(buteq); 
    buteq.setBounds(225, 183, 89, 23); 

    Panel.add(butclear); 
    butclear.setBounds(10, 183, 89, 23); 





    but1.addActionListener(this); 
    but2.addActionListener(this); 
    but3.addActionListener(this); 
    but4.addActionListener(this); 
    but5.addActionListener(this); 
    but6.addActionListener(this); 
    but7.addActionListener(this); 
    but8.addActionListener(this); 
    but9.addActionListener(this); 
    but0.addActionListener(this); 
    butadd.addActionListener(this); 
    butsub.addActionListener(this); 
    butmulti.addActionListener(this); 
    butdiv.addActionListener(this); 
    buteq.addActionListener(this); 
    butclear.addActionListener(this); 






} 

private LayoutManager FlowLayout() { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void actionPerformed(ActionEvent e){ 

    Object source = e.getSource(); 

    if(source==butclear){ 

     number1=0.0; 
     number2=0.0; 
     text.setText(null); 

    } 


    if(source==but1){ 
     text.append("1");   

    } 


    if(source==but2){ 
     text.append("2");   

    } 

    if(source==but3){ 
     text.append("3");   

    } 

    if(source==but4){ 
     text.append("4");   

    } 

    if(source==but5){ 
     text.append("5");   

    } 

    if(source==but6){ 
     text.append("6");   

    } 

    if(source==but7){ 
     text.append("7");   

    } 

    if(source==but8){ 
     text.append("8");   

    } 

    if(source==but9){ 
     text.append("9");   

    } 

    if(source==but0){ 
     text.append("0");   

    } 
    if(source==butadd){ 
     number1=number_reader(); 
     text.setText(""); 
     addc=1; 
     subc=0; 
     multic=0; 
     divc=0; 


    } 

    if(source==butsub){ 
     number1=number_reader(); 
     text.setText(""); 
     addc=0; 
     subc=1; 
     multic=0; 
     divc=0; 


    } 
    if(source==butmulti){ 
     number1=number_reader(); 
     text.setText(""); 
     addc=0; 
     subc=0; 
     multic=1; 
     divc=0; 


    } 
    if(source==butdiv){ 
     number1=number_reader(); 
     text.setText(""); 
     addc=0; 
     subc=0; 
     multic=0; 
     divc=1; 


    } 



    if(source==buteq){ 

     number2=number_reader(); 
     if(addc>0){ 
      result=number1+number2; 
      text.setText(Double.toString(result)); 

     } 

    if(subc>0){ 
     result=number1-number2; 
     text.setText(Double.toString(result));   
    } 

    if(multic>0){ 
     result=number1*number2; 
     text.setText(Double.toString(result)); 

    } 




    } 







    if(divc>0){ 
     result=number1/number2; 
     text.setText(Double.toString(result)); 

      } 


     } 




public double number_reader(){ 
    Double num1; 
    String s; 
    s=text.getText(); 
    num1=Double.valueOf(s); 

    return num1; 


     } 




     } 
+0

Dude ....使用OOP ...和for循環... http://en.wikipedia.org/wiki/Object-oriented_programming http://en.wikipedia.org/wiki/For_loop 有很多地方,他們可以節省你很多工作... – MirroredFate

+0

下面是for循環,使生活更簡單的例子: http://ideone.com/77iUUI – MirroredFate

回答

0

只要把條件:

if ((text.contains("[a-zA-Z]+") == false){ 
//error 
} 

else{ 
//do your computation. 
} 

if ((text.contains("[0-9]*") == true){ 
//your code  
} 
1

有很多的事情可以做。

  • 在您的文本區域設置一個javax.swing.InputVerifier。如果他們輸入違法的東西,這將防止人們退出。這可能是不夠的。
  • 在其構造函數中爲JTextArea設置自定義Document。使用您編寫的子類PlainDocument,您可以覆蓋其insertText方法並拒絕非數字。這將照顧打字和剪切和粘貼。

如果您沒有針對所有數字和操作按鈕的巨大actionPerformed方法,您將在下次嘗試時做得更好。相反,給每個按鈕的子類AbstractAction。數字按鈕可以共享一個類的實例。

JComponent s,這包括JButton S,可以有客戶端的屬性,所以你可以寫代碼像

JButton but1= new JButton("1"); 
but1.setClientProperty("digit", "1"); // Why a string? 
    // Suppose you have a switch to use hexadecimals? 

,然後動作監聽器,它可以訪問按下的按鈕,可以叫getClientProperty("digit")就可以了找出用戶選擇的數字。只需少量投資,就可以節省大量重複代碼。

最後,學習模型 - 視圖 - 控制器體系結構或MVC。不要直接在文本區域進行操作。沒有RFC,添加更多操作或切換到RPN計算器會遇到很多問題。

  1. 創建一個模型:它有用於累加器和新操作數的對象。
  2. 創建視圖:Swing設置。
  3. 創建控制器:執行工作的對象。你的行爲應該是控制者要求做的事情。控制器應該對模型執行,然後模型或控制器應刷新視圖。

此外,你的計算器類名稱有點奇怪。名稱calculator_gui<reutrn>沒有任何意義;爲什麼通用?爲什麼違反Java標準?請撥打電話Calculator

新增

的海報要我展示如何打開按鈕創建COE成一個圈。因此,更換十行:

JButton but1= new JButton("1"); 
JButton but2= new JButton("2"); 
JButton but3= new JButton("3"); 
JButton but4= new JButton("4"); 
JButton but5= new JButton("5"); 
JButton but6= new JButton("6"); 
JButton but7= new JButton("7"); 
JButton but8= new JButton("8"); 
JButton but9= new JButton("9"); 
JButton but0= new JButton("0"); 

到:

JButton[] digitButton = new JButton[10]; // digitButton is an arry of JButtons, 
              // Initialized to nulls. 
for(final int i = 0; i < 10; i++) { 
    digitButton[i] = new JButton(Integer.toString(i)); // Convert 0 to "0", etc. 
                 // Then make a button. 
} 

現在,你給每個按鈕的自身行動聽衆,而不是具有主類有一個爲所有。

+0

我只編寫了近2個星期。我對語言沒有很好的理解,只是想弄明白。 – epsilon58

+0

也可以告訴我如何使用你提到的文檔方法 – epsilon58

+0

對不起。儘管我在商業世界已經有20多年了,但我傾向於太學術。我確實選擇了一些晦澀難懂的技巧。而且,事實上有一個更簡單的方法。計算器往往具有單行顯示。在Swing中,這是一個JTextField,而不是一個JTextArea。而且,如果要限制內容,則使用JFormattedTextField,它是一個子類。因此,您可以使用JFormattedTextField display = new JFormattedTextField(0)來代替文本。當你需要改變這個值時,你可以使用一個整數來調用setValue。這在內部是我在Document中建議的。 –

相關問題