为什么我的计算器程序会在添加显示时中断?

时间:2014-06-04 21:05:46

标签: java jframe calculator jtextarea

我正在编写一个程序来模拟java中的windows计算器。我有大部分图形,但当我添加文本区域(显示)时,它会破坏格式,甚至不显示。 一个有趣的事情是,在放入文本区域之前,大多数按钮仅显示“...”而不是实际值。据推测,这是因为文本对于按钮来说太大了,但是,随着显示器的添加,这些按钮突然变得足够大以显示按钮上的全文,并且对于框架来说它变得太宽。

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

public class Calculator extends JFrame implements ActionListener
{
  public static Scanner in = new Scanner(System.in);

//sets up each JButton
  JButton[] button = new JButton[28];

    JTextArea display = new JTextArea(1,20);

//sets up all the text to put on the buttons
  String[] buttonString = {"MC", "MR", "MS", "M+", "M-",
                                "<-", "CE", "C", "+/-", "squ",
                                "7",  "8",  "9",  "/",  "%",
                                "4",  "5",  "6",  "*", "1/x",
                                "1",  "2",  "3",  "-", "=",
                                "0",        ".",  "+"};

//sets up the boolean values for the different operations
  boolean[] function = {false,false,false,false};
//temporary double values for each number to be for each operation
  double temp1 = 0, temp2 = 0;
//set all font to Times New Roman size 13
  Font font = new Font("Times New Roman", Font.PLAIN, 12);

  public static void main(String[] args)
  {

     //creates calculator
        Calculator calc = new Calculator();
  } 

  public Calculator()
  {
  //makes a calculator with title and size
     super("Calculator");
     setDesign();
     setSize(210,261);
     setResizable(false);
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(3,2,2,3);

    int count = 0;
    /*c.gridx = 0;
    c.gridy = 0;
   display.setEditable(false);
   display.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
   display.setPreferredSize(new Dimension(190,50));
    c.gridwidth = 5;
    display.setFont(font);
  add(display, c);
    c.gridwidth = 1;*/
    for(int i = 1; i < 5; i++)
    {
        for(int k = 0; k < 5; k++)
        {
            c.gridx = k;
            c.gridy = i;
            button[count] = new JButton(buttonString[count]);
            button[count].addActionListener(this);
            button[count].setPreferredSize(new Dimension(34,27));
            button[count].setFont(font);
            add(button[count++], c);
        }
    }
    for(int i = 0; i < 4; i++)
    {
        c.gridx = i;
        c.gridy = 5;
        button[count] = new JButton(buttonString[count]);
        button[count].addActionListener(this);
        button[count].setPreferredSize(new Dimension(34,27));
        button[count].setFont(font);
        add(button[count++], c);

    }

    c.gridx = 4;
    c.gridy = 5;
    button[count] = new JButton(buttonString[count]);
    button[count].addActionListener(this);
    button[count].setPreferredSize(new Dimension(34,59));
    button[count].setFont(font);
    c.gridheight = 2;
    add(button[count++], c);

    c.gridx = 0;
    c.gridy = 6;
    button[count] = new JButton(buttonString[count]);
    button[count].addActionListener(this);
    button[count].setPreferredSize(new Dimension(73,27));
    button[count].setFont(font);
    c.gridwidth = 2;
    c.gridheight = 1;
    add(button[count++], c);

  c.gridx = 2;
    c.gridy = 6;
    button[count] = new JButton(buttonString[count]);
    button[count].addActionListener(this);
    button[count].setPreferredSize(new Dimension(34,27));
    button[count].setFont(font);
    c.gridwidth = 1;
    add(button[count++], c);

    c.gridx = 3;
    c.gridy = 6;
    button[count] = new JButton(buttonString[count]);
    button[count].addActionListener(this);
    button[count].setPreferredSize(new Dimension(34,27));
    button[count].setFont(font);
    add(button[count++], c);

             setVisible(true);

  }



  public final void setDesign()
  {
     try
     {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

     }
        catch(Exception E){}
  }

  public void actionPerformed(ActionEvent ae)
  {
     if(ae.getSource() == button[10])
        display.append("7");
     if(ae.getSource() == button[11])
        display.append("8");
     if(ae.getSource() == button[12])
        display.append("9");
     if(ae.getSource() == button[15])
        display.append("4");
     if(ae.getSource() == button[16])
        display.append("5");
     if(ae.getSource() == button[17])
        display.append("6");
     if(ae.getSource() == button[20])
        display.append("1");
     if(ae.getSource() == button[21])
        display.append("2");
     if(ae.getSource() == button[22])
        display.append("3");
     if(ae.getSource() == button[7])
        clear();
     if(ae.getSource() == button[8])
        switchSign();
     if(ae.getSource() == button[9])
        sqrt();
     if(ae.getSource() == button[10])
        display.append("7");
     if(ae.getSource() == button[13])
     {
        temp1 = Double.parseDouble(display.getText());
        function[1] = true;
        display.setText("");
     }
     if(ae.getSource() == button[18])
     {
        temp1 = Double.parseDouble(display.getText());
        function[0] = true;
        display.setText("");
     }
     if(ae.getSource() == button[23])
     {
        temp1 = Double.parseDouble(display.getText());
        function[3] = true;
        display.setText("");
     }
     if(ae.getSource() == button[27])
     {
        temp1 = Double.parseDouble(display.getText());
        function[2] = true;
        display.setText("");
     }
     if(ae.getSource() == button[24])
        displayResult();
     if(ae.getSource() == button[25])
        display.append("0");
     if(ae.getSource() == button[6])
        display.setText("");
  }

    public void clear()
    {
        try
        {
            display.setText("0");
            for(int i = 0; i < 4; i++)
                function[i] = false;
            temp1 = 0;
            temp2 = 0;
        }
        catch(NullPointerException e){}
    }

    public void clearEntry()
    {
        try
        {
            display.setText("0");
        }catch(NullPointerException e){}
    }

    public void oneoverx()
    {
        try
        {
            if(display.getText() != "0")
                display.setText("" + Double.parseDouble(display.getText()));
        }
        catch(NumberFormatException e){}
    }
    public void sqrt()
    {
        try
        {
            double value = Math.sqrt(Double.parseDouble(display.getText()));
            display.setText("" + value);
        }
        catch(NumberFormatException e){}
    }

    public void switchSign()
    {
        try
        {
            double value = Double.parseDouble(display.getText());

            if(value != 0)
        {
                value = value * -1;
               display.setText(Double.toString(value));
        }
        else{}
        }
        catch(NumberFormatException e){}
    }

    public void displayResult()
    {
        double result = 0; //variable for result
        temp2 = Double.parseDouble(display.getText()); //second temp number from display
        try
        {
            if(Double.toString(temp1).contains("-"))
            {
                String tempString = Double.toString(temp1);
                String temp = Double.toString(temp1).substring(tempString.indexOf("-"));
                temp1 = Double.parseDouble(temp) * -1;
            }   
            if(Double.toString(temp2).contains("-"))
            {
                String tempString = Double.toString(temp2);
                String temp = Double.toString(temp2).substring(tempString.indexOf("-"));
                temp2 = Double.parseDouble(temp) * -1;
            }   
        }
        catch(ArrayIndexOutOfBoundsException e){}
        try
        {
            if(function[0])
                result = temp1 * temp2;
            else if(function[1])
                result = temp1 / temp2;
            else if(function[2])
                result = temp1 + temp2;
            else if(function[3])
                result = temp1 - temp2;
            display.setText(Double.toString(result));
            for(int i = 0; i < 4; i++)
                function[i] = false;

        }
        catch(NumberFormatException e){}

    }

} 

这是我的代码,我不完全确定它有什么问题。目前,显示已注释掉,如果您想在块中找到它,可以使用以下代码

c.gridx = 0;
c.gridy = 0;
  display.setEditable(false);
  display.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
  display.setPreferredSize(new Dimension(190,50));
    c.gridwidth = 5;
    display.setFont(font);
  add(display, c);
    c.gridwidth = 1;

我也不确定我是否正确地把所有这些都放进去了,我以前从未问过这里的问题。谢谢!

编辑:这是我试图模仿的计算器,但具有更“金属”的外观和感觉。我已经有了外观和感觉所以看起来我想要它在我的计算器上,但我想保持尺寸准确。 calculator

1 个答案:

答案 0 :(得分:1)

只需从代码中删除所有setPreferredSize()setSize(),然后在添加所有组件后再调用pack()

Window#pack()状态是什么?

  

使此窗口的大小适合其子组件的首选大小和布局。如果任一维度小于上一次调用setMinimumSize方法所指定的最小大小,则会自动放大窗口的最终宽度和高度。

     

如果窗口和/或其所有者尚未显示,则在计算首选大小之前,它们都可显示。窗口在计算其大小后进行验证。

再做一次改变:

GridBagConstraints c = new GridBagConstraints();
c.fill=GridBagConstraints.BOTH;                 // ADD THIS LINE

详细了解GridBagConstraints.fill属性。

快照:

enter image description here