我采用了多个线程处理我的运算逻辑, 并通过一个监视线程来检查其更新情况. 将新结果保存在TableModel中.在主界面上采用JTable同TableModel的绑定来显示程序运行结果.通过调用setValueAt(Object value, int row, int col)和fireTableCellUpdated(row, col)程序来刷新界面.结果主窗体的JTable数据项未刷新.只有当点击相应的行或最大化/最小化窗体才能及时刷新.
请教各位大侠,如何解决此类问题?
先谢谢了

解决方案 »

  1.   

    // table.updateUI();
    import java.awt.Component;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SpringLayout;
    import javax.swing.table.AbstractTableModel;public class JTableTest extends JFrame
    {
    class TableTableModel extends AbstractTableModel
    {
    public final String[] COLUMN_NAMES = new String[] { "繁体", "简体" }; private ArrayList rows=new ArrayList(); public int getRowCount()
    {
    return rows.size();
    } public int getColumnCount()
    {
    return COLUMN_NAMES.length;
    } public String getColumnName(int columnIndex)
    {
    return COLUMN_NAMES[columnIndex];
    } public Object getValueAt(int rowIndex, int columnIndex)
    {
    return ((String[]) rows.get(rowIndex))[columnIndex];
    } public void addRow(String[] row)
    {
    rows.add(row);
    } public boolean isCellEditable(int rowIndex, int columnIndex)
    {
    // TODO 自动生成方法存根
    return super.isCellEditable(rowIndex, columnIndex);
    }
    } private JTable table; private SpringLayout springLayout; private TableTableModel tableTableModel; /**
     * Launch the application
     * 
     * @param args
     */
    public static void main(String args[])
    {
    try
    {
    JTableTest frame = new JTableTest();
    frame.setVisible(true);
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    } /**
     * Create the frame
     */
    public JTableTest()
    {
    super();
    springLayout = new SpringLayout();
    getContentPane().setLayout(springLayout);
    setBounds(100, 100, 500, 375);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final JScrollPane scrollPane = new JScrollPane();
    getContentPane().add(scrollPane);
    springLayout.putConstraint(SpringLayout.SOUTH, scrollPane, -5, SpringLayout.SOUTH, getContentPane());
    springLayout.putConstraint(SpringLayout.EAST, scrollPane, -5, SpringLayout.EAST, getContentPane());
    springLayout.putConstraint(SpringLayout.NORTH, scrollPane, 5, SpringLayout.NORTH, getContentPane());
    springLayout.putConstraint(SpringLayout.WEST, scrollPane, 5, SpringLayout.WEST, getContentPane());
    table = new JTable();
    tableTableModel = new TableTableModel();
    table.setModel(tableTableModel);
    scrollPane.setViewportView(table); final JMenuBar menuBar = new JMenuBar();
    setJMenuBar(menuBar); final JMenu fileMenu = new JMenu();
    fileMenu.setText("File");
    menuBar.add(fileMenu); final JMenuItem addMenuItem = new JMenuItem();
    addMenuItem.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e)
    {
    for (int i = 0; i < 10; i++)
    {
    tableTableModel.addRow(new String[] { "Row" + i, "Row" + i });
    }
    table.updateUI();
    }
    });
    addMenuItem.setText("ADD");
    fileMenu.add(addMenuItem);
    //
    } private static void addPopup(Component component, final JPopupMenu popup)
    {
    component.addMouseListener(new MouseAdapter()
    {
    public void mousePressed(MouseEvent e)
    {
    if (e.isPopupTrigger())
    showMenu(e);
    } public void mouseReleased(MouseEvent e)
    {
    if (e.isPopupTrigger())
    showMenu(e);
    } private void showMenu(MouseEvent e)
    {
    popup.show(e.getComponent(), e.getX(), e.getY());
    }
    });
    }
    }
      

  2.   

    注意在设置组件的显示值後,调用相应组件的updateUI()方法