不用这么复杂,让所有的JComboBox加一个ActionListener就行了。如果某些JComboBox处理的事和其它的不同,只要(ActionEvent e) e.getsource == ?(你所要处理特殊事件的控件名)。
这样,所有的JComboBox都响应同一个功能。

解决方案 »

  1.   

    晕! 看错了, 以为是 JCheckBox研究一下
      

  2.   

    直接加时间感觉很麻烦,我会这样:第一个选 A 后直接替换第二个 JComboBox 对象, 它包含 A 能选的条目然后选 B 的话就替换另一个 B 对应的 JComboBox 刷新显示
    虽然这样多建几个对象,我觉得思路很清晰,实现也简单
    速度因改没什么影响
      

  3.   

    建议用xml来做,从xml文件中读取修改数据来做界面时,当改变xml文件时是不需要重新编译程序的。另外一种做法是我第一个JCombox添加所有的条目,余下的条目为空,在每个JCombox的监视器里添加代码位它的下一个JCombox添加条目项,再往下的设置为空。
      

  4.   

    首先给所有的combobox加上同一个itemChangeListener,用这个Listerer中evt.getSource()并转化成一个新的combobox实例,这就得到了当前那一个combobox被选取了,再用这个实例得到当前选择的项,再得到该选取的Model,从model中移去当前选择,再setModel给其它的combo,最后别忘了revalidate.-:)
      

  5.   

    这样行不行?自定义事件,每个ComboBox都监听这个事件。每个combobox都根据所收到的事件属性来决定自己的行为(比如修改自己的列表项)。这个事件必须包含事件源、所选项等属性。
      

  6.   

    我来试试啊!!
    String[] values  = new String[]{"A","B","C","D","E","F"};
    JComboBox combox1 = new JComboBox(values);
    JComboBox combox2 = new JComboBox();
    ......
    JComboBox[] coms = new JComboBox[]{ combox1,combox2,combox3,combox4,combox5 };for (int k=0;i<coms.length;k++)
    {
        coms[k].addActionListener(this);
    }
    public actionPerformed(ActionEvent e)
    {
       Obj aa = e.getSource();
       int i=0;
       for (;i<coms.length-1;i++)
          if (aa==coms[i])  break;
       if (i<coms.length)
       {
           Obj selvalue = coms[i].getSelectedItem();
           if (selvalue!=null)
           {
              int j=0;
              for (;j<values.length;j++)
               if (selvalue.equals(values[j]) break;
              for (;j<values.length;j++)
                coms[i+1].addItem(values[j+1]);          
           }
       }
    }
      

  7.   

    哦!!代码有点问题!!
    应该先删除 coms[i+1] 的所有项之后,再添加项!!coms[i+1].removeAllItems();
      

  8.   

    可能是我没有说清楚,上面几位高手似乎都没有说到点子上。其实我编的这个小程序,相当于一个图的遍历。举例说一下:假设有两地A,B,中间有很多条路可以有下列路径选择:A->C->D->E->B
    A->C->F->B
    A->D->G->B
    ......我希望求出每一条选择的路径上花费的时间。所以我给出一组JComboBox第一个只能选择A,第二个可以选择C,D……,当第二个选择C的时候,第三个JComboBox列出的选项只能是D,F,不能出现G,同样,当第二个选择D的时候,第三个列表中不能出现D,F,只能出现G……第一个第二个JComboBox好说,第三个JComboBox以后,JComboBox里边出现的选项就要和前一个的选择有关了,就是这里让我很挠头。
      

  9.   

    每个字母都有一组候选值。
    举例来说,A.next={C,D};C.next={D,F};D.next={G,……}……
    JComboBox里出现的选项就是他前面那个JComboBox所选字母的候选集。这样解决不知道行不行?
      

  10.   

    看我刚完成50%的代码,先申明第一个comboxbox一定要选A以外的其它的值,嘿嘿不然有问题正在弄,大家一块来想想就一定OK代码块:
    /*
     * Test.java
     *
     * Created on 2003年9月26日, 下午4:11
     */
    import javax.swing.*;
    import java.util.*;
    /**
     *
     * @author  sky
     */
    public class Test extends javax.swing.JFrame
    {
        private Hashtable h = null;
        /** Creates new form Test */
        public Test ()
        {
            h = new Hashtable(4);
            initComponents ();
            h.put ("cb1", cb1);
            h.put ("cb2", cb2);
            h.put ("cb3", cb3);
            h.put ("cb4", cb4);
        }
        
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        private void initComponents()
        {
            cb1 = new javax.swing.JComboBox();
            cb2 = new javax.swing.JComboBox();
            cb3 = new javax.swing.JComboBox();
            cb4 = new javax.swing.JComboBox();        getContentPane().setLayout(null);        addWindowListener(new java.awt.event.WindowAdapter()
            {
                public void windowClosing(java.awt.event.WindowEvent evt)
                {
                    exitForm(evt);
                }
            });        cb1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "A", "B", "C", "D" }));
            cb1.addActionListener(new java.awt.event.ActionListener()
            {
                public void actionPerformed(java.awt.event.ActionEvent evt)
                {
                    cb1ActionPerformed(evt);
                }
            });        getContentPane().add(cb1);
            cb1.setBounds(30, 30, 190, 27);        cb2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "A", "B", "C", "D" }));
            cb2.addActionListener(new java.awt.event.ActionListener()
            {
                public void actionPerformed(java.awt.event.ActionEvent evt)
                {
                    cb2ActionPerformed(evt);
                }
            });        getContentPane().add(cb2);
            cb2.setBounds(30, 60, 190, 25);        cb3.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "A", "B", "C", "D" }));
            cb3.addActionListener(new java.awt.event.ActionListener()
            {
                public void actionPerformed(java.awt.event.ActionEvent evt)
                {
                    cb3ActionPerformed(evt);
                }
            });        getContentPane().add(cb3);
            cb3.setBounds(30, 90, 190, 25);        cb4.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "A", "B", "C", "D" }));
            cb4.addActionListener(new java.awt.event.ActionListener()
            {
                public void actionPerformed(java.awt.event.ActionEvent evt)
                {
                    cb4ActionPerformed(evt);
                }
            });        getContentPane().add(cb4);
            cb4.setBounds(30, 120, 190, 25);        pack();
        }    private void cb4ActionPerformed (java.awt.event.ActionEvent evt)
        {
            DefaultComboBoxModel c3 = (DefaultComboBoxModel)cb3.getModel ();
            c3.removeElement (cb4.getSelectedItem ());
        }    private void cb3ActionPerformed (java.awt.event.ActionEvent evt)
        {
            DefaultComboBoxModel c4 = (DefaultComboBoxModel)cb4.getModel ();
            c4.removeElement (cb3.getSelectedItem ());
        }    private void cb2ActionPerformed (java.awt.event.ActionEvent evt)
        {
            DefaultComboBoxModel c3 = (DefaultComboBoxModel)cb3.getModel ();
            DefaultComboBoxModel c4 = (DefaultComboBoxModel)cb4.getModel ();
            c3.removeElement (cb2.getSelectedItem ());
            c4.removeElement (cb2.getSelectedItem ());
        }    private void cb1ActionPerformed (java.awt.event.ActionEvent evt)
        {
            DefaultComboBoxModel c2 = (DefaultComboBoxModel)cb2.getModel ();
            DefaultComboBoxModel c3 = (DefaultComboBoxModel)cb3.getModel ();
            DefaultComboBoxModel c4 = (DefaultComboBoxModel)cb4.getModel ();
            c2.removeElement (cb1.getSelectedItem ());
            c3.removeElement (cb1.getSelectedItem ());
            c4.removeElement (cb1.getSelectedItem ());
        }
        
        /** Exit the Application */
        private void exitForm (java.awt.event.WindowEvent evt)
        {
            System.exit (0);
        }
        
        /**
         * @param args the command line arguments
         */
        public static void main (String args[])
        {
            new Test ().show ();
        }
        
        
        // Variables declaration - do not modify
        private javax.swing.JComboBox cb1;
        private javax.swing.JComboBox cb2;
        private javax.swing.JComboBox cb3;
        private javax.swing.JComboBox cb4;
        // End of variables declaration
        
    }
      

  11.   

    我想再多的combox以此类推,反正是越到后面就越少,不过还有一些问题要考虑,如选择的顺序问题,第一个选A的问题等等,只有各位运行完上面的代码后才知道,不过如果第一个不选A那么就符合楼主的要求
      

  12.   

    1.应用factory模式2.创建方法setJcomboBoxContent(Items items);3.对于每个路线得节点都有一个getItems(nodname)方法,其方法确定了他的子item的内容。
    如:对于节点A, getItems("A")将会得到一个items对象,表明items中含有D和C,这种逻辑是你自己定义的。
       getItems("C")会得到items含有D,F4.当点击jcombox选中A时,下一个JComboBox就会调用setJcomboBoxContent(node.getItems("A")),同时把自己的items赋值成C,D 同理继续下去。关键在于动态的getItems()过程要你自己根据需要来写。怎样通过C只能得到D,F那是你的计算算法问题了:)
      

  13.   

    factory模式,好像有道理先查查书先
      

  14.   

    我想我应该明白你的意思了,A->C->D->E->B
    A->C->F->B
    A->D->G->B
    ......从A开始,首先A存在:C、D,选C,出现D、F,选D,出现E,而不是E、G
    我想,关键在于选D时不出现G,其实这时只要判断一下D前面的路径是否相同就行了,不知道我理解是否正确:)我是方案是这样:
    先保存所有节点在一个二维数组,选A时,从第二层取父节点为A的C、D,判断前面所有路径是否相同,选C时,从第三层取父结点为C的D、F,判断前面所有路径是否相同,选D时,从第四层取父结点为D的E,判断前面所有路径是否相同、、、
    不知道我是否描述得清楚啊,呵呵,我只说一说我的思路,具体实现应该不难
      

  15.   

    这里判断父结点是否相同,因为可能存在这样的情况:
    A->C->D->E->B
    A->C->F->B
    A->D->G->B
    A->F->D->E->B
    ......第一条与第四条,第四层的E父结点都是D
      

  16.   

    上面错了,应该是这样说:
    这里判断"前面所有路径"是否相同,因为可能存在这样的情况:
    A->C->D->E->B
    A->C->F->B
    A->D->G->B
    A->F->D->E->B
    ......第一条与第四条,第四层的E父结点都是D
      

  17.   

    这个问题基本上解决了,感谢 ngk2030(天箭)给我提供了一个思路,也感谢大家的参与。请参与讨论的朋友去
    http://expert.csdn.net/Expert/topic/2306/2306311.xml?temp=.3287775
    先接一些分:)下面是我得程序,因为是第一次编这样的图形界面程序,肯定有不少冗余,错误,希望大家帮忙看看,一起研究研究。Node.javaimport java.util.Vector;public class Node{
      private String name;      //节点名称
      private int nNum;         //节点编号
      private Vector nNode;     //后续节点
    ……
    set,get方法
    ……
      public Vector init(){
        Vector temp = new Vector();

        Node node0 = new Node();
        node0.setName("A");
        node0.setNNum(0);
        node0.nNode=new Vector();
        node0.nNode.addElement(new Integer(1));  //C的num是1
        node0.nNode.addElement(new Integer(2));  //D的num是2
        node0.nNode.addElement(new Integer(3));  //E的num是3
        node0.nNode.addElement(new Integer(4));
        temp.add(node0);……
    把所有的节点都定义一遍
    ……    return temp;
      }
    }
      

  18.   

    MyTest.javaimport java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.util.Vector;class MyTest extends Frame{
      static JComboBox menu1,menu2,menu3,menu4; //最长的路径是四步
      static Vector nodes;  public MyTest() {
        nodes = new Vector();
        Node node = new Node();
        nodes = node.init();
        JPanel mainPanel = new JPanel();
        
        menu1 = new JComboBox();
        menu1.addItem("");
        menu1.addItem("A");
        menu1.addActionListener(new java.awt.event.ActionListener(){
          public void actionPerformed(java.awt.event.ActionEvent evt){
            menu1ActionPerformed(evt);
          }
        });    menu2 = new JComboBox();
        menu2.addItem(" ");     //这里好像必须要空一个格,否则生成的menu很难看
        menu2.addActionListener(new java.awt.event.ActionListener(){
          public void actionPerformed(java.awt.event.ActionEvent evt){
            menu2ActionPerformed(evt);
          }
        });……
    以此类推,menu3,menu4
    ……    mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.X_AXIS));
        mainPanel.add(new JPanel());
        mainPanel.add(menu1);
        mainPanel.add(new JLabel("-->"));
        mainPanel.add(menu2);
        mainPanel.add(new JLabel("-->"));
        mainPanel.add(menu3);
        mainPanel.add(new JLabel("-->"));
        mainPanel.add(menu4);
        mainPanel.add(new JPanel());    add(mainPanel);    addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
            dispose();
            System.exit(0);
          }
        });
      }  public static void main(String args[]) {
        System.out.println("Starting MyTest...");
        Cctcal mainFrame = new MyTest();
        mainFrame.setSize(1000, 500);
        mainFrame.setTitle("MyTest");
        mainFrame.setVisible(true);
      }  private void menu1ActionPerformed (java.awt.event.ActionEvent evt){
        if(!((String)menu1.getSelectedItem()).equals("")){
          for(int i=0;i<nodes.size();i++){
            if((((Node)nodes.get(i)).getName()).equals((String)menu1.getSelectedItem())){
       Node n = (Node)nodes.get(i);
    menu2.removeAllItems();
    menu2.addItem(" ");
      int temp = n.getNNodeSize();
      for(int j=0;j<temp;j++){
      Vector nextNode = n.getAllNode();
        int t = ((Integer)nextNode.get(j)).intValue();
      menu2.addItem(((Node)nodes.get(t)).getName());
             }
             break;
           }
          }
        }
      }  private void menu2ActionPerformed (java.awt.event.ActionEvent evt){
        if (!(menu2.getSelectedItem()==null)){
          if(!((String)menu2.getSelectedItem()).equals(" ")){
            for(int i=0;i<nodes.size();i++){
       if((((Node)nodes.get(i)).getName()).equals((String)menu2.getSelectedItem())){
         Node n = (Node)nodes.get(i);
         menu3.removeAllItems();
      menu3.addItem(" ");
         int temp = n.getNNodeSize();
         for(int j=0;j<temp;j++){
        Vector nextNode = n.getAllNode();
        int t = ((Integer)nextNode.get(j)).intValue();
        menu3.addItem(((Node)nodes.get(t)).getName());
         }
         break;
       }
           }
         }
       }
    }
      

  19.   

    想问题不要太死板,你这样构造JComboBox组是很复杂的.
    我建议你用另外的方式来替换你要实现的这个功能.
      

  20.   

    我的看法:你的这个问题,我认为最麻烦,最难,最有价值的部分是:你采用何种数据结构去描述的问题,还有就是在你的数据结构上你怎么实现的问题!我认为,你首先需要弄明白的并不是说怎么在jcombobox里面显示东西,而是弄清楚怎么得到jcombobox里面应该显示的数据!
    A->C->D->E->B
    A->C->F->B
    A->D->G->B就比如说上面的这个数据例子,当用户第一个选择了a之后,你怎么计算得到第二个就只能选择c,d呢?以此类推,只要你弄明白了这个,那么所有的问题都解决了!至于说jcombobox的事件监听之类的,我认为都不是问题!
      

  21.   

    to Afritxia(Leaocom) 是的,我一开始的时候试图采用JList,但是比较了一下以后,我觉得JComboBox好像更加符合要求。我这是第一次做图形界面编程的东西,对Java的图形组件还不是很熟,如果你觉得有其他的组件放在这里更合适的话,咱们可以探讨一下:)to  zhang21cnboy(事了抚衣去,不留身与名),如何得到JComboBox中的显示数据我觉得还是比较简单的。我在构造Node类的时候,在里边放了一个Vector,这个Vector就是存放该节点后续节点的编号。我的思路是这样的:第一个JComboBox上用户选择A以后(A是起始点,必须选),通过menu1.getSelectedItem()方法,得到选项值str,然后从nodes这个集合中选取name属性为str的那个node,然后从这个node中,调用getAllNode方法,返回存有该node后续节点编号的Vector,从这个Vector里边一个一个的取出后续节点的编号,然后把对应编号的node挑出来,用他们的name字段来构造下一个JComboBox
      

  22.   

    我做了一个,看看是不是这样的:import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.border.*;public class Map
            extends JFrame implements ItemListener
    {      public JPanel jPanel;      String[][] nodes =
                {
                      {"A", "C", "D", "E", "B"},
                      {"A", "C", "F", "B"},
                      {"A", "D", "G", "B"},
                      {"A", "F", "D", "E", "B"},
                      {"A", "D", "E", "G", "B"},
                      {"A", "E", "D", "C", "B"},
                      {"A", "C", "F", "G", "B"},
                      {"A", "F", "E", "C", "B"},
                };
          int rowCount = 8;
          int colCount = 5;      JComboBox[] jComboBoxs;      public Map()
          {
                try
                {
                      jbInit();
                }
                catch (Exception e)
                {
                      e.printStackTrace();
                }
          }
          public static void main(String[] args)
          {
                Map dragFrame = new Map();
                dragFrame.setSize(600, 500);
                dragFrame.setVisible(true);
          }
          private void jbInit() throws Exception
          {            jPanel = new JPanel();
                jPanel.setLayout(null);            jComboBoxs = new JComboBox[colCount];
                int x = 20, y = 30;
                for(int i=0; i<colCount; i++)
                {
                      jComboBoxs[i] = new JComboBox();
                      //jComboBoxs[i].addItemListener(this);
                      jComboBoxs[i].setName(String.valueOf(i));
                      jComboBoxs[i].setVisible(false);
                      jComboBoxs[i].setBounds(x,y, 100, 25);
                      jPanel.add(jComboBoxs[i]);
                      y += 30;
                }
                jComboBoxs[0].addItem("start");
                jComboBoxs[0].addItem("A");
                jComboBoxs[0].setVisible(true);
                for(int i=0; i<colCount; i++)
                {
                      jComboBoxs[i].addItemListener(this);
                }
                //System.out.println("row" + 1 + " length:" + nodes[1].length);            this.addWindowListener(new java.awt.event.WindowAdapter()
                {
                      public void windowClosing(WindowEvent e)
                      {
                            this_windowClosing(e);
                      }
                });            JScrollPane jScrollPane1 = new JScrollPane();
                this.setTitle("Map");
                jScrollPane1.getViewport().add(jPanel);
                this.getContentPane().add(jScrollPane1);
          }
          private void this_windowClosing(WindowEvent e)
          {
                System.exit(0);
          }      public void itemStateChanged(ItemEvent e)
          {
                JComboBox current = (JComboBox)e.getSource();
                String node = (String)current.getSelectedItem();            if(node == null)
                      return;            //当前选择的是第几层
                int col = Integer.parseInt((current).getName());            int nextCol = col + 1;            if(nextCol >= this.colCount)
                      return;            //重新选择将后面的JComboBox隐藏
                for(int i = 0; i< jComboBoxs.length; i++)
                {
                      if(i > col)
                      {
                            jComboBoxs[i].setVisible(false);
                            jComboBoxs[i].removeAllItems();
                            jComboBoxs[i].addItem("");
                      }
                }            //判断是否到终点
                if(node.equals("B"))
                {
                      return;
                }            jComboBoxs[nextCol].setVisible(true);
                resetComboBox(nextCol);      }      private void resetComboBox(int nextCol)
          {
                jComboBoxs[nextCol].removeAllItems();
                jComboBoxs[nextCol].addItem("");
                String currentNode = "";            for(int row=0; row<rowCount; row++)
                {
                      if(nextCol >= nodes[row].length)
                            continue;                  currentNode = nodes[row][nextCol];                  //是否已经在JComboBox中存在选项value
                      if(aleadyAdd(jComboBoxs[nextCol],currentNode))
                            continue;                  //判断父路径是否与当前路径相同
                      if(!isPathEqual(row, nextCol))
                            continue;                  jComboBoxs[nextCol].addItem(currentNode);
                }
          }      private boolean aleadyAdd(JComboBox jComboBox, String value)
          {
                for(int i = 0; i< jComboBox.getItemCount(); i++)
                {
                      if(jComboBox.getItemAt(i).equals(value))
                            return true;
                }
                return false;
          }      private boolean isPathEqual(int row, int nextCol)
          {
                if(nodes[row].length <nextCol)
                      return false;            JComboBox currentJComboBox = null;
                String currentNode = "";
                for (int i = 0; i < nextCol; i++)
                {
                      currentNode = nodes[row][i];
                      currentJComboBox = this.jComboBoxs[i];
                      if (!currentNode.equals(currentJComboBox.getSelectedItem()))
                            return false;
                }
                return true;
          }}