2013-05-26 3 views
3

Я пытаюсь установить setSelectedItem из JComboBox в конструкторе моего класса JPanel сразу после заполнения combobox.JComboBox setSelectedItem не работает

У меня установлено значение для текстового поля, но я не могу понять, почему setSelectedItem, похоже, не работает. Есть идеи?

public StudentProfilePanel(StudentInfo si) { 

     yesButton.setBounds(50, 346, 69, 40); 
     noButton.setBounds(121, 346, 56, 40); 
     this.add(yesButton); 
     this.add(noButton); 
     setLayout(null); 
     comboBoxYear.setModel(new DefaultComboBoxModel(years())); 
     comboBoxYear.setBounds(202, 365, 62, 23); 
     if(si.birthdate!=null){ 
      //System.out.println("year value : ["+dateofbirth(si.birthdate)[2]+"]"); 
      comboBoxYear.setSelectedItem(dateofbirth(si.birthdate)[2]); 

     } 

     add(comboBoxYear); 
     comboBoxMonth.setModel(new DefaultComboBoxModel(new String[]{"01","02","03","04","05","06","07","08","09","10","11","12"})); 
     comboBoxMonth.setBounds(285, 365, 56, 23); 

     //set month value 
     if(si.birthdate!=null){ 
      //comboBoxMonth.setSelectedItem(dateofbirth(si.birthdate)[1]); 
      comboBoxMonth.setSelectedItem("04"); 
      System.out.println("month value : ["+dateofbirth(si.birthdate)[1]+"]"); 
     } 
     add(comboBoxMonth); 
     comboBoxDay.setModel(new DefaultComboBoxModel(days())); 
     comboBoxDay.setBounds(351, 365, 54, 23); 
     if(si.birthdate!=null){ 
      //comboBoxDay.setSelectedItem(dateofbirth(si.birthdate)[0]); 
      comboBoxDay.setSelectedItem(dateofbirth(si.birthdate)[0]); 
     } 
     add(comboBoxDay); 

     textFieldFirstName = new JTextField(); 
     textFieldFirstName.setBounds(21, 321, 171, 21); 
     add(textFieldFirstName); 
     textFieldFirstName.setColumns(10); 
     // set the value of first name 
     textFieldFirstName.setText(si.firstName); 

     textFieldLastName = new JTextField(); 
     textFieldLastName.setBounds(242, 321, 163, 21); 
     add(textFieldLastName); 
     textFieldLastName.setColumns(10); 
     //set the value of the last name 
     textFieldLastName.setText(si.lastName); 

     JPanel panelPersonPhoto = new ImagePanel(
       "C:\\Users\\MDJef\\Pictures\\Wallpaper\\General\\11.jpg"); 
     panelPersonPhoto.setBorder(new TitledBorder(null, "", 
       TitledBorder.LEADING, TitledBorder.TOP, null, null)); 
     panelPersonPhoto.setBounds(21, 20, 384, 291); 
     add(panelPersonPhoto); 
    } 

Большое спасибо.

вспомогательные методы, которые я использовал

// jf : helper method 
    public String[] years() { 
     String[] results = new String[90]; 
     for (int i = 0; i < 90; i++) { 
      results[i] = Integer.toString(1900 + i); 
     } 
     return results; 
    } 

    // jf : helper method 
    public String[] months() { 
     String[] results = new String[12]; 
     for (int i = 0; i < 12; i++) { 
      results[i] = Integer.toString(i + 1); 
     } 
     return results; 
    } 

    // jf : helper method 
    public String[] days() { 
     String[] results = new String[31]; 
     for (int i = 0; i < 31; i++) { 
      results[i] = Integer.toString(i + 1); 
     } 
     return results; 
    } 

    // jf : helper method 
    public String[] dateofbirth(String dob) { 
     String[] tokens = dob.split("-"); 
     return tokens; 
    } 
+0

У какой из комбобоксов есть проблема? Год, месяц или день? –

+0

years() возвращает массив строк лет, все эти комбобокс имеют проблемы, но давайте посмотрим на comboBoxMonth на данный момент. С вашим решением я теперь могу установить значение для comboboxmonth, но он снова не удался, когда я попытаюсь сделать это внутри аргумента if (si.birthdate! = Null) {. –

+0

Из того, что я могу сказать, кажется, что существует несоответствие между значениями модели combo box и возвращаемым методом 'dateofbirth' ... вы можете либо добавить примерный вывод (то есть значение' Date', и возвращенный вывод этого метод) или сам метод – MadProgrammer

ответ

1

При вызове comboBoxMonth.setSelectedItem("04"); вы пытаетесь выбрать вновь созданную строку, которая не совпадает с той, которая находится в вашем JComboBox. Ergo не выбирается.

Вы можете попробовать что-то вроде этого, вместо:

String[] months = new String[] {"01","02","03","04","05","06","07","08","09","10","11","12"}; 
comboBoxMonth.setModel(new DefaultComboBoxModel(months)); 

comboBoxMonth.setSelectedItem(months[3]); 

Edit: Попробуйте это. Вместо этого он использует индекс элемента. Просто убедитесь, что вы добавили месяцы для массива.

String[] months = new String[] {"01","02","03","04","05","06","07","08","09","10","11","12"}; 
comboBoxMonth.setModel(new DefaultComboBoxModel(months)); 

if(si.birthdate!=null) 
{ 
    comboBoxMonth.setSelectedIndex(Integer.parseInteger(dateofbirth(si.birthdate)[1]) - 1); 
} 
+0

С вашим решением теперь я могу установить значение для comboboxmonth, но он снова не удался, когда я попытаюсь сделать это внутри if (si.birthdate! = null) {статья –

+0

Получите ли вы результат 'System.out.println (" month value: ["+ dateofbirth (si.birthdate) [1] +"] ");' на вашей консоли при запуске программы? –

+1

* «Вы пытаетесь выбрать только что созданную строку, которая не равна той, что находится в вашем JComboBox» * - Мой простой тест не показал эту проблему ... – MadProgrammer

1

не связано с вашей проблемой, но:

yesButton.setBounds(50, 346, 69, 40); 
noButton.setBounds(121, 346, 56, 40); 
setLayout(null); 

Не используйте нулевой макет и SetBounds (...). Swing был разработан для использования с Менеджером макетов. В конечном итоге вы сэкономите время.

if(si.birthdate!=null){ 

Не обращайтесь к переменным в своем классе напрямую. Создайте метод getter для доступа к свойствам вашего класса.

//System.out.println("year value : ["+dateofbirth(si.birthdate)[2]+"]"); 
comboBoxYear.setSelectedItem(dateofbirth(si.birthdate)[2]); 

Не всегда пытайтесь принудительно ввести код в единую инструкцию. Вместо того, чтобы сделать что-то вроде:

String birthdate = dateofbirth(si.birthdate[2]); 
System.out.println("year value : [" + birthdate +"]"); 
comboBoxYear.setSelectedItem(birthdate); 

Это помогает с отладкой, потому что теперь вы знаете, что переменная вы показываете это та же переменная, которую вы пытаетесь использовать в методе setSelectedItem(). Это позволяет печатать текст дважды и избегать ввода ошибок.

2

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

Например, лет String с 1900 по 1990 год, но если я поставлю значение 72, то в соответствующем поле не будет подходящего значения.

Равным образом, ваши days и months методы возвращаются только значения, которые не проложенный (т.е. 01), где, как, в вашем коде, вы пытаетесь установить значение, используя подбитый значение (т.е. 04), то есть там не соответствует значению ...

У вас есть несколько вариантов ...

Вы могли бы ...

Преобразовать все значения к int, а это означает, что значения в поле со списком, просто int s. Затем вам нужно будет преобразовать значения даты в int.

Это сделало бы ваш помощник код выглядеть как ...

public int[] years() { 
    int[] results = new String[90]; 
    for (int i = 0; i < 90; i++) { 
     results[i] = 1900 + i; 
    } 
    return results; 
} 

public int[] months() { 
    int[] results = new String[12]; 
    for (int i = 0; i < 12; i++) { 
     results[i] = i + 1; 
    } 
    return results; 
} 

public int[] days() { 
    int[] results = new String[31]; 
    for (int i = 0; i < 31; i++) { 
     results[i] = i + 1; 
    } 
    return results; 
} 

public int[] dateofbirth(String dob) { 
    int[] tokens = dob.split("-"); 
    int[] values = new int[tokens.length]; 
    for (int index = 0; index < tokens.length; index++) { 
     values[index] = Integer.parse(tokens[index]); 
    } 
    return index; 
} 

Лучшее решение

Было бы использовать JSpinner, который будет заниматься вопросами, дата прокатки и проверки автоматически ,

Заканчивать Using Standard Spinner Models and Editors

0

Для других разработчиков с той же проблемой: Пристальный взгляд в реализацию setSelectedItem(Object anObject) от JComboBox может помочь:

public void setSelectedItem(Object anObject) { 
    Object oldSelection = selectedItemReminder; 
    Object objectToSelect = anObject; 
    if (oldSelection == null || !oldSelection.equals(anObject)) { 

     if (anObject != null && !isEditable()) { 
      // For non editable combo boxes, an invalid selection 
      // will be rejected. 
      boolean found = false; 
      for (int i = 0; i < dataModel.getSize(); i++) { 
       E element = dataModel.getElementAt(i); 
       if (anObject.equals(element)) { 
        found = true; 
        objectToSelect = element; 
        break; 
       } 
      } 
      if (!found) { 
       return; 
      } 
     } 

... 

В цикле ваш объекта сравниваются с объектом данныхModel с конкретным типом E. При реализации equals() из String вы можете видеть проверку класса/интерфейса, длины и каждого символа один за другим. Это означает, что наш объект должен иметь одинаковый тип, и все символы должны быть одинаковыми!

public boolean equals(Object anObject) { 
     if (this == anObject) { 
      return true; 
     } 
     if (anObject instanceof String) { 
      String anotherString = (String)anObject; 
      int n = value.length; 
      if (n == anotherString.value.length) { 
       char v1[] = value; 
       char v2[] = anotherString.value; 
       int i = 0; 
       while (n-- != 0) { 
        if (v1[i] != v2[i]) 
         return false; 
        i++; 
       } 
       return true; 
      } 
     } 
     return false; 
    } 

И это самая раздражающая часть if (anObject.equals(element)) в setSelectedItem! Вы не можете переопределить метод equals из вашего элемента. Например, StudentInfo и сравните с ним другие типы, такие как строки или целые числа. Простой пример. Вы реализуете combobox как этот JComboBox<StudentInfo>, и вы хотите выбрать ученика с int id = 2;. Поэтому сейчас сравнивается Integer с StudentInfo. Здесь вы должны отменить равные с Integer ...

Мое предложение поменять местами. Создайте собственный класс, добавьте boolean selectingItem и переопределите setSelectedItem(Object anObject) и contentsChanged(ListDataEvent e) (этот метод один к одному). Тем не менее, у меня были побочные эффекты в одном проекте ...

Смежные вопросы