繁体   English   中英

添加新行后,JTable不会刷新

[英]JTable doesn't refresh after adding new row

我在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);
}

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)EDT == 事件派遣线程

7)SSCCE

  • 的DefaultTableModel

  • model.addRow(行);

  • 自我包容

  • 正确

然后

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);
            }
        });
    }
}

我知道它的旧,但我有同样的问题,解决方案是添加

jTable1.setAutoCreateColumnsFromModel(true);

1.填充jtable数据:

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

}

2.然后调用更新功能按钮动作事件并刷新jtable

有关更多信息,您可以查看本教程: 如何在插入删除或更新java Netbeans ID中的数据后刷新JTable

我知道这是旧的,但我最近有同样的问题,解决方案是打电话

model.fireTableDataChanged();

将新行添加到模型后。

问题是这样的:我有一张桌子,我允许排序。 在没有单击列标题以便行相应排序的情况下,我能够通过调用table.revalidate();向模型添加数据并查看表中的更改table.revalidate(); 但是,如果我在任何时候点击了列标题,那么之后添加的任何行都不会显示,尽管模型数据正在正确更新。 只调用model.fireTableDataChanged(); 将数据添加到模型后,它可以作为一个魅力。

  1. 我创建了一个新项目,我选择了一个新框架并将一个表格,一个标签,一个文本字段和一个按钮从摇摆控件拖到你的框架上。

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

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

下载rs2xml.jar

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

右键单击项目>属性>库>添加Jar /文件夹>选择jar>确定

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);
   }

}

然后运行项目......

你也可以按照这个教程: -

如何在插入删除或更新java Netbeans ID中的数据后刷新JTable

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();
}

}

查看一些记录

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM