JTable中的JComboBox不显示选项,只有正确数量的空白选项

时间:2013-08-11 17:33:44

标签: java swing jdbc jtable jcombobox

我正在尝试将数据库(称为stock_info)中的列(称为部分)的值读入JComboBox中的JTable(称为tblContents })。我的代码如下。运行该文件时,组合框出现在表中,当单击它们以选择一个选项时,它们会扩展为8个空白选项,因为数据库表中的列中有8个值。

有人可以解释为什么这些选项都是空白的吗?

import java.sql.*;
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;

public class Sale extends javax.swing.JFrame {

PreparedStatement pst = null;
Connection conn = null;
ResultSet rs = null;
int count = 0;

public void FillCmbs() {

    String sql = "SELECT * from stockinfo ORDER BY parts";
    int size = 0;

    try {
        pst = conn.prepareStatement(sql);
        rs = pst.executeQuery();
        while(rs.next()){
            size++;
        }
        String[] items = new String[size];
        while (rs.next()) {
            items[count] = rs.getString("parts");
            count++;
        }
        JComboBox jcb = new JComboBox(items);
        TableColumn tc = tblContents.getColumnModel().getColumn(1);
        TableCellEditor tce = new DefaultCellEditor(jcb);
        tc.setCellEditor(tce);
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, e);
    }
}

public Sale() {
    initComponents();
    conn = DBConnect.ConnectDB();

}

private void formWindowActivated(java.awt.event.WindowEvent evt) {                                     
    FillCmbs();
}                                    

public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Sale().setVisible(true);

        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable tblContents;
// End of variables declaration                   
}

2 个答案:

答案 0 :(得分:3)

在第一个while循环导航ResultSet rs之后,永远不会输入后续while循环,因为没有更多可用记录,rs.next()返回false

while (rs.next()) {
   items[count] = rs.getString("parts");
   ...
}

使用String构建一个字符串集合,而不是使用单独的循环确定items数组Vector<String>的大小。然后,可以在 JComboBox的单个导航后直接将其传递到ResultSet构造函数

Vector<String> data = new Vector<>();
while (rs.next()) {
   data.add(rs.getString("parts"));
}

count = data.size();
JComboBox<String> jcb = new JComboBox<>(data);

作为奖励,count变量等同于data.size()

答案 1 :(得分:0)

不需要数组或ArrayList。只需在开始循环之前创建组合框。然后使用:

comboBox.addItem( rs.getString("parts") );