使用不同的值在JTable中创建更多JCombobox?

时间:2015-07-25 11:23:51

标签: java swing jtable

我想用JCombobox创建一个JTable。在具有不同数据的JComboBox的JTable 3列中。我尝试了DefaultCellEditor,但所有JCombobox都有相同的数据。

任何人都可以帮我实现同样的目标。

先谢谢。

public class CustomComboEditor extends DefaultCellEditor {

    private DefaultComboBoxModel model;
    private DefaultComboBoxModel model1;
    private DefaultComboBoxModel model2;

    public CustomComboEditor() {
        super(new JComboBox());
        this.model = (DefaultComboBoxModel) ((JComboBox) getComponent()).getModel();
        this.model1 = (DefaultComboBoxModel) ((JComboBox) getComponent()).getModel();
        this.model2 = (DefaultComboBoxModel) ((JComboBox) getComponent()).getModel();

    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int col) {
        try {
            model.removeAllElements();
            model.addElement("");
            String sql = "select query 1";
            pst = conn.prepareStatement(sql);
            rs = pst.executeQuery();
            while (rs.next()) {
                model.addElement(rs.getString(1));
            }



            model1.removeAllElements();
            model1.addElement("");
            String sql1 = "select query 2";
            pst = conn.prepareStatement(sql1);
            rs = pst.executeQuery();
            while (rs.next()) {
                model1.addElement(rs.getString(1));
            }

            /*model2.removeAllElements();
            model2.addElement("");
            model2.addElement("Male");
            model2.addElement("Female");*/

        } catch (SQLException ex) {
             Logger.getLogger(Order_Enquiry.class.getName()).log(Level.SEVERE, null, ex);
        }
        return super.getTableCellEditorComponent(table, value, isSelected, row, col);
    }
}

1 个答案:

答案 0 :(得分:2)

this.model = (DefaultComboBoxModel) ((JComboBox) getComponent()).getModel();
this.model1 = (DefaultComboBoxModel) ((JComboBox) getComponent()).getModel();
this.model2 = (DefaultComboBoxModel) ((JComboBox) getComponent()).getModel();

modelmodel1model2是指向同一对象的3个引用。因此,当您运行model1.removeAllElements();时,您将删除之前存储的所有元素。

但是单一型号可能还不错。问题是目前您正在运行完全相同的查询,无论您在表中的哪个位置,因此您不希望在不同的单元格中具有不同的组合框条目。相反,你应该有或多或少的东西:

@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int col) {

    model.removeAllElements();
    model.addElement("");

    if(col==0){
        // Prepare query 1
        sql = ...

    }else if(col==1){
        // Prepare query 2
        sql = ...

    }else
       ...

    // run query
    pst = conn.prepareStatement(sql);
    rs = pst.executeQuery();

    // Fill the model
    while (rs.next()) {
        model.addElement(rs.getString(1));
    }

    return super.getTableCellEditorComponent(table, value, isSelected, row, col);
}