现有一个表格有三列,
第一列中绑定一个JComboBox
第二列中也绑定一个JComboBox
当我选中某一行中的第一列时,这一行的第二列中的JComboBox值要随着变化,并且第二列中的值根据第一列中选择的值不同而不同.
比如:第一列中的值有:半成品,成品 这两个值,当我选择"半成品"时,第二列的JComboBox中的值为:集成电子,芯片,主板 这三个值,当选择"成品"时,第二列JComboBox中的值为:台式电脑,笔记本电脑 这两个值,请问各位该如何来实现这种效果,还望各位帮忙,能给我提借实现的代码,本人非常感谢你!

解决方案 »

  1.   

    听起来不怎么难吧,意思是不是说编辑单元格的时候可以改变相关联的另外一列的JComboBox的items?
      

  2.   

    //随便写的一个代码,用于说明,具体优化自己改进了.!
    //希望对你有所帮助.
    //多点看Swing的源代码,是一个很好的体系,很标准化
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    public class TableComboBoxTest extends javax.swing.JFrame {
    private JTable table;
    private JComboBox comboBox1;
    private JComboBox comboBox2;
    private Object[] list1,list2; public static void main(String[] args) {
    TableComboBoxTest inst = new TableComboBoxTest();
    inst.setVisible(true);
    }

    public TableComboBoxTest() {
    super();
    comboBox1=new JComboBox(new String[] {"半成品","成品"});
    comboBox1.setSelectedIndex(0);
    list1=new String[] {"集成电子","芯片","主板"};
    list2=new String[] {"台式电脑","笔记本电"};
    comboBox2=new JComboBox(list1);
    //actions
    comboBox1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    if(comboBox1.getSelectedItem().equals("半成品")) {;
    comboBox2.setModel(new DefaultComboBoxModel(list1));
    }else {
    comboBox2.setModel(new DefaultComboBoxModel(list2));
    }
    }
    });
    initGUI();
    }

    private void initGUI() {
    try {
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    {
    JScrollPane jScrollPane1 = new JScrollPane();
    getContentPane().add(jScrollPane1, BorderLayout.CENTER);
    {
    TableModel jTable1Model = new DefaultTableModel(new String[][] { { "One", "Two" },
    { "Three", "Four" } }, new String[] { "Column 1", "Column 2" });
    table = new JTable();
    jScrollPane1.setViewportView(table);
    table.setModel(jTable1Model);
    table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(comboBox1));
    table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(comboBox2));
    }
    }
    pack();
    setSize(400, 300);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }}
      

  3.   

    这个还不是我的意思,
    就是当你在第一行第一列选择"成品"时,
        第一行第二列中的JComboBox中的对应值是"台式电脑","笔记本电脑"
    第二行第一列选择"半成品"时,
        第二行第二列中的JComboBox中的对应值是"集成电子","芯片","主板"现有你给的程序是当选择其中一个时,第二列的值是变化了,但是你不去选择第一列的值时,第一行第二列和第二行第二列的值都是一样的.
      

  4.   

    呵呵,我正在帮你测试,他妈的好像还真得挺难,
    本以为DefaultTableCellRenderer能够解决问题,
    可好像有点问题。
      

  5.   

    顺利解决,你看看是否合你的意思。
    当然还得谢谢Jerrylove(Jerry)。import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import javax.swing.event.*;
    import java.util.Vector;public class TestJComboBox extends javax.swing.JFrame {
        private JTable table;    private Object[] list11 = {"半成品", "成品"};
        private JComboBox comboBox1;    private Object[] list21 = {"集成电子", "芯片", "主板"};
        private Object[] list22 = {"台式电脑", "笔记本电"};
        private JComboBox comboBox2;    public static void main(String[] args) {
            TestJComboBox inst = new TestJComboBox();
            inst.setVisible(true);
        }    public TestJComboBox() {
            super();
            comboBox1 = new JComboBox(list11);
            comboBox2 = new JComboBox(list21);        comboBox2.addPopupMenuListener(new PopupMenuListener(){
                public void popupMenuWillBecomeVisible(PopupMenuEvent e){
                    int editRow = table.getEditingRow();
                    int editCol = table.getEditingColumn();
                    Object pvalue = table.getValueAt(editRow, 0);                if (pvalue==list11[0]) {
                        //这种方式个人认为不太好,多开很多对象
                        comboBox2.setModel(new DefaultComboBoxModel(list21));
                    }
                    else {
                        comboBox2.setModel(new DefaultComboBoxModel(list22));
                    }            };
                public void popupMenuWillBecomeInvisible(PopupMenuEvent e){};
                public void popupMenuCanceled(PopupMenuEvent e){};
            });        initGUI();
        }    private void initGUI() {
            try {
                setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);            JScrollPane jScrollPane1 = new JScrollPane();
                getContentPane().add(jScrollPane1, BorderLayout.CENTER);            TableModel jTable1Model = new DefaultTableModel(
                    new String[][] { {"00", "01"},{"00", "01"},{"00", "01"}},
                    new String[] {"Column 1", "Column 2"});
                table = new JTable(jTable1Model);
                jScrollPane1.setViewportView(table);            table.getColumnModel().getColumn(0).setCellEditor(
                    new DefaultCellEditor(comboBox1));
                table.getColumnModel().getColumn(1).setCellEditor(
                    new DefaultCellEditor(comboBox2));            pack();
                setSize(400, 300);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }}
      

  6.   

    得感谢Kylixs(歌声中飘舞的星),复制错了。