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