2017-08-05 146 views
-1

這看起來像是第10000個類似主題之一,但我找不到類似的東西。我已經花了足夠的時間在這個問題上,而不是問問你們。 我想要實現的是在另一個類中使用方法「calculateM()」。他們都有必需的進口等。該方法返回字符串編號。我不知道如何調用它。另一類中的調用方法

package tripCostCalculator; 

import java.text.DecimalFormat; 
import javax.swing.JOptionPane; 

public class calculation extends tripCostCalculatorUI { 

    float miles, averageFuel, fuelPrice, tripCost, result; 
    String number = ""; 

    public String calculateM() { 

     if(jTextField1.getText().isEmpty() || 
      jTextField2.getText().isEmpty() || 
      jTextField3.getText().isEmpty()) { 
       JOptionPane.showMessageDialog(jtp ,"Fill in all the boxes."); 
     } else { 
      miles = Float.parseFloat(jTextField1.getText()); 
      averageFuel = Float.parseFloat(jTextField2.getText()); 
      fuelPrice = Float.parseFloat(jTextField3.getText()); 

      tripCost = averageFuel * fuelPrice; 
      result = (miles/60) * tripCost; 

      DecimalFormat decimalFormat = new DecimalFormat("##.##"); 
      float twoDigitsResult = Float.valueOf(decimalFormat.format(result)); 


      number = String.valueOf(twoDigitsResult); 
      //jTextField4.setText("£" + String.valueOf(twoDigitsResult)); 
     } 
     return number; 
    } 

?? ??

tripCostCalculatorUI obj = new calculation(); 
obj.calculateM(); 
+0

我想你應該創建對象 計算cal = new calculation(); cal.calculateM(); – Telember

+0

它不能識別我的文本框中的條目。我有「填寫所有框」的消息框 – Lazio

+0

如何識別jtextfields –

回答

3

你濫用繼承,這個基本問題導致你的代碼不工作。在你的類上面你有

calculation extends tripCostCalculatorUI 

你必須計算類擴展的圖形用戶界面,與希望的GUI字段就可以在你的計算中使用,但是這不是繼承是 - 它不存在於允許你連接數據,而不是擴展行爲。是的,您設置的當前繼承將允許您訪問JTextFields,但(這是關鍵),這些JTextFields是而不是與GUI中顯示的相同,因爲它們是完全不同實例的一部分。您的計算類不滿足與GUI類的「is-a」關係,所以不應該擴展它。

相反,您應該給計算類(應更名爲Calculation,因爲所有類名都應以大寫字母開頭)帶有數字參數的方法,該參數允許其他使用此類的類,包括Gui類,將數據傳遞到計算方法的能力,然後獲得它們返回的結果。

所以計算應該不使用JTextField變量,而是使用傳遞給它的計算方法參數的值。

因此,在GUI的ActionListener中,GUI本身將從其組件提取數據,將需要轉換的任何內容轉換爲數值,從Calculation類調用適當的方法以允許計算,然後顯示返回的結果(將結果轉換爲文本後)。

這裏的正是我的意思是一個簡單的例子,其中的GUI和計算類是獨立的,在您使用方法參數:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class SimpleCalcGui extends JPanel { 
    private static final long serialVersionUID = 1L; 
    private JTextField field1 = new JTextField(5); 
    private JTextField field2 = new JTextField(5); 
    private JTextField resultField = new JTextField(5); 
    private JButton calcButton = new JButton("Calculate"); 

    public SimpleCalcGui() { 
     resultField.setFocusable(false); 
     calcButton.addActionListener(new CalcListener()); 

     add(field1); 
     add(new JLabel("+")); 
     add(field2); 
     add(new JLabel("=")); 
     add(resultField); 
     add(calcButton); 
    } 

    private class CalcListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       // extract the values and convert to numbers 
       int value1 = Integer.parseInt(field1.getText()); 
       int value2 = Integer.parseInt(field2.getText()); 

       // call MyCalc's method passing in the values 
       int result = MyCalc.addition(value1, value2); 

       // display the result 
       resultField.setText("" + result); 

      } catch (NumberFormatException e1) { 
       JOptionPane.showMessageDialog(calcButton, "Both text fields must have valid numbers", 
         "Numeric Entry Error", JOptionPane.ERROR_MESSAGE); 
       field1.setText(""); 
       field2.setText(""); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() { 
     SimpleCalcGui mainPanel = new SimpleCalcGui(); 
     JFrame frame = new JFrame("SimpleCalcGui"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 
} 

public class MyCalc { 
    // overly simple but just to show what I mean 
    public static int addition(int value1, int value2) { 
     return value1 + value2; 
    } 
} 
+0

我不明白你的意思是允許將數據傳遞到計算方法中。這就是我想要弄明白的。我知道該程序的「骨架」是完整的垃圾。 – Lazio

+0

@Lazio:你的困惑是一個涉及到對象是什麼以及繼承如何工作的基本理解,並且要完全理解這個(你需要做的),你必須在你的文本或教程中重新審視這些章節。關鍵的概念是,您不應該計算擴展GUI,完全刪除該語句,讓所有GUI組件不計算,使用參數與您的方法,它將工作。 –

+0

好吧,我已經使用了繼承,所以其他類可以使用另一個類的方法。我不確定如果他們不以某種方式連接在一起,他們將如何知道彼此的方法。 – Lazio

0

好吧,如果你是從 calculation類調​​用這個方法,你需要做的就是實例化一個像這樣的對象,調用將是有效的這在面向對象的範式方面。這個類代表一次旅行,並提供一種基於它來計算某個數字的方法。實例字段正在計算中使用。這表明該方法屬於一個對象。因此,您應該創建該類的對象,然後使用該對象調用該方法。這裏是一個片段:

Calculation c = new Calculation(); 
c.calculateM(); 

似乎有在一般的做法有些設計上的缺陷,但如果給予有關的類和方法的詳細信息,我只能建議的替代品。

0
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {  

    Calculator calculator= new Calculator();  
    String something= calculator.calculateM(); 

} 
+0

它不能識別我在文本框中的條目我有「填寫所有框」的消息框。 – Lazio

+0

因爲您沒有通過它的任何參數 –

+0

這不是一個好的設計,但是儘量讓jTextFields在你初始化它們的地方都是公開的 –

0

試着去理解:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {  
     calculateM(); 
} 
+0

它不能識別我在文本框中的條目我有一個消息框「填寫所有的框。 – Lazio