此GUI计算器不起作用。怎么了

时间:2015-01-21 11:29:19

标签: java

我正在尝试使用GUI界面创建计算器。下面的代码旨在执行此操作,但只创建一个可以键入的空白区域。这有什么问题?

    public class CalculatorMain extends Calculator_ui
    {
       public static void main(String[] args)
       {
          Calculator_ui n=new Calculator_ui();
          n.ui();

       }//main
    }//class

从这一点开始是一个新的Java类

    import javax.swing.*;
    import java.awt.FlowLayout;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;

    public class Calculator_ui implements ActionListener
    {
       JFrame frame=new JFrame("Calculator");
       JPanel panel=new JPanel(new FlowLayout());

       JTextArea text=new JTextArea(5,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 ui()
       {
          frame.setVisible(true);
          frame.setSize(250,200);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          frame.add(panel);

          frame.add(text);

          panel.add(but1);
          panel.add(but2);
          panel.add(but3);
          panel.add(but4);
          panel.add(but5);
          panel.add(but6);
          panel.add(but7);
          panel.add(but8);
          panel.add(but9);
          panel.add(but0);

          panel.add(butadd);
          panel.add(butsub);
          panel.add(butmulti);
          panel.add(butdiv);
          panel.add(buteq);
          panel.add(butclear);

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



       }
       public void actionPerformed(ActionEvent e)
       {
          Object source=e.getSource();

          if(source==butclear)
          {
             number1=0.0;
             number2=0.0;
             text.setText("");
          }
          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;
       }




       public static void main(String[] args)
       {

       }//main
    }//class

3 个答案:

答案 0 :(得分:0)

您的代码中没有text.setText(<value>);。我不确定append函数是否正常工作。

答案 1 :(得分:0)

替换

frame.add(text);

通过

panel.add(text);

答案 2 :(得分:0)

问题是你使用的是边框布局的JFrame默认布局来添加面板和文本,默认情况下它会将组件添加到中心(如果添加多个组件,它们会隐藏其他组件),你可以在顶部添加一个,在中心添加一个:

  frame.add(panel, BorderLayout.SOUTH);
  frame.add(text, BorderLayout.CENTER);

您可以查看A Visual Guide to Layout Managers中存在哪些布局。当然,请参阅Creating a GUI With JFC/Swing中有关GUI的oracle官方教程。

此外,您的按钮被放置在流程布局中,因此它们将是一个接一个。也许您可以使用GridBagLayout将其定位为真正的计算器。

如果不执行主要方法,则不需要为所有类添加主方法。