Java 如何在添加、删除、更新数据时刷新JTable

Java 如何在添加、删除、更新数据时刷新JTable,java,swing,jtable,Java,Swing,Jtable,我有一个JTable,通过我的数据库连接 我正在通过调用此方法初始化我的表 private void initializeRecordsPanel(){ disableAllPanels(); lblCityJail = new JLabel("Meycauayan City Jail\r\n"); lblCityJail.setBounds(244, 11, 283, 50); lblCityJail.setForeground(Color.BL

我有一个
JTable
,通过我的数据库连接

我正在通过调用此方法初始化我的表

private void initializeRecordsPanel(){
    disableAllPanels();        
    lblCityJail = new JLabel("Meycauayan City Jail\r\n");
    lblCityJail.setBounds(244, 11, 283, 50);
    lblCityJail.setForeground(Color.BLACK);
    lblCityJail.setFont(new Font("Tahoma", Font.BOLD, 25));
    recordsPanel.add(lblCityJail);

    btnRefresh.setVisible(true);
    try{
        connection ();                

        String columns [] = {
                "Last Name", "First Name", "Alias", "Sex", "Case1", "Case2"
        };
        int count = 0 ;

        while(rs.next()){
            count ++;
        }

        String datas[][] = new String [count] [7] ;

        int i=0;

        connection();
        while(rs.next()){
            datas[i][0]=rs.getString("lname").toString();
            datas[i][1]=rs.getString("fname").toString();
            datas[i][2]=rs.getString("alias").toString();
            datas[i][3]=rs.getString("sex").toString();
            datas[i][4]=rs.getString("case1").toString();
            datas[i][5]=rs.getString("case2").toString();
            datas[i][6]=rs.getString("ID").toString();
            i++;
        }


        scrollPane_1 = new JScrollPane();

        scrollPane_1.setBounds(48, 104, 650, 314);
        recordsPanel.add(scrollPane_1);

        tblListOfInmates = new JTable(datas, columns){
            public boolean isCellEditable(int nRow, int nCol) {
                return false;
            }
        };

        //TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tblListOfInmates.getModel());
        //tblListOfInmates.setRowSorter(sorter);

        tblListOfInmates.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                try{
                    int row = tblListOfInmates.getSelectedRow();
                    Table_click = tblListOfInmates.getModel().getValueAt(row, 6).toString();


                    if(rs.next()){
                        addRecord ar = new addRecord();
                        ar.connection();
                        ar.setupFrame();
                        ar.setSelectedRowToTextFields();
                        ar.edit.setVisible(false);
                        ar.save.setVisible(false);
                        ar.btnEdit.setVisible(true);                            
                        ar.setTextFieldsEditable(false);

                        mainframe.setEnabled(false);
                        ar.addWindowListener(new WindowAdapter() {
                               public void windowClosing(WindowEvent we) {
                                  dispose();
                                  MainFrame.mainframe.setEnabled(true);
                               }
                            });
                        st.close();
                        connection();
                        }

                }catch(Exception e1){e1.printStackTrace();}
            }
            @Override
            public void mouseEntered(MouseEvent e) {
                tblListOfInmates.setCursor(new Cursor(Cursor.HAND_CURSOR));
            }
            @Override
            public void mouseExited(MouseEvent e) {
                tblListOfInmates.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }

        });
        scrollPane_1.setViewportView(tblListOfInmates);

        JLabel lblSelectToView = new JLabel("* Select to view full record");
        lblSelectToView.setBounds(47, 74, 171, 14);
        recordsPanel.add(lblSelectToView);



        st.close();
        connection();
    }catch(Exception e){e.printStackTrace();}


    recordsPanel.setVisible(true);
}
该表已成功更新,但当我再次单击某行时,会出现以下错误:

java.lang.ArrayIndexOutOfBoundsException: -1
    at javax.swing.JTable$1.getValueAt(Unknown Source)
    at RecordManagementSystem.MainFrame$16.mouseClicked(MainFrame.java:805)
    at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
在这一行:

Table_click = tblListOfInmates.getModel().getValueAt(row, 6).toString();

假设您使用的是DefaultTableModel,则只需执行以下操作:


model.setRowCount(0)

假设您使用的是DefaultTableModel,那么您只需执行以下操作:


model.setRowCount(0)

您所做的有几个问题

当您加载数据时,您会

scrollPane_1 = new JScrollPane();

scrollPane_1.setBounds(48, 104, 650, 314);
recordsPanel.add(scrollPane_1);

tblListOfInmates = new JTable(datas, columns){
    public boolean isCellEditable(int nRow, int nCol) {
        return false;
    }
};
//...
scrollPane_1.setViewportView(tblListOfInmates);
当你更新表格时,你会这样做

scrollPane_1 = new JScrollPane();

scrollPane_1.setBounds(48, 104, 650, 314);
recordsPanel.add(scrollPane_1);

tblListOfInmates = new JTable(datas, columns){
    public boolean isCellEditable(int nRow, int nCol) {
        return false;
    }
};
scrollPane_1.setViewportView(tblListOfInmates);
第一个问题是,您没有删除上一个表,因此现在将组件重叠在彼此之上,这意味着您不知道实际与哪个表交互

下一个问题是,你不需要做所有这些。只需创建
JTable
,将其应用于
JScrollPane
,并将其添加到您需要的任何容器中

加载数据时,为数据库中的数据创建一个新的
TableModel
,并将其设置为以前创建的
JTable
的模型

TableModel model = ...;
//...
tblListOfInmates.setModel(model);
这就是我们的原则

这:

这是个坏主意,
TableModel
应该控制哪些内容可以编辑,哪些内容不能编辑

查看和了解更多详细信息

您还应该使用,因为您不控制屏幕分辨率、DPI、渲染管道或可能在不同系统上使用的字体,所有这些都会使您的像素完美布局变成垃圾

如果您创建了从数据库中提取的数据的POJO表示,而不是依赖2D数组,您可能会发现这更容易,但这只是我

MouseListener
也让我担心

tblListOfInmates.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        try{
            int row = tblListOfInmates.getSelectedRow();
            Table_click = tblListOfInmates.getModel().getValueAt(row, 6).toString();

            if(rs.next()){

执行
if
语句时,您已经移动到结果集的末尾…

您正在执行的操作有几个问题

当您加载数据时,您会

scrollPane_1 = new JScrollPane();

scrollPane_1.setBounds(48, 104, 650, 314);
recordsPanel.add(scrollPane_1);

tblListOfInmates = new JTable(datas, columns){
    public boolean isCellEditable(int nRow, int nCol) {
        return false;
    }
};
//...
scrollPane_1.setViewportView(tblListOfInmates);
当你更新表格时,你会这样做

scrollPane_1 = new JScrollPane();

scrollPane_1.setBounds(48, 104, 650, 314);
recordsPanel.add(scrollPane_1);

tblListOfInmates = new JTable(datas, columns){
    public boolean isCellEditable(int nRow, int nCol) {
        return false;
    }
};
scrollPane_1.setViewportView(tblListOfInmates);
第一个问题是,您没有删除上一个表,因此现在将组件重叠在彼此之上,这意味着您不知道实际与哪个表交互

下一个问题是,你不需要做所有这些。只需创建
JTable
,将其应用于
JScrollPane
,并将其添加到您需要的任何容器中

加载数据时,为数据库中的数据创建一个新的
TableModel
,并将其设置为以前创建的
JTable
的模型

TableModel model = ...;
//...
tblListOfInmates.setModel(model);
这就是我们的原则

这:

这是个坏主意,
TableModel
应该控制哪些内容可以编辑,哪些内容不能编辑

查看和了解更多详细信息

您还应该使用,因为您不控制屏幕分辨率、DPI、渲染管道或可能在不同系统上使用的字体,所有这些都会使您的像素完美布局变成垃圾

如果您创建了从数据库中提取的数据的POJO表示,而不是依赖2D数组,您可能会发现这更容易,但这只是我

MouseListener
也让我担心

tblListOfInmates.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        try{
            int row = tblListOfInmates.getSelectedRow();
            Table_click = tblListOfInmates.getModel().getValueAt(row, 6).toString();

            if(rs.next()){

执行
if
语句时,您已经移动到结果集的末尾…

scrollPane\u 1.setBounds(48、104、650、314)javagui可能必须在许多平台上工作,在不同的屏幕分辨率上&使用不同的plaf。因此,它们不利于部件的精确放置。为了组织一个健壮的GUI组件,可以使用布局管理器,或者,为了更快地获得更好的帮助,可以使用布局填充和边框,发布一个(最简单的、完整的、经过测试的、可读的示例)。2) 不更新表,更新模型。其他一切都是自动的。
scrollPane_1.setBounds(48104650314)javagui可能必须在许多平台上工作,在不同的屏幕分辨率上&使用不同的plaf。因此,它们不利于部件的精确放置。为了组织一个健壮的GUI组件,可以使用布局管理器,或者,为了更快地获得更好的帮助,可以使用布局填充和边框,发布一个(最简单的、完整的、经过测试的、可读的示例)。2) 不更新表,更新模型。其他一切都是自动的。谢谢你的回答,先生,解释得很好。谢谢你的回答,先生,解释得很好。这对我帮助很大