如何“动画制作"动画向JTable添加行 [英] How to "animate" the adding of rows to a JTable

查看:53
本文介绍了如何“动画制作"动画向JTable添加行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在每次添加一行时显示JTable. 我在下面编写的代码将新行添加到表,然后显示jtable 2秒钟,然后添加另一行,然后显示表.但是jtable没有显示, 仅在添加所有行后显示

I want to display the JTable each time a row is added. The code that i write below add a new row to table , then display the jtable for 2 seconds ,then add another row , then display the table. But the jtable is not displaying , It only display after adding all rows

        Vector<Object> rowVector = null;
        while(rs.next()){
            rowVector = new Vector<Object>();
            for(int i=1;i<=columnCount;i++){
                rowVector.add(rs.getString(i));
                //System.out.print(rs.getString(i));
            }

            System.out.println(rowVector.toString());
            //data.add(rowVector);
            model.addRow(rowVector);
            JTable table1 = new JTable(model);
            JTableHeader header1 = table1.getTableHeader();
            table1.setEnabled(false);
            header1.setResizingAllowed(false);
            header1.setReorderingAllowed(false);
            header1.setForeground(Color.white);
            header1.setBackground(Color.black); 
            jpanedisplay.setViewportView(table1);           
            jpanedisplay.getViewport().setBackground(Color.white);
            jpanedisplay.setBorder(BorderFactory.createLineBorder(Color.black));
            Thread.sleep(3000);

        }

推荐答案

您需要在每次迭代中创建一个新的JTable,而无需这样做.在循环之前将模型添加到表中.只需在循环中向模型添加行

You're creating a new JTable in each iteration, you don't need to do that. Add the model to the table before the loop. And just add rows to the model in the loop

DefaultTableModel model = new DefaultTableModel(columnNames, 0);
JTable table = new JTable(model);

table.setEnabled(false);
JTableHeader header1 = table.getTableHeader();
header1.setResizingAllowed(false);
header1.setReorderingAllowed(false);
header1.setForeground(Color.white);
header1.setBackground(Color.black); 
jpanedisplay.setViewportView(table1);           
jpanedisplay.getViewport().setBackground(Color.white);
jpanedisplay.setBorder(BorderFactory.createLineBorder(Color.black));

...

while(rs.next()){
     Vector<Object> rowVector = new Vector<Object>();
     for(int i=1;i<=columnCount;i++){
         rowVector.add(rs.getString(i));
            //System.out.print(rs.getString(i));
     }
     model.addRow(rowVector);

     // DON'T CALL Thread.sleep();
}


更新

如果您不希望在数据库任务完成之前添加表,只需使用一种方法

If you dont want the table added until the database task is finished, just use a method

private JTable createTable(ResultSet rs) {
    DefaultTableModel model = new DefaultTableModel(columnNames, 0);
    JTable table = new JTable(model);

    table.setEnabled(false);
    JTableHeader header1 = table.getTableHeader();
    header1.setResizingAllowed(false);
    header1.setReorderingAllowed(false);
    header1.setForeground(Color.white);
    header1.setBackground(Color.black);

    while(rs.next()){
        Vector<Object> rowVector = new Vector<Object>();
        for(int i=1;i<=columnCount;i++){
            rowVector.add(rs.getString(i));

        }
        model.addRow(rowVector);
    }

    return table;
}

然后,您可以将其添加到任何面板中

Then you can just add it to what ever panel

panel.add(new JScrollPane(createTable(rs));


UPDATE#2

在Op解释说他们试图使添加的行具有动态外观,而不是一次全部显示.


UPDATE #2

after Op explained that they were trying to get a dynamic look the rows being added, instead of all at One time.

我用java.swing.Timer添加行.

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.table.DefaultTableModel;

public class TestTimerTable {

    String[] cols = {"ID", "Name", "Country Code", "District", "Population"};
    DefaultTableModel model = new DefaultTableModel(cols, 0);
    JTable table = new JTable(model);
    ResultSet rs = null;
    JButton start = new JButton("Start");
    Timer timer = new Timer(0, null);

    public TestTimerTable() {
        initDB();

        JScrollPane scroll = new JScrollPane(table);
        scroll.setViewportView(table);

        JFrame frame = new JFrame("Test Timer Table");
        frame.add(scroll);
        frame.add(start, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        timer = new Timer(200, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    if (rs.next()) {
                        String s1 = rs.getString(1);
                        String s2 = rs.getString(2);
                        String s3 = rs.getString(3);
                        String s4 = rs.getString(4);
                        String s5 = rs.getString(5);
                        model.addRow(new Object[]{s1, s2, s3, s4, s5});
                    } else {
                        ((Timer) e.getSource()).stop();
                    }
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
        });
        start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                timer.start();
            }
        });
    }

    private void initDB() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost/...", "...", "...");
            PreparedStatement ps = conn.prepareStatement("SELECT *  FROM city");
            rs = ps.executeQuery();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestTimerTable();
            }
        });
    }
}

这篇关于如何“动画制作"动画向JTable添加行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆