Null In JComboBox Стоп Стрелка Использование ключа - PullRequest
4 голосов
/ 21 января 2011

В приведенном ниже коде есть ошибка. После загрузки JFrame нажмите вкладку, чтобы сфокусироваться на JComboBox, и попробуйте нажать клавишу «вниз». Это ничего не делает.

Вставка Null в позицию 0 вызывает это. Тем не менее, я все еще хотел бы иметь возможность выбрать Null. Я не хочу заставлять пользователя выбирать опцию.

package kobalt.test.colin;

import java.awt.*;
import javax.swing.*;

public class ColinTest extends JFrame {

    private JTextField mTextField;
    private JComboBox  mComboBox;

    public ColinTest(){
      setLayout(new BorderLayout());

      mTextField = new JTextField("Something");
      mComboBox = new JComboBox(new String[]{"One", "Two"});
      mComboBox.insertItemAt(null, 0); //this line causes the bug

      add(mTextField, "North");
      add(mComboBox, "South");

      pack();
      setVisible(true);
    }


    public static void main(String[] argv) {
      new ColinTest();
    }
}

Есть ли что-то, что я могу переопределить в JComboBox, чтобы исправить это поведение?

Мне не нравится вставлять пустую строку в позицию 0, так как мне придется иметь дело с этим повсюду.

Возможно использование объекта Wrapping, но я бы предпочел расширить, а затем переопределить что-то в JComboBox.

Ответы [ 2 ]

2 голосов
/ 21 января 2011

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

Но вы можете попробовать переопределить getSelectedIndex, чтобы он возвращал 0 вместо -1, если объект нулевой.Также переопределите selectedItemChanged, чтобы не проверять наличие нулей.Кажется, что работает следующее, но могут быть и другие методы, которые тоже необходимо переопределить:

JComboBox mComboBox = new JComboBox(new String[]{"One", "Two"}){
    @Override
    public int getSelectedIndex() {
        Object sObject = dataModel.getSelectedItem();
        int i,c;
        Object obj;

        if(sObject==null){
            return 0;
        }
        for ( i=0,c=dataModel.getSize();i<c;i++ ) {
            obj = dataModel.getElementAt(i);

             if ( obj != null && obj.equals(sObject) )
                return i;
        }
        return -1;
    }

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

Однако вместо того, чтобы делать вышеописанное, я бы рекомендовал использовать объект-оболочку .Например:

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

JComboBox cb = new JComboBox(new StringWrapper[]{ 
            new StringWrapper("one"),
            new StringWrapper("two"),
            new StringWrapper("three")});
cb.insertItemAt(new StringWrapper(null), 0); 
1 голос
/ 21 января 2011

Создание комбобокса таким образом создает DefaultComboBoxModel, который основан на Vector. Так что нули не могут быть вставлены. Вы можете попытаться реализовать ComboBoxModel с поддержкой нулей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...