在JLabel中显示JComboBox选定的项目

时间:2019-04-27 01:59:23

标签: java swing jlabel jcombobox

我正在使用JFrame GUI拖放元素,目前正在使用组合框。下面是GUI。

enter image description here

单击“按下”按钮时,它将在组合框中添加数字,如下所示:

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

将数字添加到组合框中后,我将所选项目设置为空,因为我不想组合框显示第一个元素。一旦按下按钮。

但是,我目前面临的问题是我对jLabel2进行了编码,以显示根据组合框选择的内容,但是一旦按下“按”按钮,标签就会自动显示第一个即使我将组合框选择的项目设置为null,数字也是0。

private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {
    jLabel2.setText(jComboBox1.getSelectedItem().toString());
}    

enter image description here

一旦按下按钮,有什么办法可以防止标签显示第一个数字?在我从组合框中选择一个数字之前,它应该保留为标签,然后它将更新为该数字。

1 个答案:

答案 0 :(得分:0)

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