2012-06-09 30 views
0

我最近一直在修改我的鞦韆計算器上按鈕的大小時遇到​​問題。如果你運行它,你會看到一個計算器,幾乎和常規的Windows計算器一樣好。但我試圖讓它看起來像一個普通的Windows計算器完全。我已經放下了代碼,並且有幾個問題。修改我的java swing計算器的圖形

  1. 如果您按等於兩次,您會發現文本上的數字將被設置爲零。有人能給我一個提示來解決這個問題嗎?
  2. 如果你按兩個連續函數(exe。add和multiply),你會發現它通常會做第一個函數。它應該按下第二個功能。再次,有人可以給我一個提示來解決這個問題嗎? Ggraphics:你如何調整按鈕大小?我試着調用buttons.resize(),它應該像在java API中一樣工作,但由於某種原因它沒有任何作用。
  3. 如何將按鈕上的文字設置爲不同的顏色?

順便說一句,我寧願如果有人第一次回答圖形問題,我肯定我可以自己計算出功能。

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

請仔細閱讀並使用數組。它會讓你的代碼大小的1/5,讓你和我們更容易閱讀,理解和調試。 –

+2

如果你能弄清楚如何解決一些問題,你爲什麼要問這裏?開始調試以縮小出現問題的代碼。我們不是答案數據庫,我們幫助解決問題。 – Hidde

回答

1

答案爲1和2:

你必須在一個堆棧跟蹤您的運營商可能更好,或者直到你想「清除掉」歷史存儲信息爲你所需要的。這是一個在線的例子,它提供了一個類似的程序。

Java: Example - Simple Calculator

以下是關於一些在你的代碼需要改變一些細節...

線415在您的processEquals()功能,您清除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

要更改組件的默認字體,你可以嘗試使用UIManager的方法,但你需要了解這些可能非常有用&感受依賴,因此可能不適用於每個L & F.例如,如果您想要JBut噸有較大的字體,你可以這樣做:

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

我認爲,這可能會需要被調用創建任何Jbutton將之前。因此,在創建Calculator對象之前,可以在您的主要方法中調用此方法的一個位置,或者另一個位置可以位於靜態初始化程序塊內。