2014-05-18 54 views
-1

我有這個計算器正在工作,但是我不知道如何在單擊「完成」按鈕時將結果窗口中的值傳遞到第一個文本框。將一個JLabel的值傳遞給另一個

我是Java新手。我試過這樣做,但我一直在收到錯誤。我把錯誤的代碼//

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.NumberFormat; 
import javax.swing.AbstractAction; 
import static javax.swing.Action.NAME; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestCalculator { 

public static void main(String[] args) { 
    new TestCalculator(); 
} 

public TestCalculator() { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
      } 

      ResultPane resultPane = new ResultPane(); 

      JFrame frame = new JFrame("Testing"); 
      frame.setGlassPane(resultPane); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLayout(new BorderLayout()); 
      frame.add(new CalculatorPane(resultPane)); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 

     } 
    }); 
} 

public class ResultPane extends JPanel { 

    private JLabel result; 
    private Timer timer; 

    private int xDelta = (Math.random() > 0.5) ? 1 : -1; 
    private int yDelta = (Math.random() > 0.5) ? 1 : -1; 

    ; 

    public ResultPane() { 
     setOpaque(false); 
     setLayout(null); 
     result = new JLabel(); 
     Font font = result.getFont(); 
     font = font.deriveFont(Font.BOLD, 26f); 
     result.setFont(font); 
     add(result); 
     timer = new Timer(40, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Point point = result.getLocation(); 
       point.x += xDelta; 
       point.y += yDelta; 
       if (point.x < 0) { 
        point.x = 0; 
        xDelta *= -1; 
       } else if (point.x + result.getWidth() > getWidth()) { 
        point.x = getWidth() - result.getWidth(); 
        xDelta *= -1; 
       } 
       if (point.y < 0) { 
        point.y = 0; 
        yDelta *= -1; 
       } else if (point.y + result.getHeight() > getHeight()) { 
        point.y = getHeight() - result.getHeight(); 
        yDelta *= -1; 
       } 
       result.setLocation(point); 
       repaint(); 
      } 

     }); 
     timer.start(); 
    } 

    public void setResult(Number number) { 
     result.setText("Result: " + NumberFormat.getNumberInstance().format(number)); 
     result.setSize(result.getPreferredSize()); 
     setVisible(true); 
    } 

} 

public class CalculatorPane extends JPanel { 

    private final ResultPane resultPane; 

    private final JLabel firstNumberLabel = new JLabel("First Number:"); 
    private final JLabel secondNumberLabel = new JLabel("Second Number:"); 

    private final JTextField firstNumberField = new JTextField(5); 
    private final JTextField secondNumberField = new JTextField(5); 

    public double result = 0.0; 

    public CalculatorPane(ResultPane resultPane) { 

     setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 

     this.resultPane = resultPane; 

     JPanel fields = new JPanel(); 
     fields.add(firstNumberLabel); 
     fields.add(firstNumberField); 
     fields.add(secondNumberLabel); 
     fields.add(secondNumberField); 

     add(fields, gbc); 

     JPanel buttons = new JPanel(); 
     buttons.add(new JButton(new AddAction())); 
     buttons.add(new JButton(new SubtractAction())); 
     buttons.add(new JButton(new MultiplyAction())); 
     buttons.add(new JButton(new DivideAction())); 
     buttons.add(new JButton(new ToText1Action())); 

     add(buttons, gbc); 

    } 

    public class AddAction extends AbstractAction { 

     public AddAction() { 
      putValue(NAME, "+"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       double num1 = Double.parseDouble(firstNumberField.getText()); 
       double num2 = Double.parseDouble(secondNumberField.getText()); 

       double result = num1 + num2; 

       //num1.setResult(firstNumberField); 
       resultPane.setResult(result); 
      } catch (NumberFormatException exp) { 
      } 
     } 

    } 
    public class SubtractAction extends AbstractAction { 

     public SubtractAction() { 
      putValue(NAME, "-"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       double num1 = Double.parseDouble(firstNumberField.getText()); 
       double num2 = Double.parseDouble(secondNumberField.getText()); 

       double result = num1 - num2; 
       resultPane.setResult(result); 
      } catch (NumberFormatException exp) { 
      } 
     } 

    } 
    public class MultiplyAction extends AbstractAction { 

     public MultiplyAction() { 
      putValue(NAME, "x"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       double num1 = Double.parseDouble(firstNumberField.getText()); 
       double num2 = Double.parseDouble(secondNumberField.getText()); 

       double result = num1 * num2; 
       resultPane.setResult(result); 
      } catch (NumberFormatException exp) { 
      } 
     } 

    } 
    public class DivideAction extends AbstractAction { 

     public DivideAction() { 
      putValue(NAME, "/"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       double num1 = Double.parseDouble(firstNumberField.getText()); 
       double num2 = Double.parseDouble(secondNumberField.getText()); 

       double result = num1/num2; 
       resultPane.setResult(result); 
      } catch (NumberFormatException exp) { 
      } 
     } 

    } 
    public class ToText1Action extends AbstractAction { 
     public ToText1Action() { 
      putValue(NAME, "Finish"); 

     } 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      String resultText = resultPane.getResultText(); // = resultPane.getResultText(); 
                  //   ^error cannot find symbol 
      firstNumberField.setText(resultText); 
     } 
    } 
    public String getResultText() { 
     result.getText(); //result.getText(); 
    }      // ^error: double cannot be dereferenced 
} 
} 
+0

一遍嗎?什麼是錯的其他3個答案[完全相同的最後一個問題](http://stackoverflow.com/questions/23713392/how-to-transfer-a-value-from-one-jlabel-to-another)?你選擇的答案與@HovercraftFullOfEels給出的答案相同嗎? – MadProgrammer

回答

1

這不是做的最好辦法,但你可以做

public String getResultText(){ 
    return ""+result; 
} 

你並不需要做的getText()或的toString ()(我認爲不存在,是原始類型),但你必須添加「」。 Java獨自進行鑄造。

添加新的代碼,並覆蓋:

public class ResultPane extends JPanel { 

private JLabel result; 
private Timer timer; 

private int xDelta = (Math.random() > 0.5) ? 1 : -1; 
private int yDelta = (Math.random() > 0.5) ? 1 : -1; 

public ResultPane() { 
    setOpaque(false); 
    setLayout(null); 
    result = new JLabel(); 
    Font font = result.getFont(); 
    font = font.deriveFont(Font.BOLD, 26f); 
    result.setFont(font); 
    add(result); 
    timer = new Timer(40, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      Point point = result.getLocation(); 
      point.x += xDelta; 
      point.y += yDelta; 
      if (point.x < 0) { 
       point.x = 0; 
       xDelta *= -1; 
      } else if (point.x + result.getWidth() > getWidth()) { 
       point.x = getWidth() - result.getWidth(); 
       xDelta *= -1; 
      } 
      if (point.y < 0) { 
       point.y = 0; 
       yDelta *= -1; 
      } else if (point.y + result.getHeight() > getHeight()) { 
       point.y = getHeight() - result.getHeight(); 
       yDelta *= -1; 
      } 
      result.setLocation(point); 
      repaint(); 
     } 

    }); 
    timer.start(); 
} 

public void setResult(Number number) { 
    result.setText("Result: " + NumberFormat.getNumberInstance().format(number)); 
    result.setSize(result.getPreferredSize()); 
    setVisible(true); 
} 

public String getResultText(){ 
    return result.getText(); 
} 

} 
+0

String resultText = resultPane.getResultText();仍然出現錯誤 –

+0

因爲resultPane沒有名爲getResultText()的方法,請查看代碼中的括號和級別。現在getResultText()在calculatorpane類中 – DrkDeveloper

+0

我不得不說你認爲,我不認爲這是做計算器的最好方法。你不需要所有這些窗格。 – DrkDeveloper