java - 当表包含使用连接的空值时,如何将数据从数据库添加到 Java Swing 中的 jTable?

标签 java mysql swing

好的,所以我有一个方法可以从数据库中获取数据并将其放入这样的列表中:

public List<Sale> getSales() throws SQLException{
    List<Sale> res = new ArrayList<Sale>();
    Statement st = conn.createStatement(); 
    ResultSet rs = st.executeQuery("select sale.id,product.name,sale.price,sale.quantity,sale.total,employee.name,buyer_seller.name from sale "
            + "                     join product on sale.product = product.id "
            + "                     join employee on sale.salesman = employee.id "
            + "                     join buyer_seller on sale.buyer = buyer_seller.id;");
    while(rs.next()){
        res.add(new Sale (rs.getInt(1),new Product(-1,rs.getString(2),new Category(-1,"",""),new Manufacturer(-1,"",""),0.0,-1),rs.getDouble(3),rs.getInt(4),rs.getDouble(5),new Employee(-1,rs.getString(6),"","",new JobCategory(-1,"",""),"",""),new BuyerSeller(-1,rs.getString(7),"","","")));
    }  
    return res;
}

然后我有一个用该数据填充 jTable 的方法:

public void fillSales(){
    jLabel1.setText("Podaci se ucitavaju iz baze..."); 
    SwingWorker sw = new SwingWorker() { 
        @Override
        protected Object doInBackground() throws Exception {
            MyShopRepository repo = MyShopRepository.getInstance();
            List<Sale> allSale = repo.getSales();
           return allSale;
        } 
        @Override
        protected void done() {
            super.done();
            try {
                List<Sale> res = (List<Sale>)get();
                DefaultTableModel dtm = (DefaultTableModel)jTable1.getModel(); 
                int redova = dtm.getRowCount();
                for(int i=0;i<redova;i++){
                    dtm.removeRow(0);
                } 
                for(Sale s : res){
                    dtm.addRow(new Object[]{
                        s.id,s.product.name,s.price,s.quantity,s.total,s.salesman.name,s.buyer.name
                    });
                } 
                jLabel1.setVisible(false);
            } catch (InterruptedException | ExecutionException ex) {  }
        } 
    };
    sw.execute();
}

这工作得很好,但是当我从表中删除一些行时,它们被设置为空并且我没有在 jTable 中显示它们。如果它的值为空,我如何将它们也添加到只有一个空单元格的 jTable 中?

最佳答案

在数据库方面,如果您因为尝试连接具有空值的表而看不到行,则使用 LEFT JOIN 而不是 JOIN

在 UI 端,DefaultTableCellRenderer 将为任何 null 对象返回一个空字符串。如果您仍然在 JTable 中看到 null,那么这很可能是由您的数据库作为字符串值“null”返回的。要绕过 null 字符串值,您可以扩展 DefaultTableCellRenderer 并覆盖 setValue 方法以将“null”字符串值考虑在内。例如:

DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(){
    @Override
    protected void setValue(Object value) {
        setText((value == null || value.toString().equalsIgnoreCase("null")) ? "" : value.toString());
    } 
};
table.setDefaultRenderer(Object.class, renderer);

关于java - 当表包含使用连接的空值时,如何将数据从数据库添加到 Java Swing 中的 jTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39356489/

相关文章:

php - 插入新行并获取它的 id mysql

mysql - 502 错误 nginx + ruby​​ on rails 应用程序

java - jooq 代码生成 mysql 远程数据库 maven

java - 我不明白在将 toString 与我的 UI 混合时遇到的问题

java - 将不透明度从 0.0 0.1 .. 更改为 1.0 以创建动画效果

c# - 在c#中实现java函数

java - 在构建和报告部分之间共享 Maven 插件配置

java - jar 冲突版本公共(public)配置

java - 如何更改 JTabbedPane 的背景颜色?

java - 2D游戏中的碰撞