我使用 removeAllItems() 和 addItem() 添加了一个动态更新程序.事后出了问题.发生了什么以及如



我刚刚测试了一种通过删除然后添加项目来更改JComboBox列表的方法(请参阅方法 public void SetComboBoxOptions )。添加上述功能后,质量转换失败。我相信这些指数在某种程度上没有提到正确的事情。我能做什么?

我在Windows 10笔记本电脑上使用JDK 11.0.1。我已经尝试更改函数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 磅。

要解决您遇到的小问题,请添加一个中断:

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

为了更好地实现,请注意重要注释:
将 GUI 与代码的逻辑部分分开始终是一个好主意

在每个案例块的末尾使用 break; 语句,这意味着重新考虑转换逻辑。

一个简单的转换实现可能如下所示:

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());

打印出预期值。

最新更新