I have three JComboBox, one for continents, one for countries and another for cities. All data is loaded from a database.
我有三个JComboBox,一个用于大陆,一个用于国家,另一个用于城市。所有数据都从数据库加载。
The first JComboBox has all continents. When I select one of them, the second JComboBox is loaded with the respective countries. Until now works, because I added an "itemStateChanged".
第一个JComboBox遍布各大洲。当我选择其中一个时,第二个JComboBox将加载相应的国家/地区。到现在为止,因为我添加了“itemStateChanged”。
However, when I select a country, the event "itemStateChanged" is called again. What makes my second combo box stay with the first item selected, or (if I do the "RemoveAllItems") duplicates its content?
但是,当我选择一个国家/地区时,会再次调用事件“itemStateChanged”。是什么让我的第二个组合框保留选定的第一个项目,或者(如果我执行“RemoveAllItems”)重复其内容?
There is no way in which it created a "itemStateChanged" for each JComboBox? Of the kind .NET, in which it is possible to create a "SelectedIndexChanged" for each combo box?
它没有办法为每个JComboBox创建一个“itemStateChanged”?在.NET中,可以为每个组合框创建“SelectedIndexChanged”吗?
Some parts of my code:
我的代码的一些部分:
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);
…
}
This part of code is the content when i click on the button, to enable my components:
这部分代码是当我点击按钮,启用我的组件时的内容:
private void btnNovocliente_actionPerformed(ActionEvent e) {
populardistritos = true;
cbdistritocliente.removeAllItems();
preenchecbdistritos();
populardistritos = false;
}
This piece of code fills the contents of the first JComboBox:
这段代码填充了第一个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);
}
}
This is the famous event, which would like to get individually for each JComboBox:
这是着名的活动,想要为每个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) {
}
}
}
}
This piece of code fills the contents of the second JComboBox:
这段代码填充了第二个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);
}
}
}
2 个解决方案
#1
2
the docs tell you that event contains info about originator. So just check for e.getItemSelectable().equals(firstSelectBox) etc.
文档告诉您该事件包含有关发起人的信息。所以只需检查e.getItemSelectable()。equals(firstSelectBox)等。
Hope that helps.
希望有所帮助。
#2
2
You may be able to leverage the approach shown here, in which a selection in the first combo replaces the model in a second combo. In that example, combo1
would hold continents, and the combo2
model would be set to the one containing countries on the selected continent. The example uses an array, but a List<ComboBoxModel<String>>
might be a more flexible choice.
您可以利用此处显示的方法,其中第一个组合中的选择将替换第二个组合中的模型。在该示例中,combo1将保持大陆,并且combo2模型将设置为包含所选大陆上的国家的模型。该示例使用数组,但List
#1
2
the docs tell you that event contains info about originator. So just check for e.getItemSelectable().equals(firstSelectBox) etc.
文档告诉您该事件包含有关发起人的信息。所以只需检查e.getItemSelectable()。equals(firstSelectBox)等。
Hope that helps.
希望有所帮助。
#2
2
You may be able to leverage the approach shown here, in which a selection in the first combo replaces the model in a second combo. In that example, combo1
would hold continents, and the combo2
model would be set to the one containing countries on the selected continent. The example uses an array, but a List<ComboBoxModel<String>>
might be a more flexible choice.
您可以利用此处显示的方法,其中第一个组合中的选择将替换第二个组合中的模型。在该示例中,combo1将保持大陆,并且combo2模型将设置为包含所选大陆上的国家的模型。该示例使用数组,但List