在另一个类中调用方法

时间:2017-08-05 17:29:02

标签: java method-call

这看起来像是第10000个类似主题之一,但我找不到类似的东西。我已经花了足够的时间在这上面,不要问你们。 我想要实现的是在另一个类中使用方法“calculateM()”。它们都需要导入等。该方法返回String编号。我不知道怎么称呼它。

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;
    }

...

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

4 个答案:

答案 0 :(得分:3)

您滥用继承,这个根本问题导致您的代码无法正常工作。在上面的课程中你有

calculation extends tripCostCalculatorUI

你有计算类扩展GUI,希望GUI字段可以用于你的计算,但这不是继承的目的 - 它不存在允许你连接数据,而是< em>扩展行为。是的,您当前的继承设置将允许您访问JTextFields,但是(这是关键),这些JTextField 与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;
    }
}

答案 1 :(得分:0)

好吧,如果从calculation类调用此方法,该调用将是有效的 你需要做的是实例化一个像这样的对象:

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

答案 2 :(得分:0)

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

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

}

答案 3 :(得分:0)

尝试从面向对象的范例来理解这一点。此类表示行程,并提供基于它计算某个数字的方法。实例字段正在计算中使用。这表明该方法属于一个对象。因此,您应该创建类的对象,然后使用该对象调用该方法。这是一个片段:

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

一般来说,您的方法似乎存在一些设计缺陷,但如果有更多关于类和方法的信息,我只能建议替代方案。