JComboBox更改其他JComboBoxes(多次)错误

时间:2014-04-10 19:21:12

标签: java jcombobox

需要Java中的ComboBoxes帮助。通过类似的问题看,发现一个有点相关,但不是我正在处理的问题。

我需要将某些数组加载到组合框中,具体取决于在宝贵的组合框中选择的项目:

考虑在医疗中心完成一些手术:选择一个程序 - >获取医生列表,选择医生 - >获取可用时间列表等。

单一选择工作正常(无论是"程序 - >医生名单"或"医生名单 - >他们的工作时间"),但是,做这些变化的不止一个并不起作用。

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


}

我迫切需要任何建议和可能的解决方案,我倾向于认为它与行动听众有关,因为方法确实有效,但我不知所措,因为我无法确定它是什么。

编辑:实际的代码应该可以工作,似乎没有其他文件留下的不需要的东西。 注意:这适用于GUI,只需在main()中启动它:)

2 个答案:

答案 0 :(得分:0)

您似乎没有使用组合框的数据模型。数据模型控制项目的内部列表。有关详细信息,请查看this

答案 1 :(得分: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。你应该选择其中一个。