java - 为什么添加显示后我的计算器程序会中断?

标签 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){}

    }

} 

这是我的代码,我不完全确定它有什么问题。目前,显示已被注释掉,如果您想在 block 中找到它,这里是它的代码

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

最佳答案

只需从代码中删除所有 setPreferredSize()setSize() 并在添加所有组件后最后调用 pack() .

什么 Window#pack()州?

Causes this Window to be sized to fit the preferred size and layouts of its subcomponents. The resulting width and height of the window are automatically enlarged if either of dimensions is less than the minimum size as specified by the previous call to the setMinimumSize method.

If the window and/or its owner are not displayable yet, both of them are made displayable before calculating the preferred size. The Window is validated after its size is being calculated.

再做一项更改:

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

了解更多关于GridBagConstraints.fill的信息属性。

快照:

enter image description here

关于java - 为什么添加显示后我的计算器程序会中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24047560/

相关文章:

java - 在类之间发送变量

Java:纠错码计算器

java - 计算器项目问题

java - 在java中使用JSoup解析没有ID的html表

java - spring security - expiredUrl 不工作

java - 更改 JAVA DNS 缓存设置

javascript - Javascript 计算器中的平方根未显示

java - 在java swing中同步滚动N个jtables

java - 如何在 Java 网格 GUI 中选择特定单元格?

Java Jframe 向另一个 X Server 启动另一个 JFrame