Refresh.java:执行后,数据每两秒就在JTABLE中添加一条数据bbb(PS:按钮没用)
Nrefresh.java:执行后,单击“Search”按钮开始添加数据,但显示的效果是,3条bbb都添加完了才一起显示出来,为什么不能和Refresh.java那样显示呢???  
  大虾们,请指教一二。。
附上代码:
//Refresh.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
//////////////////////造成不能刷新的原因可能是actionPerformed,但没有解决!!!!!!!!!!!!!!
public class Refresh extends JFrame{
    JPanel contentPane;
    JMenuBar jMenuBar1 = new JMenuBar();//菜单栏:file,help...
    JMenu jMenuFile = new JMenu();
    JMenuItem jMenuFileExit = new JMenuItem();
JToolBar jToolBar = new JToolBar();
    JButton jButton2 = new JButton();
//jTable部分
Vector rowData=new Vector();
    Vector colName=new Vector();
{
colName.addElement("Module");//addElement要放在方法内
colName.addElement("Address");
colName.addElement("Baudrate");
colName.addElement("Checksum");
colName.addElement("Status");
colName.addElement("Description");
}
DefaultTableModel tableModel = new DefaultTableModel(rowData,colName);
    JTable jTable1 = new JTable(tableModel);
    JScrollPane scrollPane=new JScrollPane(jTable1);//把jTable加入滚动条    public Refresh() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
        contentPane = (JPanel) getContentPane();
        setSize(new Dimension(550, 350));
        setTitle("Serial_test");
        jMenuFile.setText("File");
        jMenuFileExit.setText("Exit");
        jButton2.setText("Search");//按下次按钮开始添加数据
        jToolBar.setBounds(new Rectangle(0, 0, 500, 25));
        jMenuBar1.add(jMenuFile);
        jMenuFile.add(jMenuFileExit);
        setJMenuBar(jMenuBar1);
        jToolBar.add(jButton2);
        contentPane.add(jToolBar, java.awt.BorderLayout.NORTH);
        contentPane.add(scrollPane,null);

Vector data=new Vector();
data.add("aaa");
tableModel.addRow(data);
setVisible(true);/***************只有这里和Nrefresh.java不同 *******************************/ for(int i=0;i<500000000;i++)
;
for (int i=0;i<3;++i)
{
//System.out.println("happy");//可以在DOS串口观察,好像动态显示一样,我就是想在jTable中也这样显示
Vector da=new Vector();
da.add("bbb");
tableModel.addRow(da);///////加入数据
jTable1.validate();
jTable1.updateUI(); ////////////???????????为何此处没有起到刷新作用?????????
for(int j=0;j<500000000;j++)//延时,可以看出数据是一个一个加进来的,
;
}
    }
public static void main(String[] args)
{
Refresh ref = new Refresh();
//ref.setVisible(true);
}
 
}
//Nrefresh.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
//////////////////////造成不能刷新的原因可能是actionPerformed,但没有解决!!!!!!!!!!!!!!
public class Nrefresh extends JFrame implements ActionListener{
    JPanel contentPane;
    JMenuBar jMenuBar1 = new JMenuBar();//菜单栏:file,help...
    JMenu jMenuFile = new JMenu();
    JMenuItem jMenuFileExit = new JMenuItem();
JToolBar jToolBar = new JToolBar();
    JButton jButton2 = new JButton();
//jTable部分
Vector rowData=new Vector();
    Vector colName=new Vector();
{
colName.addElement("Module");//addElement要放在方法内
colName.addElement("Address");
colName.addElement("Baudrate");
colName.addElement("Checksum");
colName.addElement("Status");
colName.addElement("Description");
}
DefaultTableModel tableModel = new DefaultTableModel(rowData,colName);
    JTable jTable1 = new JTable(tableModel);
    JScrollPane scrollPane=new JScrollPane(jTable1);//把jTable加入滚动条    public Nrefresh() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
        contentPane = (JPanel) getContentPane();
        setSize(new Dimension(550, 350));
        setTitle("Serial_test");
        jMenuFile.setText("File");
        jMenuFileExit.setText("Exit");
        jMenuFileExit.addActionListener(this);
        jButton2.setText("Search");//按下次按钮开始添加数据
        jButton2.addActionListener(this);
        jToolBar.setBounds(new Rectangle(0, 0, 500, 25));
        jMenuBar1.add(jMenuFile);
        jMenuFile.add(jMenuFileExit);
        setJMenuBar(jMenuBar1);
        jToolBar.add(jButton2);
        contentPane.add(jToolBar, java.awt.BorderLayout.NORTH);
        contentPane.add(scrollPane,null);

Vector data=new Vector();
data.add("aaa");
tableModel.addRow(data); }
    public void actionPerformed(ActionEvent actionEvent) {//单击search的效果是所有数据一下子蹦出来
if(actionEvent.getActionCommand().equals("Exit"))
System.exit(0);
if(actionEvent.getActionCommand().equals("Search"))
{
for (int i=0;i<3;++i)
{
//System.out.println("happy");//可以在DOS串口观察,好像动态显示一样,我就是想在jTable中也这样显示
Vector da=new Vector();
da.add("bbb");
tableModel.addRow(da);///////加入数据
jTable1.validate();
jTable1.updateUI(); ////////////???????????为何此处没有起到刷新作用?????????
for(int j=0;j<500000000;j++)//延时,可以看出数据是一个一个加进来的,
;
}
}
    }
public static void main(String[] args)
{
Nrefresh nref = new Nrefresh();
nref.setVisible(true);
}
 
}

解决方案 »

  1.   

    给个例子你吧,JDK5以上,如果在JDK4得改一下泛型的地方package craky;import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Vector;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SpringLayout;
    import javax.swing.UIManager;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableRowSorter;public class Table implements ActionListener
    {
    private JTable table;

    private TableDataModal tableModel;

    private TableRowSorter<TableDataModal> sorter; private SpringLayout springLayout; private JFrame frame; private JButton btnAdd; private JButton btnDelete;

    @SuppressWarnings("unchecked")
    private Vector<Vector> tableDataList = new Vector<Vector>(); public final String[] COLUMN_NAMES = {"序号", "WBS序号", "任务名称", "输出", "实际工时"};

    @SuppressWarnings("unchecked")
    public final Class[] COLUMN_CLASSES = {Integer.class, Integer.class, String.class, String.class, Double.class}; int serialNumber = 1; public static void main(String args[])
    {
    try
    {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    Table window = new Table();
    window.frame.setVisible(true);
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    } public Table()
    {
    initialize();
    } private void initialize()
    {
    frame = new JFrame();
    springLayout = new SpringLayout();
    frame.getContentPane().setLayout(springLayout);
    frame.setTitle("Table");
    frame.setBounds(100, 100, 500, 376);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JScrollPane scrollPane = new JScrollPane();
    frame.getContentPane().add(scrollPane);
    springLayout.putConstraint(SpringLayout.SOUTH, scrollPane, -38, SpringLayout.SOUTH, frame.getContentPane());
    springLayout.putConstraint(SpringLayout.NORTH, scrollPane, 0, SpringLayout.NORTH, frame.getContentPane());
    springLayout.putConstraint(SpringLayout.EAST, scrollPane, 0, SpringLayout.EAST, frame.getContentPane());
    springLayout.putConstraint(SpringLayout.WEST, scrollPane, 0, SpringLayout.WEST, frame.getContentPane()); tableModel = new TableDataModal();
    table = new JTable(tableModel);
    sorter = new TableRowSorter<TableDataModal>(tableModel);
    sorter.toggleSortOrder(0);
    table.setRowSorter(sorter);
    scrollPane.setViewportView(table); btnAdd = new JButton();
    btnAdd.addActionListener(this);
    btnAdd.setText("Add");
    frame.getContentPane().add(btnAdd);
    springLayout.putConstraint(SpringLayout.SOUTH, btnAdd, -4, SpringLayout.SOUTH, frame.getContentPane());
    springLayout.putConstraint(SpringLayout.NORTH, btnAdd, -29, SpringLayout.SOUTH, frame.getContentPane());
    springLayout.putConstraint(SpringLayout.EAST, btnAdd, -81, SpringLayout.EAST, frame.getContentPane());
    springLayout.putConstraint(SpringLayout.WEST, btnAdd, -152, SpringLayout.EAST, frame.getContentPane()); btnDelete = new JButton();
    btnDelete.addActionListener(this);
    btnDelete.setText("Delete");
    frame.getContentPane().add(btnDelete);
    springLayout.putConstraint(SpringLayout.SOUTH, btnDelete, -4, SpringLayout.SOUTH, frame.getContentPane());
    springLayout.putConstraint(SpringLayout.NORTH, btnDelete, -29, SpringLayout.SOUTH, frame.getContentPane());
    springLayout.putConstraint(SpringLayout.EAST, btnDelete, -5, SpringLayout.EAST, frame.getContentPane());
    springLayout.putConstraint(SpringLayout.WEST, btnDelete, -76, SpringLayout.EAST, frame.getContentPane());
    }

    public void actionPerformed(ActionEvent e)
    {
    if(e.getSource() == btnAdd)
    {
    Vector<Object> data = new Vector<Object>();
    data.add(serialNumber++);
    data.add(002);
    data.add("变更");
    data.add("无");
    data.add(2.5);
    tableDataList.add(data);
    tableModel.insertRow(1);
    }
    else if(e.getSource() == btnDelete)
    {
    if(!tableDataList.isEmpty())
    {
    tableModel.delRow(0, 0);
    }
    }
    } class TableDataModal extends AbstractTableModel
    {
    private static final long serialVersionUID = 1L; /**
     * 获得表格的总列数
     */
    public int getColumnCount()
    {
    return COLUMN_NAMES.length;
    } /**
     * 获得表格的总行数
     */
    public int getRowCount()
    {
    return tableDataList.size();
    } /**
     * 获得表格指定单元格的值
     * @param row 行
     * @param column 列
     */
    public Object getValueAt(int row, int column)
    {
    Object value = null;

    //如果指定单元格非空
    if(!tableDataList.isEmpty())
    {
    value = tableDataList.elementAt(row).elementAt(column);
    }

    return value;
    } /**
     * 获得指定列的列名
     * @param column 指定的列
     */
    public String getColumnName(int column)
    {
    return COLUMN_NAMES[column];
    } /**
     * 获得指定的列对象
     * @param column 指定的列
     */
    @SuppressWarnings("unchecked")
    public Class getColumnClass(int column)
    {
    return COLUMN_CLASSES[column];
    } /**
     * 获得可编辑的单元格
     * @param row 行
     * @param column 列
     */
    public boolean isCellEditable(int row, int column)
    {
    return (row == 0) && (column > 2);
    } /**
     * 设置表格指定单元格的值
     * @param 值
     * @param row 行
     * @param column 列
     */
    @SuppressWarnings("unchecked")
    public void setValueAt(Object value, int row, int column)
    {
    tableDataList.elementAt(row).setElementAt(value, column);
    fireTableDataChanged();
    } /**
     * 在表格末尾插入新行
     * @param rowCouont 将要插入的新行总数
     */
    public void insertRow(int newRowCount)
    {
    int rowCount = getRowCount();
    fireTableRowsInserted(rowCount - newRowCount, rowCount - 1);
    }

    /**
     * 在表格任意位置插入新行
     * @param firstRow 开始行
     * @param lastRow 结束行
     */
    public void insertRow(int firstRow, int lastRow)
    {
    fireTableRowsInserted(firstRow, lastRow);
    } /**
     * 删除指定的行
     * @param firstRow 开始行
     * @param lastRow 结束行
     */
    public void delRow(int firstRow, int lastRow)
    {
    int rowCount = getRowCount();

    if(firstRow > rowCount - 1)
    {
    return;
    }

    for(int i = lastRow; i >= firstRow; i--)
    {
    if(i < rowCount)
    {
    tableDataList.removeElementAt(i);
    }
    else
    {
    lastRow--;
    }
    }

    fireTableRowsDeleted(firstRow, lastRow);
    }

    /**
     * 删除所有行
     */
    public void delAllRow()
    {
    int rowCount = getRowCount();
    tableDataList.clear();
    fireTableRowsDeleted(0, rowCount - 1);
    }
    }
    }