Отобразить выбранный элемент JComboBox в JLabel - PullRequest
0 голосов
/ 27 апреля 2019

Я использую JFrame 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);
 }

Как только числа добавляются в поле со списком, я присваиваю выбранному элементу значение null , потому что я не хотел поле со списком для отображения первогоэлемент после нажатия кнопки.

Однако проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что я кодировал jLabel2, чтобы отобразить то, что выбирается на основе поля со списком, но после нажатияПри нажатии на кнопку метка автоматически отображает первое число, равное 0, даже если я установил для выбранного поля со списком значение null.

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

enter image description here

Можно ли как-нибудь предотвратить отображение на этикетке первого номера после нажатия кнопки ? должно оставаться в качестве метки до тех пор, пока я не выберу число в поле со списком, тогда оно будет обновлено до этого числа.

1 Ответ

0 голосов
/ 27 апреля 2019

В 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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...