如何刷新与 jtable 绑定的 Jscrollpane 中的数据?

Posted

技术标签:

【中文标题】如何刷新与 jtable 绑定的 Jscrollpane 中的数据?【英文标题】:How to refresh data in Jscrollpane bound with jtable? 【发布时间】:2014-05-30 11:20:55 【问题描述】:

当我直接使用jtable时,我的代码可以工作,但是当我用滚动面板绑定它时,它会运行一次。再次单击按钮后,它会隐藏数据。代码如下:

import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

import com.mysql.jdbc.Statement;

class Scrl extends JFrame implements ActionListener 

    JScrollPane sp;
    Icon back,front;
    JLabel l,l1;
    JTable tb=new JTable();
    DefaultTableModel model;
    String column[]="JobcardNo","Customer Name","Brand","Date","PhoneNo";
    JTextField jobt=new JTextField("");
    JButton b=new JButton("click");


    public Scrl()

    
        b.setBounds(200,140,100,20);
        jobt.setBounds(114,50,100,20);
        model = new DefaultTableModel();
        tb.setModel(model); 
        model.setColumnIdentifiers(column);
        add(jobt);
        add(b);


        b.addActionListener(this);


        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
        setLayout(null);
        setSize(700,600);
        setVisible(true);
        setLocationRelativeTo(null);
    

    @Override
    public void actionPerformed(ActionEvent e) 
    
        if(e.getSource()==b)
        
            String job_no=jobt.getText();

            try
            
                Class.forName("com.mysql.jdbc.Driver");
                Connection    con=DriverManager.getConnection("jdbc:mysql://localhost:3306/ac_data","root","root");
                java.sql.Statement st=con.createStatement();
                ResultSet rs=st.executeQuery("select * from main");
                while(rs.next())
                
                    String hey=rs.getString(1);
                    if(hey.equals(job_no))
                    
                         System.out.println(rs.getString(2));
                        String jobno=rs.getString(1);
                        String names=rs.getString(2);
                        String brand=rs.getString(21);
                        String date=rs.getString(6);
                        String phoneno=rs.getString(4);
                        model.addRow(new Object[]jobno,names,brand,date,phoneno);                         
                    
                   
            

            catch(Exception ee)
                               
            

        
        JScrollPane sp=new JScrollPane(tb);
        sp.setBounds(1,165,687,440);
        add(sp);
    
    public static void main(String[] args) 
    
        new Scrl();
    

滚动面板本身不刷新数据。

【问题讨论】:

1. NullLayout 的缺点是子级不能通过容器/父级调整大小,2. NullLayout 的缺点是动态 JComponents 当它们是 setBounds 的从属时不能正常工作 setLocationRelativeTo(null);应该在 setVisible(true); 之前 model.addRow(new Object[]jobno,names,brand,date,phoneno);应该包装到invokeLater中,也许更容易创建一个新的二维数组并将这个数组添加到DefaultTableModel,或者创建一个新模型并添加到JTable,顺便说一句,你永远不会重置旧模型,然后在末尾追加一个新行模型/JTable Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。要为强大的 GUI 组织组件,请改用布局管理器或 combinations of them,以及 white space 的布局填充和边框。 【参考方案1】:

    完成后不要关闭连接。

    您应该在构建 GUI 之前从数据库中读取一次信息,然后将信息放入 TableModel。

    当您应该使用 layout manager 时,您尝试手动放置所有 Swing 组件。

    您没有将 Swing 组件放在 Event Dispatch thread 上。

阅读和学习应该足够让你忙一阵子了。

【讨论】:

谢谢你告诉我的错误..我一定会记住它..thnks【参考方案2】:

它没有显示的原因是您每次单击按钮时都会实例化一个新的 JScrollPane。相反,您应该只在某个不会每次都重新创建它的地方实例化一次(即:在您的构造函数中)。

将以下内容移到构造函数的末尾:

JScrollPane sp=new JScrollPane(tb);
sp.setBounds(1,165,687,440);

另外,不要让你的 catch 异常为空,因为你永远不会知道你的程序是否抛出异常。在 catch 异常子句中添加以下内容:

ee.printStackTrace();

并处理它打印出来的任何错误。

【讨论】:

非常感谢...:)

以上是关于如何刷新与 jtable 绑定的 Jscrollpane 中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 netbeans 轻松地将任何数据库视图绑定到 jtable?

如何在单击JButton后刷新JTable

如何使用绑定类通过代码将 JComboBox selectedItem 绑定到 Jtable?

Java Swing 如何使用DefaultTableModel交替刷新JTable?

java bindings - 如何在不获取-0.0值的情况下将float绑定到jtable?

swing 怎样实现表格内容刷新