Я добавил динамическое обновление, используя removeAllItems () и addItem ().После этого все пошло не так.Что случилось и как я могу это исправить? - PullRequest
0 голосов
/ 22 декабря 2018

Я только что протестировал метод изменения списка JComboBox, удалив, а затем добавив элементы (см. Метод public void SetComboBoxOptions).После добавления указанного функционала преобразование массы не удалось.Я считаю, что индексы как-то не относятся к правильным вещам.Что я могу сделать?

Я использую JDK 11.0.1 на ноутбуке с Windows 10.Я уже пытался изменить реализацию функции public double weightConvert, и она не работает.

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

class UnitConverter extends JFrame implements ActionListener
{
    JPanel grid = new JPanel(new GridLayout(2, 2));
    Container contentPane = getContentPane();
    String[] weightUnits = {"kg", "g", "mg", "lb", "oz", "gr"};
    String[] distanceUnits = {"km", "m", "cm", "mm", "mi", "yd", "ft",
    "in"};
    String[] types = {"Mass", "Distance"};
    DefaultComboBoxModel weight = new
            DefaultComboBoxModel(weightUnits);
    DefaultComboBoxModel distance = new
            DefaultComboBoxModel(distanceUnits);
    // selector boxes
    JComboBox box1 = new JComboBox(weightUnits);
    JComboBox box2 = new JComboBox(weightUnits);
    JComboBox box3 = new JComboBox(types);
    // text fields
    JTextField field1 = new JTextField(20);
    JTextField field2 = new JTextField(20);
    // buttons
    JButton button1 =  new JButton("CONVERT");
    public UnitConverter()
    {
        //creating window
        super("Unit Converter"); // calls javax.swing.JFrame
        constructor setting title
        setSize(500, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        //adding action listeners
        button1.addActionListener(this);
        box3.addActionListener(this);
        //putting window together
        grid.add(box1);
        grid.add(field1);
        grid.add(box2);
        grid.add(field2);
        contentPane.add("Center", grid);
        contentPane.add("North", box3);
        contentPane.add("East", button1);
    }
    public void SetComboBoxOptions(String[] stuff, JComboBox box)
    {
        box.removeAllItems();
        for (int i = 0; i < stuff.length; i++)
        {
            box.addItem(stuff[i]);
        }
    }
    public double weightConvert(double in, String from, String to)
    {
        double result = in;
        switch (from)
        {
        case "kg": result *= 1000;
        case "g": result *= 1000;
        case "mg": result *= 1; break;
        case "lb": result *= 16;
        case "oz": result *= 437.5;
        case "gr": result *= 64.79891; break;
        default: result *= 0; break;
        }
        switch (to)
        {
        case "kg": result /= 1000;
        case "g": result /= 1000;
        case "mg": result /= 1; break;
        case "lb": result /= 16;
        case "oz": result /= 437.5;
        case "gr": result /= 64.79891; break;
        default: result *= 0; break;
        }
        return result;
    }
    public double distanceConvert(double in, String from, String to)
    {
        double result = in;
        switch (from)
        {
        case "km": result *= 1000;
        case "m": result *= 100;
        case "cm": result *= 10;
        case "mm": result *= 1; break;
        case "mi": result *= 1760;
        case "yd": result *= 3;
        case "ft": result *= 12;
        case "in": result *= 25.4; break;
        default: result *= 0; break;
        }
        switch (to)
        {
        case "km": result /= 1000;
        case "m": result /= 100;
        case "cm": result /= 10;
        case "mm": result /= 1; break;
        case "mi": result /= 1760;
        case "yd":   result /= 3;
        case "ft":   result /= 12;
        case "in":   result /= 25.4; break;
        default: result *= 0; break;
        }
        return result;
    }
    @Override
    public void actionPerformed (ActionEvent event)
    {
        if (event.getSource() == button1)
        {
            switch (box3.getSelectedIndex())
            {
            case 0: field2.setText(Double.toString(weightConvert(Double.parseDouble(field1.getText()), weightUnits[box1.getSelectedIndex()], weightUnits[box2.getSelectedIndex()])));
            case 1: field2.setText(Double.toString(distanceConvert(Double.parseDouble(field1.getText()), distanceUnits[box1.getSelectedIndex()], distanceUnits[box2.getSelectedIndex()])));
            }
        }
        if (event.getSource() == box3)
        {
            switch (box3.getSelectedIndex())
            {
            case 0: SetComboBoxOptions(weightUnits, box1);
            SetComboBoxOptions(weightUnits, box2); break;
            case 1: SetComboBoxOptions(distanceUnits, box1);
            SetComboBoxOptions(distanceUnits, box2); break;
            default: SetComboBoxOptions(weightUnits, box1);
            SetComboBoxOptions(weightUnits, box2); break;
            }
        }
    }
    public static void main (String[] args)
    {
        UnitConverter XD = new UnitConverter();
    }
}

Я ожидал, что преобразование 20 кг даст около 44 фунтов. Однако я вижу, что 20 кг дают 2,0E7 фунтов.

1 Ответ

0 голосов
/ 22 декабря 2018

Чтобы исправить небольшую проблему, добавьте перерыв:

case 0: field2.setText(Double.toString(weightConvert(Double.parseDouble(field1.getText()), weightUnits[box1.getSelectedIndex()], weightUnits[box2.getSelectedIndex()])));
        break; //missing

Для лучшей реализации отметьте важные комментарии: Всегда хорошая идея отделить графический интерфейс от логической части кода

Использовать разрыв;оператор в конце каждого блока case , что означает переосмысление логики преобразований.

Простая реализация преобразования может выглядеть следующим образом:

class Convertor{

    private static final double KG_TO_GRAM = 1000, LBS_TO_GRAM = 453.592;

    private double value;
    public Convertor(double value) {
        this.value = value;
    }

    Convertor kgToGr(){
        value *= KG_TO_GRAM;
        return this;
    }

    Convertor grToKg(){
        value /= KG_TO_GRAM;
        return this;
    }

    Convertor lbToGr(){
        value /= LBS_TO_GRAM;
        return this;
    }

    Convertor grToLb(){
        value /= LBS_TO_GRAM;
        return this;
    }

    double getValue() {return value;}
} 

Тестирование с помощью

 System.out.println(new Convertor(20).kgToGr().grToLb().getValue());

выводит ожидаемое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...