在基于连接到PostgreSQL数据库的两个Jcombobox填充Jlist时出现问题

时间:2018-11-18 18:37:51

标签: java swing jcombobox jlist

下午好

我正在巫婆的一个项目上工作,我必须针对某些参数(例如旋转,级数,直径和粘度)计算泵的性能。最初,我使用带有多个商用泵的PostgreSQL创建了一个数据库。该数据库包含与制造泵的公司相同的模式,在每个模式中,都有代表不同系列泵的表,并且这些表具有按行组织的多个泵。这些行包含代表泵的系数,并且是计算性能所必需的。

我试图用C ++编写应用程序代码,但是由于很难与Postgre连接,所以我结束了Java和Netbeans的工作(我认为对新手来说更容易)。到目前为止,该应用程序运行良好,但是我发现了两个无法解决的问题。

要选择泵进行计算,我必须使用两个Jcombobox和一个Jlist。第一个Jcombobox用于选择制造商,第二个用于选择系列。最后,Jlist显示该系列中的所有泵,以便用户可以选择一个。

我能够用数据库的模式(实际上是感谢你们)填充第一个Jcombobox,第二个用在第一个中选择的模式的表填充,第二个用泵的名称填充Jlist。

第一个问题是,在第一个Jcombobox中更改选定的制造商后,我无法清除第二个Jcombobox(系列一个),即使我重新选择一个Jcombobox,每次更改它也会添加更多itens。已经选择的项目。我尝试使用命令“ removeAllItems()”,但随后仅显示一个表并停止填充Jcombobox。

第二个问题是,当我在第二个Jcombobox中选择一个系列时,它不会立即在Jlist中显示泵,Jlist在我选择了另一个系列之后开始移动。因此,我必须选择一个然后更改为另一个,以便泵开始出现在Jlist中。

很长的文字和英语错误,我很抱歉,希望你们能理解。我知道代码不是很漂亮,这是因为我还不太擅长于此,所以我急着要交付它。

这里是代码,没有所有Netbeans生成的代码。

public final class LabPump extends javax.swing.JFrame {

Connection con = null;
PreparedStatement pst = null;
ResultSet rs = null;

public LabPump() {
    initComponents();

    con = ConnectPump.connect();

    FillSelectFabricante();

}

public void FillSelectFabricante(){

    try {
        rs = con.getMetaData().getSchemas();

        while(rs.next()){
            String schemas = rs.getString("TABLE_SCHEM");

            if(schemas.equals("information_schema") || schemas.equals("pg_catalog")){
            }
            else{
                selectFabricante.addItem(schemas);
            }
        }
    }
    catch(SQLException error){
        JOptionPane.showMessageDialog (null,error);
    }

}

public void FillSelectSerie(String fabricante){

    //selectSerie.removeAllItems();

    try {
        String[] sql = {"TABLE"};
        rs = con.getMetaData().getTables(null, fabricante, "%", sql);

        while(rs.next()){
            String tables = rs.getString(3);

            selectSerie.addItem(tables);
        }
    }
    catch(SQLException error){
        JOptionPane.showMessageDialog (null,error);
    }

}

public void FillListBomba(String fabricante, String serie){

    DefaultListModel dlm = new DefaultListModel();
    dlm.removeAllElements();

    try{
        String sql = "select * from " + fabricante + "." + serie;
        pst = con.prepareStatement(sql);
        rs = pst.executeQuery();

        while(rs.next()){
            String bomba = rs.getString("bomba");
            dlm.addElement(bomba);
        }
    listBomba.setModel(dlm);
    }
    catch(SQLException error){
        JOptionPane.showMessageDialog (null,error);
    } 

}

    private void selectSerieActionPerformed(java.awt.event.ActionEvent evt) {                                            

    selectSerie.addActionListener((ActionEvent e) -> {
        String fabricante = selectFabricante.getSelectedItem().toString();
        String serie = selectSerie.getSelectedItem().toString();

        FillListBomba(fabricante, serie);

    });
}                                           

private void selectFabricanteActionPerformed(java.awt.event.ActionEvent evt) {                                                 

    String fabricante = selectFabricante.getSelectedItem().toString();

    FillSelectSerie(fabricante);

}

谢谢大家。

1 个答案:

答案 0 :(得分:0)

我刚刚设法解决了这个问题。当selectSerie.removeAllItems()行未注释时,程序返回一个NullPointerException错误。

为解决该问题,我使用了DefaultComboBoxModel类,然后使用了RemoveAllElements()方法。我不太确定为什么其他方法无效。

感谢您的时间和帮助Peter

public void FillSelectSerie(String fabricante) {

    DefaultComboBoxModel box;
    box = new DefaultComboBoxModel();
    box.removeAllElements();

    try {
        String[] sql = {"TABLE"};
        rs = con.getMetaData().getTables(null, fabricante, "%", sql);
        box.addElement("-");

        while (rs.next()) {
            String tables = rs.getString(3);
            box.addElement(tables);
        }
        selectSerie.setModel(box);
    } catch (SQLException error) {
        //JOptionPane.showMessageDialog (null,error);
    }
}