0

大陸用、国用、都市用の 3 つの JComboBox があります。すべてのデータはデータベースからロードされます。

最初の JComboBox にはすべての大陸があります。そのうちの 1 つを選択すると、2 番目の JComboBox にそれぞれの国がロードされます。「itemStateChanged」を追加したため、今までは機能していました。

ただし、国を選択すると、イベント「itemStateChanged」が再度呼び出されます。2 番目のコンボ ボックスが最初の項目を選択したままにしておく、または ("RemoveAllItems" を実行すると) その内容が複製されるのはなぜですか?

JComboBoxごとに「itemStateChanged」を作成する方法はありませんか? コンボボックスごとに「SelectedIndexChanged」を作成できる.NETのようなものですか?

私のコードの一部:

public class MainFrame extends JFrame implements ItemListener 
{
…
private String iddistrito="VAZIO!!!";
private String idmunicipio="VAZIO!!!"; 
private boolean limpa=false;
private boolean populardistritos=false;
private boolean popularmunicipios=false;
private JComboBox cbFreguesiacliente = new JComboBox();
private JComboBox cbmunicipiocliente = new JComboBox();
private JComboBox cbdistritocliente = new JComboBox();
…
private void jbInit() throws Exception {
…
cbmunicipiocliente.addItemListener(this);
cbdistritocliente.addItemListener(this);     
…
}

コードのこの部分は、コンポーネントを有効にするためにボタンをクリックしたときのコンテンツです。

private void btnNovocliente_actionPerformed(ActionEvent e) {
    populardistritos = true;
    cbdistritocliente.removeAllItems();
    preenchecbdistritos();
    populardistritos = false;
}

このコードは、最初の JComboBox の内容を埋めます。

private void preenchecbdistritos(){
        query = "select Distrito from distritos;";
        try{
            Class.forName(JDBC_DRIVER);
            connection = DriverManager.getConnection(DATABASE_URL);
            statement = connection.createStatement();
            ResultSet resultset = statement.executeQuery(query);
            StringBuffer results = new StringBuffer();
            ResultSetMetaData metaData = resultset.getMetaData();
            int numberOfColumns = metaData.getColumnCount();
            cbdistritocliente.addItem("");
            while (resultset.next()) {
                for (int i =1; i<= numberOfColumns; i++) {
                    if (metaData.getColumnName(i).equals("Distrito")) {
                        cbdistritocliente.addItem(resultset.getObject(i).toString());
                    }
                }
            }
        } catch (ClassNotFoundException e) {
            JOptionPane.showMessageDialog(this,"rebentou no 1º catch " + e.toString(),"Inane error", JOptionPane.ERROR_MESSAGE);
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this,"rebentou no 2º catch " + e.toString(),"Inane error", JOptionPane.ERROR_MESSAGE);
        }
}

これは、JComboBox ごとに個別に取得したい有名なイベントです。

public void itemStateChanged(ItemEvent e) {
    if (populardistritos == false) {
        if (limpa == false) {
            if ((!cbdistritocliente.getSelectedItem().toString().equals("")) && (idmunicipio.equals("VAZIO!!!")))
            {
                query = "select id_distrito from distritos where distrito = '" + cbdistritocliente.getSelectedItem().toString() + "';";
                try{
                    Class.forName(JDBC_DRIVER);
                    connection = DriverManager.getConnection(DATABASE_URL);
                    statement = connection.createStatement();
                    ResultSet resultset = statement.executeQuery(query);
                    StringBuffer results = new StringBuffer();
                    ResultSetMetaData metaData = resultset.getMetaData();
                    int numberOfColumns = metaData.getColumnCount();
                    while (resultset.next()) {
                        for (int i =1; i<= numberOfColumns; i++) {
                            if (metaData.getColumnName(i).equals("id_distrito")) {
                                iddistrito = resultset.getObject(i).toString();
                            }
                        }
                    }
                        preenchecbmunicipios();    
                } catch (ClassNotFoundException e2) {
                } catch (SQLException e2) {
                }
            }
        }


        if (!cbmunicipiocliente.getSelectedItem().toString().equals(""))
        {
            query = "select id_municipio from municipios where municipio = '" + cbmunicipiocliente.getSelectedItem().toString() + "';";
            try{
                Class.forName(JDBC_DRIVER);
                connection = DriverManager.getConnection(DATABASE_URL);
                statement = connection.createStatement();
                ResultSet resultset = statement.executeQuery(query);
                StringBuffer results = new StringBuffer();
                ResultSetMetaData metaData = resultset.getMetaData();
                int numberOfColumns = metaData.getColumnCount();
                while (resultset.next()) {
                    for (int i =1; i<= numberOfColumns; i++) {
                        if (metaData.getColumnName(i).equals("id_municipio")) {
                            idmunicipio = resultset.getObject(i).toString();
                        }
                    }
                }
            } catch (ClassNotFoundException e2) {
            } catch (SQLException e2) {
            }
        }            
    }
}

このコードは、2 番目の JComboBox の内容を埋めます。

private void preenchecbmunicipios(){
    if (!iddistrito.equals("VAZIO!!!")) {
        query = "select municipio from municipios where municipios.id_distrito = " + iddistrito + ";";
        populardistritos=true;
        //cbmunicipiocliente.removeAllItems();
        try{
            Class.forName(JDBC_DRIVER);
            connection = DriverManager.getConnection(DATABASE_URL);
            statement = connection.createStatement();
            ResultSet resultset = statement.executeQuery(query);
            StringBuffer results = new StringBuffer();
            ResultSetMetaData metaData = resultset.getMetaData();
            int numberOfColumns = metaData.getColumnCount();
            cbmunicipiocliente.addItem("");
            while (resultset.next()) {
                for (int i =1; i<= numberOfColumns; i++) {
                    if (metaData.getColumnName(i).equals("municipio")) {
                        cbmunicipiocliente.addItem(resultset.getObject(i).toString());
                    }
                }
            }
            populardistritos=false;
        } catch (ClassNotFoundException e) {
            JOptionPane.showMessageDialog(this,"rebentou no 1º catch do cbmunicipio com " + e.toString(),"Inane error", JOptionPane.ERROR_MESSAGE);
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this,"rebentou no 2º catch do cbmunicipio com " + e.toString(),"Inane error", JOptionPane.ERROR_MESSAGE);
        }            
    }
}
4

2 に答える 2

2

ドキュメントは、イベントに発信者に関する情報が含まれていることを示しています。したがって、 e.getItemSelectable().equals(firstSelectBox) などを確認してください。

それが役立つことを願っています。

于 2012-12-22T21:10:43.397 に答える
2

最初のコンボでの選択が 2 番目のコンボでモデルを置き換える、ここに示すアプローチを利用できる場合があります。その例でcombo1は、大陸が保持され、combo2モデルは選択された大陸の国を含むモデルに設定されます。この例では配列を使用していList<ComboBoxModel<String>>ますが、a の方がより柔軟に選択できる場合があります。

于 2012-12-22T22:13:20.943 に答える