我正在使用JFrame
GUI来拖放元素,我正在使用组合框。下面是GUI。
单击按钮“按”时,它会将数字添加到组合框中,如下所示:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
for (int i = 0; i<10; i++) {
String str_rep = Integer.toString(i);
jComboBox1.addItem(str_rep);
}
jComboBox1.setSelectedItem(null);
}
将数字添加到组合框后,我将所选项设置为null,因为我不希望组合框在按下按钮后显示第一个元素。
然而,我目前面临的问题是我编码jLabel2
以显示基于组合框选择的内容,但是一旦按下“按下”按钮,标签会自动显示第一个数字,即使是0,我将组合框选中的项目设置为null
。
private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {
jLabel2.setText(jComboBox1.getSelectedItem().toString());
}
有没有什么办法可以阻止标签按下按钮后显示第一个数字?它应保留为标签,直到我从组合框中选择一个数字,然后它将更新为该数字。
在ComboBoxAndLabel
课上,我试图重现你的问题。
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.event.*;
public class ComboBoxAndLabel {
public static void main(String[] args) {
JLabel jLabel2 = new JLabel("jLabel2");
JComboBox<String> jComboBox1 = new JComboBox<>();
jComboBox1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jLabel2.setText(jComboBox1.getSelectedItem().toString());
}
});
JButton button = new JButton("Press");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i<10; i++) {
String str_rep = Integer.toString(i);
jComboBox1.addItem(str_rep);
}
jComboBox1.setSelectedItem(null);
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(button, BorderLayout.NORTH);
frame.getContentPane().add(jComboBox1, BorderLayout.CENTER);
frame.getContentPane().add(jLabel2, BorderLayout.SOUTH);
frame.setBounds(400, 300, 400, 300);
frame.setVisible(true);
}
}
当我运行上面的程序时,我在控制台中看到下面的错误(我猜你也得到这个错误)。
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ComboBoxAndLabel$1.actionPerformed(ComboBoxAndLabel.java:21)
at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1258)
at javax.swing.JComboBox.setSelectedItem(JComboBox.java:586)
at ComboBoxAndLabel$2.actionPerformed(ComboBoxAndLabel.java:35)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
这里的问题是,jComboBox1.addItem()
方法在组合框为空时设置所选项(参见DefaultComboBoxModel.addElement()
的源代码)。这就是为什么你不得不打电话给jComboBox1.setSelectedItem(null)
。
但是如果您使用jComboBox1.setModel()
而不是逐个添加项目,则不会自动设置所选项目。所以,你也不需要调用jComboBox1.setSelectedItem(null)
。你可以像这样改变jButton1ActionPerformed
:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
DefaultComboBoxModel<String> comboBoxModel = new DefaultComboBoxModel<>();
for (int i = 0; i<10; i++) {
String str_rep = Integer.toString(i);
comboBoxModel.addElement(str_rep);
}
jComboBox1.setModel(comboBoxModel);
}
完整可执行解决方
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.event.*;
public class ComboBoxAndLabelSolution {
public static void main(String[] args) {
JLabel jLabel2 = new JLabel("jLabel2");
JComboBox<String> jComboBox1 = new JComboBox<>();
jComboBox1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jLabel2.setText(jComboBox1.getSelectedItem().toString());
}
});
JButton button = new JButton("Press");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultComboBoxModel<String> comboBoxModel = new DefaultComboBoxModel<>();
for (int i = 0; i<10; i++) {
String str_rep = Integer.toString(i);
comboBoxModel.addElement(str_rep);
}
jComboBox1.setModel(comboBoxModel);
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(button, BorderLayout.NORTH);
frame.getContentPane().add(jComboBox1, BorderLayout.CENTER);
frame.getContentPane().add(jLabel2, BorderLayout.SOUTH);
frame.setBounds(400, 300, 400, 300);
frame.setVisible(true);
}
}