Проблема заполнения Jlist на основе двух Jcombobox, подключенных к базе данных PostgreSQL - PullRequest
0 голосов
/ 18 ноября 2018

Добрый день

Я работаю над проектом, который должен рассчитать производительность насоса для определенных параметров, таких как вращение, количество ступеней, диаметр и вязкость.Сначала я создал базу данных с использованием PostgreSQL с несколькими коммерческими насосами.База данных содержит схемы компаний, которые производят насосы, в каждой схеме есть таблицы, представляющие различные серии насосов, а таблицы имеют несколько насосов, организованных в виде линий.Строки содержат коэффициенты, представляющие насосы и необходимые для расчета производительности.

Я пытался закодировать приложение на C ++, но было слишком сложно подключиться к Postgre, поэтому я закончил работу с Java и Netbeans (Думаю, новичкам легче).Приложение работает довольно хорошо, но я обнаружил две проблемы, которые не могу решить.

Чтобы выбрать насос для расчетов, мне пришлось использовать два Jcombobox и Jlist.Первый Jcombobox предназначен для выбора производителя, второй - для выбора серии.Наконец, Jlist отображает все насосы в этой серии, так что пользователь может выбрать один.

Я смог заполнить первый Jcombobox схемами базы данных (спасибо вам, ребята, на самом деле), второй стаблицы схемы выбраны в первом и Jlist с названиями насосов.

Первая проблема заключается в том, что я не могу очистить второй Jcombobox (первый ряд) после смены выбранного производителя в первом 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);

}

Спасибо всем.

1 Ответ

0 голосов
/ 21 ноября 2018

Мне удалось решить проблему только сейчас. Когда строка selectSerie.removeAllItems() не была закомментирована, программа вернула ошибку NullPointerException.

Для решения проблемы я использовал класс DefaultComboBoxModel, а затем метод RemoveAllElements(). Я не совсем уверен, почему другой метод не сработал.

Спасибо за ваше время и помощь Питер .

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);
    }
}
...