![](/img/trans.png)
[英]Populating a subcategory JList based on a selection from a Primary JList and info in a database (Java, SQL)
[英]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.