java - 如何刷新JTable

标签 java swing jtable

我正在制作一个简单的程序,显示 2016 年法国欧洲杯的球队、比赛和进球数。 更改查询时,JTable 遇到一些问题。 发生的情况如下:

http://i60.tinypic.com/kcxe1c.png

enter image description here

当我从(例如)10 行的表更改为另一个仅包含 5 行的表时,它可以工作。但是,如果我将一个包含 5 行的表更改为另一个包含 10 行的表,则该表不会更改,它仅显示 5 行。 代码如下:

public class Euro2016GUI extends JFrame {

private Container container;
private Sfondo pnlSfondo;
JTable table;
JPanel panel;

static Vector<Vector<String>> data = new Vector<Vector<String>>();
static Vector<String> headers = new Vector<String>();

public Euro2016GUI() {
    data.removeAll(data);
    headers.removeAll(headers);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    this.setSize(600, 400);
    this.setTitle("Euro2016");
    this.setLocationRelativeTo(null);
    pnlSfondo = new Sfondo();

    container = this.getContentPane();
    container.add(pnlSfondo);
}

public void createTable(String pQuery) {
    data.removeAll(data);
    headers.removeAll(headers);

    Control control = new Control();

    panel = new JPanel(new BorderLayout());
    panel.setSize(300, 300);
    panel.setBackground(Color.red);

    control.getData(pQuery);
    data = control.getData();
    headers = control.getHeaders();

    //this is the model which contain actual body of JTable
    DefaultTableModel model = new DefaultTableModel(data, headers);

    table = new JTable(model);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    table.setEnabled(false);
    table.setMaximumSize(new Dimension(100, 300));

    header_size();

    JScrollPane scroll = new JScrollPane(table);
    //scroll.setSize(600, 400);
    scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

    this.getContentPane().add(panel);
    panel.add(scroll, BorderLayout.CENTER);
}

public void header_size() {
    int colonne = table.getColumnModel().getColumnCount();
    TableColumn column;

    for (int i = 0; i < colonne; i++) {
        column = table.getColumnModel().getColumn(i);
        column.setPreferredWidth(200);
    }
}

public void cleanData() {

    if (table != null) {
        DefaultTableModel dm = (DefaultTableModel) table.getModel();
        dm.setRowCount(0);
        table.revalidate();
    }
    data.removeAll(data);
    headers.removeAll(headers);
   }
}

类(class)控制

public class Control {

private static Vector<Vector<String>> data = new Vector<Vector<String>>();
private static Vector<String> headers = new Vector<String>();

public void getData(String pQuery) {

    // Enter Your MySQL Database Table name in below Select Query.
    String query = pQuery;
    Connection con = null;
    ResultSet rs;
    Statement st = null;
    int colonne = 0;

    data.removeAll(data);
    headers.removeAll(headers);

    try {
        con = DBConnectionPool.getConnection();
        st = con.createStatement();

        rs = st.executeQuery(query);

        ResultSetMetaData rsmd = rs.getMetaData();
        colonne = rsmd.getColumnCount();

        for (int i = 1; i <= colonne; i++) {
            headers.add(rsmd.getColumnName(i));
        }

        while (rs.next()) {
            Vector<String> d = new Vector<String>();

            for (int i = 1; i <= colonne; i++) {
                d.add(rs.getString(i));
            }
            data.add(d);
        }

    } catch (SQLException e) {
        e.printStackTrace();

    } finally {
        if (st != null) {
            try {
                st.close();
            } catch (SQLException ex) {
                Logger.getLogger(DataInJTable.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        if (con != null) {
            DBConnectionPool.releaseConnection(con);
        }
    }
}

public Vector<Vector<String>> getData() {
    return this.data;
}

public Vector<String> getHeaders() {
    return this.headers;
}

}

菜单中的 Action 监听器:

...
 //----ROSE---//
 private class OnClickRose implements ActionListener {

    Sfondo sfondo;

    @Override
    public void actionPerformed(ActionEvent e) {
        String str = e.getActionCommand();
        str = str.replace("[", "");
        str = str.replace("]", "");

        String sx = "'";
        String dx = "'";
        String query = query2.concat(sx.concat(str.concat(dx)));
        //frame.cleanData();

        sfondo = frame.getPnlSfondo();
        if (sfondo.isVisible() && sfondo.getParent().isVisible()) {
            sfondo.setVisible(false);
        }

        frame.createTable(query);
    }
}

 //----CALENDARIO----//
private class OnClickCalendario implements ActionListener {

    Sfondo sfondo;

    @Override
    public void actionPerformed(ActionEvent e) {

        frame.cleanData();
        sfondo = frame.getPnlSfondo();

        if (sfondo.isVisible() && sfondo.getParent().isVisible()) {
            sfondo.setVisible(false);
        }

        frame.createTable(query4);
    }
}

//----CLASSIFICA MARCATORI----//
private class OnClickMarcatori implements ActionListener {

    Sfondo sfondo;

    @Override
    public void actionPerformed(ActionEvent e) {

        frame.cleanData();
        sfondo = frame.getPnlSfondo();

        if (sfondo.isVisible() && sfondo.getParent().isVisible()) {
            sfondo.setVisible(false);
        }

        frame.createTable(query3);
    }
}
...

谁能告诉我哪里错了?

最佳答案

基本上,为了告诉表自行刷新,您只需调用其表模型的方法 fireTableDataChanged() 即可。 因此,在您的示例中,运行查询后,您可以调用:

((DefaultTableModel)yourTable.getModel()).fireTableDataChanged();

但我建议你停止使用默认的表模型,并实现你自己的表模型。工作起来容易多了。

关于java - 如何刷新JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28250698/

相关文章:

java - 检查 JTable 是否包含带标识符的列

通过 JPA 绑定(bind) Java JTable

java - JTable 更改选择而不闪烁 ui

java - Junit 控制台输出到日志

java - 为什么我无法将一个值从一个 XYSeriesCollection 复制到另一个 XYSeriesCollection?

Java:如何在 session 中记录任何内容?

java - 如何将 CaretEvent.getDot() 转换为直角坐标?

Java Swing : problems with width

java - 如何以编程方式确定当前类的 Java 字节码版本?

java - Java EE 7 中 JMS API 的现代化