修改我的java swing计算器的图形

时间:2012-06-09 21:33:08

标签: java swing graphics jbutton calculator

我最近在修改摇摆计算器上的按钮大小时遇到​​了问题。如果你运行它,你会看到一个几乎与常规Windows计算器一样好的计算器。但我试图让它看起来像一个常规的Windows计算器完全。我已经放下了代码,我有几个问题。

  1. 如果按两次等于,则会发现文本上的数字将设置为零。有人可以给我一个解决方法吗?
  2. 如果你按两个连续的函数(exe。添加然后乘法),你会发现它通常会执行第一个函数。它应该按下第二个功能。再一次,有人能给我一个解决方法吗?
  3. Ggraphics:你如何调整按钮的大小?我尝试调用buttons.resize(),它应该像在java API中一样工作,但由于某种原因它没有效果。
  4. 如何将按钮上的文字设置为其他颜色?
  5. 顺便说一下,如果有人第一次回答图形问题,我更愿意,我相信我可以自己计算出这些功能。

       import java.awt.BorderLayout;
       import java.awt.Color;
       import java.awt.Container;
       import java.awt.FlowLayout;
       import java.awt.GridLayout;
       import java.awt.event.ActionEvent;
       import java.awt.event.ActionListener;
       import javax.swing.*;
       import java.awt.GridBagConstraints;
       import java.awt.Dimension;
    
        public class Calculator extends JFrame implements ActionListener
       {  
          JButton button1 = new JButton("1");
          JButton button2 = new JButton("2");
          JButton button3 = new JButton("3");
          JButton button4 = new JButton("4");
          JButton button5 = new JButton("5");
          JButton button6 = new JButton("6");
          JButton button7 = new JButton("7");
          JButton button8 = new JButton("8");
          JButton button9 = new JButton("9");
          JButton button0 = new JButton("0");
    
          JButton buttonAdd = new JButton("+");
          JButton buttonSub = new JButton("-");
          JButton buttonMult = new JButton("*");
          JButton buttonDiv = new JButton("/");
          JButton buttonEquals = new JButton("=");
          JButton buttonClear = new JButton("C");
    
          JButton plusOrMinus = new JButton("+/-");
          JButton decimal = new JButton(".");
          JButton squareRoot = new JButton("sqrt.");
          JButton inverse = new JButton("1/x");
          JButton mod = new JButton("%");
          JButton backSpace = new JButton("Backspace");
          JButton clearE = new JButton("CE");
    
          JButton memoryClear = new JButton("MC");
          JButton memoryRecall = new JButton("MR");
          JButton memoryStore = new JButton("MS");
          JButton memoryAdd = new JButton("M+");
    
          JPanel jBack = new JPanel();
          JLabel output = new JLabel("0");
          JPanel jSpacing = new JPanel();
          JPanel jMstr = new JPanel();
          JPanel buttonSpace = new JPanel();
    
          double firstNumber, memoryNumber;
          String opera = "0";
          boolean clear;
    
           public Calculator()
          {     
             output.setHorizontalTextPosition(JLabel.RIGHT);
             output.setBackground(Color.WHITE);
             output.setOpaque(true);
    
             getContentPane().add(output, BorderLayout.NORTH);
    
             jBack.setLayout(new GridLayout(1, 1, 2, 2));
             jBack.add(backSpace);
    
             jSpacing.setLayout(new GridLayout(1, 2, 2, 2));        
             jSpacing.add(clearE);
             jSpacing.add(buttonClear);
    
             buttonSpace.setLayout(new GridLayout(4, 5, 2, 2));
    
             buttonSpace.add(memoryClear);   
             buttonSpace.add(button7);
             buttonSpace.add(button8);
             buttonSpace.add(button9);
             buttonSpace.add(buttonDiv);
             buttonSpace.add(squareRoot);
    
             buttonSpace.add(memoryRecall);   
             buttonSpace.add(button4);
             buttonSpace.add(button5);
             buttonSpace.add(button6);
             buttonSpace.add(buttonMult);
             buttonSpace.add(inverse);
    
             buttonSpace.add(memoryStore);         
             buttonSpace.add(button1);
             buttonSpace.add(button2);
             buttonSpace.add(button3);
             buttonSpace.add(buttonSub);
             buttonSpace.add(mod);
    
             buttonSpace.add(memoryAdd);
             buttonSpace.add(button0);
             buttonSpace.add(plusOrMinus);
             buttonSpace.add(decimal);
             buttonSpace.add(buttonAdd);
             buttonSpace.add(buttonEquals);
    
             jMstr.setLayout(new BorderLayout());
             jMstr.add(jBack, BorderLayout.WEST);
             jMstr.add(jSpacing, BorderLayout.EAST);
             jMstr.add(buttonSpace, BorderLayout.SOUTH);
    
             getContentPane().add(jMstr, BorderLayout.SOUTH);
    
             button1.addActionListener(this);
             button2.addActionListener(this);
             button3.addActionListener(this);
             button4.addActionListener(this);
             button5.addActionListener(this);
             button6.addActionListener(this);
             button7.addActionListener(this);
             button8.addActionListener(this);
             button9.addActionListener(this);
             button0.addActionListener(this);
    
             buttonAdd.addActionListener(this);
             buttonSub.addActionListener(this);
             buttonMult.addActionListener(this);
             buttonDiv.addActionListener(this);
             buttonEquals.addActionListener(this);
             buttonClear.addActionListener(this);
    
             plusOrMinus.addActionListener(this);
             decimal.addActionListener(this);
             squareRoot.addActionListener(this);
             inverse.addActionListener(this);
             mod.addActionListener(this);
             backSpace.addActionListener(this);
             clearE.addActionListener(this);
    
             memoryClear.addActionListener(this);
             memoryRecall.addActionListener(this);
             memoryStore.addActionListener(this);
             memoryAdd.addActionListener(this);
    
             try
             {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
             }
    
                 catch(Exception e)
                {
                }       
    
             SwingUtilities.updateComponentTreeUI(jMstr);       
          }
    
           public void actionPerformed(ActionEvent e)
          {
             double result = 0;
    
             if(e.getSource() == buttonEquals)
             {
                processEquals();
             }
    
             if(e.getSource() == button0)
             {
                putDigitOnLabel(0);
             }
    
             if(e.getSource() == button1)
             {
                putDigitOnLabel(1);
             }
    
             if(e.getSource() == button2)
             {
                putDigitOnLabel(2);
             }
    
             if(e.getSource() == button3)
             {
                putDigitOnLabel(3);
             }
    
             if(e.getSource() == button4)
             {
                putDigitOnLabel(4);
             }
    
             if(e.getSource() == button5)
             {
                putDigitOnLabel(5);
             }
    
             if(e.getSource() == button6)
             {
                putDigitOnLabel(6);
             }
    
             if(e.getSource() == button7)
             {
                putDigitOnLabel(7);
             }
    
             if(e.getSource() == button8)
             {
                putDigitOnLabel(8);
             }
    
             if(e.getSource() == button9)
             {
                putDigitOnLabel(9);
             }
    
             if(e.getSource() == plusOrMinus)
             {
                changeSign();
             }
    
             if(e.getSource() == decimal)
             {
                addDecimalPoint();
             }
    
             if(e.getSource() == buttonDiv)
             {
                if(getNumberInDisplay() == 0)
                {
                   output.setText("Cannot divide a number by zero.");
                }
                operation("/");
             }
    
             if(e.getSource() == buttonMult)
             {
                operation("*");
             }
    
             if(e.getSource() == buttonSub)
             {
                operation("-");
             }
    
             if(e.getSource() == buttonAdd)
             {
                operation("+");
             }
    
             if(e.getSource() == squareRoot)
             {
                if(getNumberInDisplay() < 0)
                {
                   output.setText("Cannot take the square root of a negative number.");
                }
    
                double num = Math.sqrt(Double.parseDouble(output.getText()));
                output.setText(Double.toString(num));
    
             }
    
             if(e.getSource() == inverse)
             {
                if(getNumberInDisplay() == 0)
                {
                   output.setText("Cannot take the inverse of the number zero");
                }
                double num = 1/( Double.parseDouble(output.getText()));
                output.setText(Double.toString(num));
             }
    
             if(e.getSource() == mod)
             {
                result = getNumberInDisplay() / 100;
                displayResult(result);
             }
    
             if(e.getSource() == backSpace)
             {
    
    
         setTextOnOutput(getStringOnDisplay().substring(0, getStringOnDisplay().length()-1));   
    
    
             }
    
             if(e.getSource() == clearE)
             {
                clearEverythingButOperation();
             }
    
             if(e.getSource() == buttonClear)
             {
                clearEverything();
             }  
    
             if(e.getSource() == memoryRecall)
             {
                displayResult(memoryNumber);
             }
    
             if(e.getSource() == memoryStore)
             {
                memoryNumber = getNumberInDisplay();
             }
    
             if(e.getSource() == memoryAdd)
             {
                memoryNumber += getNumberInDisplay();
             }   
    
             if(e.getSource() == memoryClear)
             {
                memoryNumber = 0;
             }                          
          } 
    
           public void setTextOnOutput(String s)
          {
             output.setText(s);
          }
    
           public String getStringOnDisplay()
          {
             return output.getText();
          }
    
           public void putDigitOnLabel(int digit)
          {
             if(clear == true)
             {
                output.setText("");
             }
    
             if(getStringOnDisplay().indexOf("0") == 0)
             {
                setTextOnOutput(getStringOnDisplay().substring(1));
             }
    
             output.setText(getStringOnDisplay() + digit);
    
             clear = false;
          }     
    
           public void addDecimalPoint()
          {
             if(clear == true)
             {
                setTextOnOutput("");
             }
    
             if(getStringOnDisplay().indexOf(".") == -1)
             {
                setTextOnOutput(new String(getStringOnDisplay() + "."));
             }
          }
    
           public void changeSign()
          {
             if(Double.parseDouble(output.getText()) < 0)
             {
                setTextOnOutput(getStringOnDisplay().substring(1));
             }
    
             if(Double.parseDouble(output.getText()) > 0)
             {
                setTextOnOutput(Double.toString(getNumberInDisplay() * -1));
             }    
          } 
    
           public void clearEverythingButOperation()
          {
             setTextOnOutput("0");
             clear = true;      
          }
    
           public void clearEverything()
          {
             setTextOnOutput("0");
             opera = "0";
             firstNumber = 0;
             clear = true;
          }
    
           public double getNumberInDisplay()
          {
             String stuff = output.getText();
             return Double.parseDouble(stuff);
          }
    
           public void operation(String s)
          {      
             double number = getNumberInDisplay();
    
             if(!(opera.equals("0")))
             {         
                double result = processOperator();
                displayResult(result);
                firstNumber = result;
             }
    
             else
             {
                firstNumber = number;
             }
    
             clear = true;
             opera = s;
          }
    
           public void processEquals()
          {
             double result;
    
             result = processOperator();
             displayResult(result);
    
             opera = "0";
          }
    
           public double processOperator()
          {    
             double answer = 0;
             double number = getNumberInDisplay();
    
             if(opera.equals("*"))
             {
    
                answer = firstNumber * number;
             }
    
             if(opera.equals("-"))
             {
                answer = firstNumber - number;
             }
    
             if(opera.equals("+"))
             {
                answer = firstNumber + number;
             }
    
             if(opera.equals("/"))
             {
                answer = firstNumber / number;
             }
    
             return answer;
          }
    
           public void displayResult(double result)
          {
             setTextOnOutput(Double.toString(result));
             firstNumber = result;
             clear = true;
          }
    
           public static void main(String args[])
          {
             Calculator f= new Calculator();
             f.setTitle("Windows Calculator");
             f.setSize(300, 300);
             f.pack();
             f.setVisible(true);
             f.setResizable(false);
          } 
       }
    

2 个答案:

答案 0 :(得分:1)

回答1和2:

您需要更好地在堆栈中跟踪您的操作员,或者存储您需要的信息,直到您想要“清除”历史记录。这是一个在线制作类似程序的例子。

Java: Example - Simple Calculator

以下是您的代码中所需的一些更改的一些细节......

processEquals()功能的第415行,您清除了opera变量。这使得第二次按下等号无效。如果你注释掉那一行,它应该会更好。

operation(String)函数的第390行,您将获得NumberInTheDisplay()以便在操作中使用,但如果他们决定两次单击等号,则您不会保留它。您需要存储此值并使其可用于processEquals()

通常,在进行故障排除或添加功能时,请确定当前行为,并确定所需的行为,并将差异细分为可管理的块。

还针对特定功能和行为进行一组单元测试,以便了解它何时起作用以及何时起作用。

除此之外,您需要自己调试它。祝好运。

回答3:

How to set the component size with GridLayout? Is there a better way?

回答4:

How to set background color of a button in Java GUI?

答案 1 :(得分:1)

要更改组件的默认字体,您可以尝试使用UIManager方法,但您需要了解这些方法可能非常简洁。感觉依赖,因此可能不适用于每个L&amp; F.例如,如果你想让JButton有一个更大的Font,你可以这样做:

Font btnFont = UIManager.getFont("Button.font");
float fontSize = 16f;
btnFont = btnFont.deriveFont(fontSize);
UIManager.put("Button.font", btnFont);

我相信在创建任何JButton之前可能需要调用它。因此,在创建Calculator对象之前,可以在main方法中调用它,或者其他位置可以在静态初始化程序块中。