2017-08-05 144 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