大家 我对 Java GUI 很陌生,我在使用 JComboBox 时遇到了问题,当我从组合框中删除所有项目以刷新它时它会触发,这是一个问题,因为我正在获取选定的项目详细信息并用它们填充文本框,以便在此时触发时我得到一个空指针。是否有任何简单(ish)的方法可以在组合框上使用方法,该方法在更改所选项目时调用,而不仅仅是在组合框内容更改时调用?
法典
组合框当前方法
private void customerComboActionPerformed(java.awt.event.ActionEvent evt) {
setDetails();
}
设置组合框中的项目的方法
public void setCustomers()
{
customerCombo.removeAllItems();
for (Customer curr : Main.getNewCustomerList().getCustomers())
{
customerCombo.addItem(curr);
}
}
设置详细信息的方法
public void setDetails()
{
Customer selected = (Customer) customerCombo.getSelectedItem();
forenameText.setText(selected.getForename());
surnameText.setText(selected.getSurname());
costperkgText.setText(String.valueOf(selected.getDeliveryCost()));
line1Text.setText(String.valueOf(selected.getColAddress().getAddressLine1()));
line2Text.setText(String.valueOf(selected.getColAddress().getAddressLine2()));
cityText.setText(String.valueOf(selected.getColAddress().getCity()));
postcodeText.setText(String.valueOf(selected.getColAddress().getPostcode()));
}
您没有考虑没有选择的情况。
public void setDetails()
{
Customer selected = (Customer) customerCombo.getSelectedItem();
if (selected != null)
{
// there is a selection so use it
}
else
{
// for example, clear the text boxes
}
}
我们还希望更改组合框的内容可能会更改其选择,因此我们不应忽略它。
我喜欢设置一个标志。 关键是确保标志不会卡在 false 上。
private volatile boolean fire = true;
public void setItems(Object[] items) {
try {
fire = false; // Don't fire updates
updateItems(items);
} finally {
fire = true; // always reset no matter what!
}
}
private JComboBox create() {
JComboBox cb = new JComboBox();
cb.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
if(fire) {
notifyListeners();
}
}
});
}
您必须确保这不会被多个线程调用,但由于 Swing 不是线程安全的,因此无论如何都应该发生这种情况。