谁能告诉我刷新 JTable 的最佳方法?我曾尝试table.repaint()
从另一个线程使用,但我不知道这是否是最好的方法。
我的代码:
类别:模型
public class CLS_ValueUpdater extends Thread {
private String sRowName;
private String sValue;
public CLS_ValueUpdater(String sRowName) {
this.sRowName = sRowName;
this.start();
}
public String getValue() {
return this.sValue;
}
public String getRowName() {
return sRowName;
}
public void setRowName(String sRowName) {
this.sRowName = sRowName;
}
public void run() {
try {
for (int i = 0; i <= 100; i++) {
this.sValue = String.valueOf(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
类别:控制器
public class CLS_Controller extends AbstractTableModel {
private static final long serialVersionUID = -5603593230985106202L;
private String[] sArrColumns = { "Nombre", "Valor" };
private ArrayList<CLS_ValueUpdater> tListUpdater = new ArrayList<CLS_ValueUpdater>();
public CLS_Controller() {
super();
}
public void addRow(String sName) {
this.tListUpdater.add(new CLS_ValueUpdater(sName));
this.fireTableDataChanged();
}
public void deleteRow(int iIndex) {
this.tListUpdater.remove(iIndex);
this.fireTableDataChanged();
}
@Override
public String getColumnName(int iColumn) {
return this.sArrColumns[iColumn];
}
@Override
public int getColumnCount() {
return this.sArrColumns.length;
}
@Override
public int getRowCount() {
return this.tListUpdater.size();
}
@Override
public Object getValueAt(int iRow, int iColumn) {
CLS_ValueUpdater tValueUpdater = this.tListUpdater.get(iRow);
switch (iColumn) {
case 0:
return tValueUpdater.getRowName();
case 1:
return tValueUpdater.getValue();
default:
return null;
}
}
@Override
public void setValueAt(Object oValue, int iRow, int iColumn) {
CLS_ValueUpdater tValueUpdater = this.tListUpdater.get(iRow);
switch (iColumn) {
case 0:
tValueUpdater.setRowName(oValue.toString());
break;
}
this.fireTableCellUpdated(iRow, iColumn);
}
@Override
public Class<String> getColumnClass(int iColumn) {
return String.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
}
类别:查看
public class FRM_Main {
private JFrame frame;
private JTable table;
private CLS_Controller tModel = new CLS_Controller();
private JTextField textField;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FRM_Main window = new FRM_Main();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public FRM_Main() {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Windows".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 476, 283);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.CENTER);
JScrollPane scrollPane = new JScrollPane();
JButton btnNewButton = new JButton("Add");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
tModel.addRow(textField.getText());
}
});
JButton btnNewButton_1 = new JButton("Delete");
textField = new JTextField();
textField.setColumns(10);
GroupLayout gl_panel = new GroupLayout(panel);
gl_panel.setHorizontalGroup(gl_panel
.createParallelGroup(Alignment.LEADING)
.addGroup(
gl_panel.createSequentialGroup()
.addContainerGap()
.addGroup(
gl_panel.createParallelGroup(
Alignment.LEADING)
.addComponent(
scrollPane,
GroupLayout.DEFAULT_SIZE,
440, Short.MAX_VALUE)
.addGroup(
Alignment.TRAILING,
gl_panel.createSequentialGroup()
.addComponent(
textField,
GroupLayout.PREFERRED_SIZE,
GroupLayout.DEFAULT_SIZE,
GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
ComponentPlacement.RELATED)
.addComponent(
btnNewButton)
.addPreferredGap(
ComponentPlacement.RELATED,
216,
Short.MAX_VALUE)
.addComponent(
btnNewButton_1)))
.addContainerGap()));
gl_panel.setVerticalGroup(gl_panel
.createParallelGroup(Alignment.LEADING)
.addGroup(
gl_panel.createSequentialGroup()
.addContainerGap()
.addComponent(scrollPane,
GroupLayout.PREFERRED_SIZE, 194,
GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(
gl_panel.createParallelGroup(
Alignment.BASELINE)
.addComponent(btnNewButton_1)
.addComponent(
textField,
GroupLayout.PREFERRED_SIZE,
GroupLayout.DEFAULT_SIZE,
GroupLayout.PREFERRED_SIZE)
.addComponent(btnNewButton))
.addContainerGap(80, Short.MAX_VALUE)));
table = new JTable();
table.setShowVerticalLines(false);
table.setShowHorizontalLines(false);
table.setFillsViewportHeight(true);
table.setModel(tModel);
new tableUpdater(table);
scrollPane.setViewportView(table);
panel.setLayout(gl_panel);
}
}
class tableUpdater extends Thread {
private JTable tTable;
public tableUpdater(JTable tTable) {
this.tTable = tTable;
this.start();
}
public void run() {
try {
while (true) {
tTable.repaint();
Thread.sleep(2000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
那么有没有什么优雅的方式来自动更新 JTable 呢?提前致谢!