0

さまざまな都市間の距離の換算計算機を作成しています。しかし、変換メソッドから計算を呼び出す方法に問題があります。ここのような:

private class ComboBoxListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        int selectedRow = destinationBox.getSelectedIndex();
        int selectedCol = originBox.getSelectedIndex();
        distanceText.setText(fileData[selectedRow + 1][selectedCol + 1]);
    }
}

private class RadioButtonListener implements ActionListener
{

    public void actionPerformed (ActionEvent event)
    {
        if (event.getSource() == kilometersRadioButton)
        {
            distanceLabel.setText("Distance (kilometers):");
            avgspeedLabel.setText("Avg. Speeg (kph): ");  
        }
        else if (event.getSource() == milesRadioButton)
        {
            distanceLabel.setText("Distance (miles): ");
            avgspeedLabel.setText("Avg. Speeg (mph): ");
        }
    }
}

この部分は、2D 配列が値を選択する場所であり、私の意図は、ラジオ ボタンがクリックされるたびに、マイルから KM までの計算が行われるようにすることです。私が描いているファイルは、デフォルトでマイル単位です。

public class MetricConverter
{

    public static double milesToKilometers(double miles) //This static method holds the miles to kilometers conversion equation
    {
        return miles * 1.609;
    }

    public static double kilometersToMiles(double kilometers) //This static method holds the kilometers to miles conversion equation
    {
        return kilometers / 1.609;
    }
}

これが変換方法です。配列の値は TextField/String にあるため、それらを呼び出すにはどうすればよいですか。

ありがとうございました、

4

3 に答える 3

2

メソッドは静的であるため、次の方法で直接呼び出すことができますClassname.methodName();

String に格納する場合は、次のようにします。

String str = String.valueOf(MetricConverter.kilometersToMiles( kilometers));
于 2013-04-12T10:11:48.000 に答える
1

変換メソッドを呼び出す方法を知っていると想像してください。次のシナリオを検討してください。

  1. 2 つの都市を選択します。距離はマイルで表示されます。
  2. キロメートルを選択します。距離はキロメートルで表示されます。
  3. 都市の 1 つを変更します。ラジオボタン「キロメートル」が選択されていても、距離はマイルで表示されます。

問題は、入力するテキストがdistanceText2 つの異なる入力アクション (都市の設定と表示タイプの設定) に依存することです。したがって、テキストを設定するときは、そのすべての情報が必要です。

イベント ハンドラーが内部クラスとして宣言されていると仮定して、そのデータ用のいくつかのフィールド、対応するセッター、および「テキストの更新」メソッドを提案します。

private int row, column;
private boolean inKm;

private void setCities(int row, int column) {
    this.row = row;
    this.column = column;
}

private void setKm(boolean inKm) {
    this.inKm = inKm;
}

// one place to set the distance text
private void updateDistanceText() {
    String text = fileData[row+1][column+1];
    if (inKm) {
        text = String.valueOf(
                   MetricConverter.milesToKilometers(Double.valueOf(text)));
    }
    distanceText.setText(text);        
}

最後に、イベント ハンドラーを更新します。

private class ComboBoxListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        setCities(destinationBox.getSelectedIndex(), 
                  originBox.getSelectedIndex());
        updateDistanceText();
    }
}

private class RadioButtonListener implements ActionListener {
    public void actionPerformed (ActionEvent event) {
        if (event.getSource() == kilometersRadioButton) {
            distanceLabel.setText("Distance (kilometers):");
            avgspeedLabel.setText("Avg. Speed (kph): ");
            setKm(true);
        } else if (event.getSource() == milesRadioButton) {
            distanceLabel.setText("Distance (miles): ");
            avgspeedLabel.setText("Avg. Speed (mph): ");
            setKm(false);
        }
        updateDistanceText();
    }
}

編集まだ学んでいないテクニックを使いたくない場合は、コピーアンドペーストを使用できます...一般に、同じコードを複数の場所に配置することは悪い習慣です。説明目的で、とにかくそれを行います:

private class ComboBoxListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        int selectedRow = destinationBox.getSelectedIndex();
        int selectedCol = originBox.getSelectedIndex();

        String text = fileData[selectedRow+1][selectedColumn+1];

        if (kilometersRadioButton.isSelected()) {
            text = String.valueOf(
                     MetricConverter.milesToKilometers(Double.valueOf(text)));
        }

        distanceText.setText(text);        
    }
}

private class RadioButtonListener implements ActionListener {
    public void actionPerformed (ActionEvent event) {
        int selectedRow = destinationBox.getSelectedIndex();
        int selectedCol = originBox.getSelectedIndex();

        String text = fileData[selectedRow+1][selectedColumn+1];

        if (event.getSource() == kilometersRadioButton) {
            distanceLabel.setText("Distance (kilometers):");
            avgspeedLabel.setText("Avg. Speeg (kph): ");  

            text = String.valueOf(
                     MetricConverter.milesToKilometers(Double.valueOf(text)));
        } else if (event.getSource() == milesRadioButton) {
            distanceLabel.setText("Distance (miles): ");
            avgspeedLabel.setText("Avg. Speeg (mph): ");
        }

        distanceText.setText(text);
    }
}
于 2013-04-12T10:25:59.437 に答える
0

ただ:

distanceText.setText(String.valueOf(MetricConverter.milesToKilometers(fileData[selectedRow + 1][selectedCol + 1])));

またはマイルの場合:

distanceText.setText(String.valueOf(MetricConverter.kilometersToMiles(fileData[selectedRow + 1][selectedCol + 1])));

もちろん、これは fileData に double 値が含まれている場合にのみ機能します。

于 2013-04-12T10:12:54.503 に答える