我刚刚测试了一种通过删除然后添加项目来更改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());
打印出预期值。