【问题标题】:JTable doesn't refresh after adding new row添加新行后JTable不刷新
【发布时间】:2012-04-09 11:21:21
【问题描述】:

我在 JScrollPane 中有一个 JTable。调用应该填充表格的函数后,我看不到任何更改!我试过table.repaint()model.fireTableDataChanged() 和其他一些我已经不记得的东西了——没有任何效果。我做错了什么??

我的功能:

public static void fillVodicTable(JTable table){

    DefaultTableModel model=new DefaultTableModel(); //also tried (DefaultTableModel)table.getModel();
    table.setModel(model);
    model.setColumnIdentifiers(new String[]{"Ime", "Priimek", "Epošta", "Datum rojstva", "Licenca", "Jeziki"});
    String [] row={"a","b","c","d","e","f"};

    model.addRow(row);
}

【问题讨论】:

    标签: java swing jtable refresh


    【解决方案1】:

    1) 没有理由为DefaultTableModel 调用model.fireTableDataChanged()

    2) 没有理由调用table.repaint(),没用

    3) for(Jezik j : v.getTuji_jeziki()) row[5]+=", "+j.toString(); 是什么,您的问题可能超过 100%**

    4) DefaultTableModel 适用于所有情况,但只需要在 EDT 上更新,另一方面,这是所有 Swing JComponents 一起出现的常见问题

    5) 为了获得更好的帮助,请尽快使用SSCCE 编辑您的问题

    6) 美国东部时间 == Event Dispatch Thread

    7) SSCCE

    • DefaultTableModel

    • model.addRow(row);

    • 自成体系

    • 正确

    • 示例

    然后

    import java.awt.*;
    import java.awt.event.*;
    import java.util.Random;
    import javax.swing.*;
    import javax.swing.border.LineBorder;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellRenderer;
    
    public class DefaultTableModelDemo {
    
        public static final String[] COLUMN_NAMES = {
            "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"
        };
        private DefaultTableModel model = new DefaultTableModel(COLUMN_NAMES, 0);
        private JTable table = new JTable(model);
        private JPanel mainPanel = new JPanel(new BorderLayout());
        private Random random = new Random();
    
        public DefaultTableModelDemo() {
            JButton addDataButton = new JButton("Add Data");
            JPanel buttonPanel = new JPanel();
            buttonPanel.add(addDataButton);
            addDataButton.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    addDataActionPerformed();
                }
            });
            model = new DefaultTableModel(COLUMN_NAMES, 0) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public Class getColumnClass(int column) {
                    return getValueAt(0, column).getClass();
                }
            };
            table = new JTable(model) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                    Component c = super.prepareRenderer(renderer, row, column);
                    if (isRowSelected(row) && isColumnSelected(column)) {
                        ((JComponent) c).setBorder(new LineBorder(Color.red));
                    }
    
                    return c;
                }
            };
            mainPanel.add(new JScrollPane(table), BorderLayout.CENTER);
            mainPanel.add(buttonPanel, BorderLayout.SOUTH);
        }
    
        private void addDataActionPerformed() {
            for (int i = 0; i < 5; i++) {
                Object[] row = new Object[COLUMN_NAMES.length];
                for (int j = 0; j < row.length; j++) {
                    row[j] = random.nextInt(5);
                }
                model.addRow(row);
            }
        }
    
        public JComponent getComponent() {
            return mainPanel;
        }
    
        public static void main(String[] args) {
            java.awt.EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    JFrame frame = new JFrame("DefaultTableModelDemo");
                    frame.getContentPane().add(new DefaultTableModelDemo().getComponent());
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }
    

    【讨论】:

    • 我已将示例编辑为符合 SSCCE 标准。另外,用我的应用程序试过这个,没有区别。另外,EDT 是什么意思?
    • 毒品和酒精真的很糟糕,肯定只有少量,可以downvoter分享你的理由
    • 我没有对您投反对票 - 我很感谢您的回复。先生,我发现我简直是愚蠢的。我用错误的参数(错误的表)调用了这个函数!所以现在它按原来的方式工作了——但我必须切换一个标签才能看到变化。我想我应该重新粉刷一些东西(但不是桌子,正如你之前所说的那样没有帮助)。
    • 我认为在欧盟大陆切换到夏令时
    • 也许 :) 你知道如何在不切换标签的情况下重新绘制(我有 CardLayout)吗?
    【解决方案2】:

    我知道它很旧,但是我遇到了同样的问题,解决方案是添加

    jTable1.setAutoCreateColumnsFromModel(true);
    

    【讨论】:

    • 我目前手头没有应用程序,所以我无法测试,但也许它也会对其他人有所帮助。
    【解决方案3】:

    我知道这是旧的,但我最近遇到了同样的问题,解决办法是打电话

    model.fireTableDataChanged();
    

    将新行添加到模型之后。

    问题是:我有一张允许排序的桌子。无需单击列标题以便对行进行相应排序,我可以通过调用 table.revalidate(); 将数据添加到模型并查看表中的更改但是,如果我在任何时候单击列标题,任何行尽管模型数据正在正确更新,但不会显示之后添加的内容。只需在将数据添加到模型后调用model.fireTableDataChanged();,它就可以发挥魅力。

    【讨论】:

      【解决方案4】:

      1.填充jtable数据:

      void update_table() throws SQLException {
         rs=statement.executeQuery("select * from details");
          jTable1.setModel(DbUtils.resultSetToTableModel(rs));
      
      }
      

      2。然后调用按钮动作事件的更新函数并刷新jtable

      有关更多信息,您可以查看本教程: How to refresh JTable after insert delete or update the data in java Netbeans ID

      【讨论】:

        【解决方案5】:
        1. 我创建了一个新项目,其中我选择了一个新框架并将一个表格、一个标签、一个文本字段和一个按钮从摇摆控件拖动到您的框架。

        2.在后端创建一个表...

        1. 从此链接下载 rs2xml jar 文件

        Download rs2xml.jar

        1. 将其添加到项目库中……

        右键项目>属性>库>添加jar/文件夹>选择jar>ok

        5.然后使用以下代码连接mysql

        public class DBConnect {
        
        Connection connection = null;
        
        public Connection getConnection() {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
                System.out.println("connection successfully");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return connection;
        }
        }
        
        1. 使用以下代码调用页面中的函数

          con=new DBConnect();
          statement=con.getConnection().createStatement();
          

        7.然后创建一个更新函数,输入以下代码……

        void update_table() throws SQLException{
            rs=statement.executeQuery("select * from details");
            jTable1.setModel(DbUtils.resultSetToTableModel(rs));
        }
        

        8.在按钮动作事件中输入以下内容并调用更新函数

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        
           try {
               Object name=jTextField1.getText();
               String sql="insert into details (name) values('"+name+"')";
                int  resultset=statement.executeUpdate(sql);
                update_table();
           } catch (SQLException ex) {
               Logger.getLogger(update.class.getName()).log(Level.SEVERE, null, ex);
           }
        

        }

        9.然后运行项目……

        您也可以按照本教程进行操作:--

        How to refresh JTable after insert delete or update the data in java Netbeans ID

        【讨论】:

          【解决方案6】:
          import java.awt.*;
          import java.awt.event.*;
          import javax.swing.*;
          import javax.swing.table.DefaultTableModel;
          class JTableDemo extends JFrame implements ActionListener
          {
          
          JTable jt;
          DefaultTableModel model;
          JButton btn;
          String[] cols={"Dno","DName","Loc"};
          private JPanel mainPanel = new JPanel(new BorderLayout());
          
          public JTableDemo()
          {
              model=new DefaultTableModel(cols,0);
              btn=new JButton("Add Record");
              btn.addActionListener(this);
              jt=new JTable(model);
              btn.setBounds(10, 10, 150, 40);
              mainPanel.setBounds(10,200,300,200);
              add(btn);
              mainPanel.add(new JScrollPane(jt));
              add(mainPanel);
              setLayout(null);
              setSize(500, 600);
              setVisible(true);
          }
          public JComponent getComponent() {
              return mainPanel;
          }
          public void actionPerformed(ActionEvent e) {
              Object[] row = new Object[3];
              row[0]="10";
              row[1]="SW";
              row[2]="PKL";
              model.addRow(row);
          }
          public static void main(String[] args)
          {
              new JTableDemo();
          }
          

          }

          【讨论】:

            猜你喜欢
            • 2014-08-11
            • 1970-01-01
            • 1970-01-01
            • 2016-02-28
            • 2014-07-21
            • 2013-09-05
            • 2021-01-06
            • 1970-01-01
            • 2014-09-06
            相关资源
            最近更新 更多