Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在另一个类中调用方法_Java_Method Call - Fatal编程技术网

Java 在另一个类中调用方法

Java 在另一个类中调用方法,java,method-call,Java,Method Call,这看起来像是第10000个类似的主题之一,但我就是找不到类似的主题。我已经花了足够多的时间在这件事上了,不想问你们。 我试图实现的是在另一个类中使用calculateM方法。它们都有必需的导入等。该方法返回字符串编号。我不知道怎么称呼它 package tripCostCalculator; import java.text.DecimalFormat; import javax.swing.JOptionPane; public class calculation extends trip

这看起来像是第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();

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

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

一般来说,您的方法中似乎存在一些设计缺陷,但我只能在提供了有关类和方法的更多信息的情况下提出替代方案。

您误用了继承,而这个基本问题导致您的代码无法工作。在你的班上你有

calculation extends tripCostCalculatorUI
您让计算类扩展GUI,希望GUI字段可以在您的计算中使用,但这不是继承的目的-它不允许您连接数据,而是扩展行为。是的,您当前的继承设置将允许您访问JTextFields,但这是关键,这些JTextFields与GUI中显示的JTextFields不同,因为它们是完全不同实例的一部分。您的计算类不满足与GUI类的is-a关系,因此不应该扩展它

相反,您应该指定应重命名为calculation的calculation类,因为所有类名都应以大写字母开头,这些字母方法采用数字参数,允许其他使用此类的类(包括Gui类)将数据传递到计算方法中,然后得到他们返回的结果

因此,计算不应该使用JTextField变量,而是使用传递到计算方法参数中的值

因此,在GUI的ActionListener中,GUI本身将从其组件中提取数据,将任何需要转换的内容转换为数值,从计算类调用适当的方法以允许计算,然后显示将结果转换为文本后返回的结果

下面是一个简单的示例,说明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);
    }
}

我认为您应该创建对象cal=新计算;cal.calculateM;它无法识别文本框中的我的条目。我在messagebox中填充了所有框。jtextfields的识别方式无法识别我在文本框中的输入。我有一个填充了所有框的messagebox。因为你没有向它传递任何参数。这不是一个好的设计,但是试着让jTextFields在你初始化它们的地方公开。它无法识别我在文本框中的条目。我有一个填充所有框的消息框。我不明白你所说的允许将数据传递到计算方法的能力是什么意思。这就是我想弄明白的。我知道程序的框架完全是垃圾。@Lazio:你的困惑涉及到对对象是什么以及继承如何工作的基本理解,要完全理解你需要做的事情,你必须在你的文本或教程中重新回顾这些章节。关键的概念是,您不应该让计算扩展GUI,完全删除该语句,让所有GUI组件退出计算,在方法中使用参数,它就会工作。好的,我已经使用了继承,以便其他类可以使用其他类的方法。我不知道如果他们不以某种方式联系在一起,他们将如何了解彼此的方法。@Lazio:请参见编辑以了解我的意思谢谢!:我现在明白了。
calculation extends tripCostCalculatorUI
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;
    }
}