JComboBox - нет ItemEvents для нулевых предметов - PullRequest
2 голосов
/ 22 октября 2010

Кажется, что не выбрано или не выбрано ItemEvent сгенерировано для нулевого элемента в JComboBox.Как я могу изменить это?Изготовление предмета "" не вариант.

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;

public class ComboBoxTest {
   public static void main(String... args) {
       JComboBox cb = new JComboBox(new String[]{null, "one","two","three"});
       cb.addItemListener(new ItemListener(){
            public void itemStateChanged(ItemEvent e) {
                System.out.println(e);
            }
       });
       JOptionPane.showMessageDialog(null, cb);
  }
}

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

Нулевые объекты не будут играть хорошо в JComboBox.Например, метод getSelectedIndex поля со списком, который запускается при выборе элемента, вернет -1, если объект null.Также могут существовать другие методы, которые выполняют нулевые проверки и могут возвращать неверные результаты.

Если вам действительно нужна эта функциональность, было бы лучше использовать объекты-оболочки.Например:

class StringWrapper{
    final String s;
    public StringWrapper(String s){
        this.s=s;
    }
    @Override
    public String toString() {
        return s;
    }
}

final JComboBox cb = new JComboBox(new StringWrapper[]{ 
            new StringWrapper(null), 
            new StringWrapper("one"),
            new StringWrapper("two"),
            new StringWrapper("three")});
2 голосов
/ 22 октября 2010

ОК, я тупой ... Просто подкласс JComboBox и добавьте:

@Override
protected void selectedItemChanged() {
    fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
            selectedItemReminder,
            ItemEvent.DESELECTED));
    selectedItemReminder = dataModel.getSelectedItem();

    fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
            selectedItemReminder,
            ItemEvent.SELECTED));
}

Я все еще думаю, что описанное поведение JComboBox противоречиво и сбивает с толку ...

0 голосов
/ 09 сентября 2014

Если вам нужно действие, которое запускается один раз при выборе записи, включая ноль ...

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;

public class ComboBoxTest {
   public static void main(String... args) {
       final JComboBox cb = new JComboBox(new String[]{null, "one","two","three"});
       cb.addItemListener(new ItemListener(){
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED || cb.getSelectedItem() == null)
                System.out.println(e);
            }
       });
       JOptionPane.showMessageDialog(null, cb);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...