2014-04-10 2 views
0

нужна помощь с ComboBoxes в Java. Просмотрел похожие вопросы, нашел одно слегка связанное, но не то, с чем я столкнулся.JComboBox с другой ошибкой JComboBoxes (несколько раз)

нужно загрузить определенные блоки в комбо-боксы в зависимости от выбранных элементов в драгоценном поле со списком:

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

Один выбор работает отлично (будь то «процедура-> список врачей» или «список врачей-> их рабочее время») но выполнение более чем одного из этих изменений не работает.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.Arrays; 

public class GUIbandymas extends JFrame { 


String[] start={"Choose","Choice1", "Choice2"}; 
String[] Option1={"Choose","A1"}; 
    String[] Option2={"Choose","A2","A3"}; 
    String[] Option3={"Choose","a","b","c","d"}; 
    String[] Option4={"Choose","1","2","3","4"}; 
    String[] Option5={"Choose","I","II","III","IV"}; 



String[] pradinis={"Pasirinkite Laika"}; 
String[] p1={"Pasirinkite Gydytoja"}; 
static double kainaR; 
    static double kainaK; 
    JComboBox<String> G=new JComboBox<String>(p1); 
    JComboBox<String> proc; 
    JComboBox<String> laikas=new JComboBox<String>(pradinis); 
    JComboBox<String> minutes; 
    JButton button = new JButton ("Registuotis"); 
JLabel label = new JLabel("Moketi uz vizita"); 
JLabel suma = new JLabel(); 



public GUIbandymas() throws Exception { 


     setValueProc(start); 
     frame(); 


} 


public void frame() 
{ 
    JFrame frame = new JFrame(); 
    frame.setVisible(true); 
    frame.setSize(500,300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel panel = new JPanel(); 
    panel.add(proc); 
    panel.add(G); 
    panel.add(laikas); 
    panel.add(button); 
    button.setEnabled(false); 


    //panel.add(minutes); 
    frame.add(panel); 

    panel.add(label); 
    panel.add(suma); 


     proc.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) { 
     if(proc.getSelectedItem().toString().equals("Choice1")) 
     { 
      setGyd(Option1); 
     } 
     if(proc.getSelectedItem().toString().equals("Choice2")) 
     { 
      setGyd(Option2); 
     } 
    } 
}); 


G.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent a) { 

      if(G.getSelectedItem().toString().equals("A1")) 
      { 
       setLaikas(Option3); 
      } 
      if(G.getSelectedItem().toString().equals("A2")) 
      { 
       setLaikas(Option4); 
      } 
      if(G.getSelectedItem().toString().equals("A3")) 
      { 
       setLaikas(Option5); 
      } 

    } 

});//JComboBox 



} 

public void setGyd(String[] s) 
{ 
    G.removeAllItems(); 
    for(int i=0; i<s.length; i++) 
    { 
     G.addItem(s[i]); 
    } 



} 



public void setValueProc(String[] sarasas) 
{ 
    proc=new JComboBox<String>(sarasas); 

} 

public void setLaikas(String[] sarasas) 
{ 

    laikas.removeAllItems(); 
    for(int i=0; i<sarasas.length; i++) 
    { 
     laikas.addItem(sarasas[i]); 
    }  
} 


} 

Im в остро нуждаются в каких-либо предложений и возможных исправлений, IM склонен думать, что это имеет какое-то отношение слушателей действий, так как методы работают, но им в убыток, так как я не могу определить, что это ,

EDITED: фактический код должен работать, кажется, что ненужных вещей из других файлов осталось. ПРИМЕЧАНИЕ: это работа с графическим интерфейсом, просто запустите его в вас main() :)

+0

На это гораздо легче ответить, если вы предоставите рабочий автономный пример, то есть что-то, что можно выполнить и протестировать, а не только проверять код. Вы также опустили внедрение для setBoxNValue (..), что весьма важно для поведения, которое вы хотите. – Steinar

+0

отредактирует мой OP со всем кодом, однако из-за того, что im использует данные, считанные из файлов, плохо передает предопределенные массивы :) – user225827

+0

Если вы прокомментируете G.addActionListener ... код будет (несколько) работать, то же самое с proc.addActionListener. ...(хотя JComboBox proc, нужно будет инициировать со значениями A1, A2 и A3, чтобы проверить, правильно ли он работает, что он делает), однако оба они вместе ... – user225827

ответ

0

Хотя мне не очень нравится подход if-else, который вы используете, он должен работать нормально. Я согласен с предложением rrirower о том, что вам следует вместо этого использовать модель данных. Особенно, если у вас много выбора, так как код становится довольно грязным.

Проблема с вашим кодом заключается в том, что вы переходите в NullPointerException при перестройке элементов списка со списком. Причиной этого является то, что при удалении/добавлении элементов вызывается G.actionPerformed(). После того, как вы удалите все элементы (перед тем, как приступить к добавлению новых), G.getSelectedItem() вернет значение null.

Если код немного более оборонительно, то он работает, как ожидалось:

proc.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Object selectedItem = proc.getSelectedItem(); 
      if ("Choice1".equals(selectedItem)) { 
       setGyd(Option1); 
      } 
      if ("Choice2".equals(selectedItem)) { 
       setGyd(Option2); 
      } 
     } 
    }); 
    G.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent a) { 
      Object selectedItem = G.getSelectedItem(); 
      if ("A1".equals(selectedItem)) { 
       setLaikas(Option3); 
      } 
      if ("A2".equals(selectedItem)) { 
       setLaikas(Option4); 
      } 
      if ("A3".equals(selectedItem)) { 
       setLaikas(Option5); 
      } 
     } 
    });//JComboBox 

Вместо проверки нулевой х, я просто щелкал равных и пропустили ненужный toString() (они уже струнные, вот что вы туда попали).

Другое дело, мое домашнее животное, пожалуйста, следуйте нормальному соглашению с кодом java для всех ваших имен классов, полей и методов. Вы почти там, но Option1 и т.д. должны начинаться с строчной буквы. G должно, вероятно, иметь более описательное имя, а также начинать с нижнего регистра.

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

+0

Спасибо! Я уже консультировался с преподавателями в моем университете об этом и получил некоторую помощь в разработке решения, использующего DefaultComboBoxModel. Тем не менее, спасибо за помощь :) – user225827

0

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

+0

исследование ComboBoxModel уже, спасибо за предложение:) – user225827

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