我要做的是创建2个JComboBox和2个JTextField框。我需要能够在第一个JComboBox中编写使用温度类型(华氏温度,摄氏温度和开尔文温度)的代码,并将第一个温度类型转换为第二个JComboBox中选择的温度类型。这必须通过使用输入到第一个JTextField框中的任何数字(将是所选临时类型的初始值)并在第二个JTextField框中转换为新的温度类型来完成。这是我进步的程度......
当我运行测试时,我在第40行得到一个NullPointerException
,我不知道是否已正确格式化if语句中使用的double,以使新值再次显示为String in第二个JTextField框。在我编写所有其他if语句来处理所有其他场景之前,我正在寻找一些指示,如果我到目前为止所做的事情是正确的。
package temperatureConverter;
import java.awt.FlowLayout;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JFrame;
import javax.swing.JComboBox;
import javax.swing.JTextField;
public class TempConverter extends JFrame
{
private JComboBox firstComboBox;
private JComboBox secondComboBox;
private JTextField initialTemp;
private JTextField convertedTemp;
//private enum TempType { FAHRENHEIT, CELSIUS, KELVIN};
private static final String[] tempType = { "Fahrenheit", "Celsius", "Kelvin" };
public TempConverter()
{
super("Temperature Converter");
setLayout(new FlowLayout());
firstComboBox = new JComboBox(tempType);
firstComboBox.setMaximumRowCount(3);
firstComboBox.addItemListener(null);
add(firstComboBox);
secondComboBox = new JComboBox(tempType);
secondComboBox.setMaximumRowCount(3);
secondComboBox.addItemListener(null);
add(secondComboBox);
initialTemp = new JTextField ("", 10);
initialTemp.addActionListener(null);
add(initialTemp);
convertedTemp = new JTextField ("", 10);
convertedTemp.addActionListener(null);
add(convertedTemp);
}
String theInitialTempType = (String) firstComboBox.getSelectedItem();
String theTempTypeToConvertTo = (String) secondComboBox.getSelectedItem();
String theChosenTemp = initialTemp.getSelectedText();
String theNewTemp = convertedTemp.getSelectedText();
private class textHandler implements ItemListener
{
public void itemStateChanged (ItemEvent event)
{
double convertedNumberForTheChosenTemp = Double.parseDouble(theChosenTemp);
double convertedNumberForTheNewTemp = Double.parseDouble(theNewTemp);
//String string1 = "";
//String string2 = "";
if ( theInitialTempType == tempType[0] && theTempTypeToConvertTo == tempType[1] )
{
convertedNumberForTheNewTemp = (convertedNumberForTheChosenTemp - 32) * 5 / 9;
String result = String.valueOf(convertedNumberForTheNewTemp);
}
}
}
}
答案 0 :(得分:2)
String theInitialTempType = (String) firstComboBox.getSelectedItem();
此代码行位于创建字段的构造函数之外。这些属性在类的其他方法中使用,因此声明String theAttribute
必须在构造函数之外。
另一方面,实例的创建/初始化需要在创建其他字段后完成,因此在构造函数的末尾,theAttribute = anotherAttribute.getSelectedText();
但即使这样也不正确。这个阶段的字段是空的,所以尝试从它们计算结果是没有意义的。计算应由最终用户控制,并在行动时完成。查看ActionListener
- 可以将其添加到字段中并在 Enter
答案 1 :(得分:2)
由于您有两个JComboBox
个实例,因此example显示第一个组合中的选择如何更改第二个组合中显示的内容。例如,在第一个组合中选择Fahrenheit
会将第二个组合模型更改为仅显示Celsius
或Kelvin
。等
附录:正如@Andrew建议的那样,你必须将所有四个instance variables的初始化移动到构造函数中。这是我用来测试代码的main()
:
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
TempConverter f = new TempConverter();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
});
}