簡體   English   中英

在基於連接到PostgreSQL數據庫的兩個Jcombobox填充Jlist時出現問題

[英]Problem populating a Jlist based on two Jcomboboxes connected to a PostgreSQL database

下午好

我正在巫婆的一個項目上工作,我必須針對某些參數(例如旋轉,級數,直徑和粘度)計算泵的性能。 最初,我使用帶有多個商用泵的PostgreSQL創建了一個數據庫。 該數據庫包含與制造泵的公司相同的模式,在每個模式中,都有代表不同系列泵的表,並且這些表具有按行組織的多個泵。 這些線包含代表泵的系數,這些系數是計算性能所必需的。

我試圖用C ++編寫該應用程序,但是由於很難與Postgre連接,所以我結束了Java和Netbeans的工作(我認為對新手來說更容易)。 到目前為止,該應用程序運行良好,但是我發現了兩個無法解決的問題。

為了選擇泵進行計算,我不得不使用兩個Jcombobox和一個Jlist。 第一個Jcombobox用於選擇制造商,第二個用於選擇系列。 最后,Jlist顯示該系列中的所有泵,以便用戶可以選擇一個。

我能夠用數據庫的模式(實際上是感謝你們)填充第一個Jcombobox,第二個用在第一個中選擇的模式的表填充,第二個用泵的名稱填充Jlist。

第一個問題是,在第一個Jcombobox中更改選定的制造商后,我無法清除第二個Jcombobox(系列),即使我重新選擇了一個已經選擇。 我嘗試使用命令“ 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);

}

謝謝你們。

我剛剛設法解決了這個問題。 當對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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM