2013-04-02 49 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中建议的。 –

相关问题