如何使用二维数组刷新 JTable?
How to refresh JTable using 2d array?
我已经实现了一个 JTable 并使用二维数组填充它。我就是这样做的
public JTable executeTable( ) {
Object[] columns = new String[] {
"ID", "Room No", "Floor No", "CO2 Level", "Smoke Level", "Status"
};
ArrayList<FloorDetails> arrayList = clientMain.getSensors();
Object[][] data = new Object[arrayList.size()][6];
for(int i = 0; i < arrayList.size(); i++) {
data[i][0] = arrayList.get(i).getId();
data[i][1] = arrayList.get(i).getRoomNo();
data[i][2] = arrayList.get(i).getFloorNo();
data[i][3] = arrayList.get(i).getCo2Level();
data[i][4] = arrayList.get(i).getSmokeLevel();
data[i][5] = arrayList.get(i).getStatus();
}
table = new JTable(data,columns) {
@Override
public boolean isCellEditable(int row, int column) {
// TODO Auto-generated method stub
return column == 0 || column == 3 || column == 4 || column == 5 ? true : false;
}
};
frame.setTitle("Sensor Details");
return table;
}
private void initialize() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
table = executeTable();
frame.getContentPane().add(table.getTableHeader(), BorderLayout.PAGE_START);
frame.getContentPane().add(table, BorderLayout.CENTER);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setTitle("Sensor Details");
}
现在我被要求每 30 秒刷新一次 table。因此,我正在尝试实现以下计时器来刷新 table。但我不明白的是如何使用二维数组设置值(刷新 table),因为我从服务器获取 ArrayList
中的所有值
public void refreshTimer() {
Timer timer = new Timer(0, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ArrayList<FloorDetails> arrayList = clientMain.getSensors();
Object[][] data = new Object[arrayList.size()][6];
for(int i = 0; i < arrayList.size(); i++) {
data[i][0] = arrayList.get(i).getId();
data[i][1] = arrayList.get(i).getRoomNo();
data[i][2] = arrayList.get(i).getFloorNo();
data[i][3] = arrayList.get(i).getCo2Level();
data[i][4] = arrayList.get(i).getSmokeLevel();
data[i][5] = arrayList.get(i).getStatus();
}
//I want to refresh the table with new data set received from the server as an array list
}
});
timer.setDelay(30000); // delay for 30 seconds
timer.start();
}
我在网上找到了一些使用fireDataChanged
方法的例子。但是他们都使用 ResultSet
直接检索数据。就我而言,我收到一个 ArrayList。
我怎样才能做到这一点?还是有其他方法可以做到这一点?提前致谢!
使用 initialize
和 executeTable
方法将 updateTable
方法添加到 class。
public void updateTable(List<FloorDetails> arrayList) {
DefaultTableModel dataModel = new DefaultTableModel();
for (int i = 0; i < arrayList.size(); i++) {
Object[] rowData = new Object[6];
rowData[0] = arrayList.get(i).getId();
rowData[1] = arrayList.get(i).getRoomNo();
rowData[2] = arrayList.get(i).getFloorNo();
rowData[3] = arrayList.get(i).getCo2Level();
rowData[4] = arrayList.get(i).getSmokeLevel();
rowData[5] = arrayList.get(i).getStatus();
dataModel.addRow(rowData);
}
table.setModel(dataModel);
}
将 class 的实例传递给 Timer
中的匿名 class,并调用 updateTable
方法。使用 SwingUtilities invokeLater
方法调用 updateTable
,以便 JTable
更新在 Event Dispatch Thread.
上完成
您可能还想修改 executeTable
方法以使用 DefaultTableModel
。
我已经实现了一个 JTable 并使用二维数组填充它。我就是这样做的
public JTable executeTable( ) {
Object[] columns = new String[] {
"ID", "Room No", "Floor No", "CO2 Level", "Smoke Level", "Status"
};
ArrayList<FloorDetails> arrayList = clientMain.getSensors();
Object[][] data = new Object[arrayList.size()][6];
for(int i = 0; i < arrayList.size(); i++) {
data[i][0] = arrayList.get(i).getId();
data[i][1] = arrayList.get(i).getRoomNo();
data[i][2] = arrayList.get(i).getFloorNo();
data[i][3] = arrayList.get(i).getCo2Level();
data[i][4] = arrayList.get(i).getSmokeLevel();
data[i][5] = arrayList.get(i).getStatus();
}
table = new JTable(data,columns) {
@Override
public boolean isCellEditable(int row, int column) {
// TODO Auto-generated method stub
return column == 0 || column == 3 || column == 4 || column == 5 ? true : false;
}
};
frame.setTitle("Sensor Details");
return table;
}
private void initialize() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
table = executeTable();
frame.getContentPane().add(table.getTableHeader(), BorderLayout.PAGE_START);
frame.getContentPane().add(table, BorderLayout.CENTER);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setTitle("Sensor Details");
}
现在我被要求每 30 秒刷新一次 table。因此,我正在尝试实现以下计时器来刷新 table。但我不明白的是如何使用二维数组设置值(刷新 table),因为我从服务器获取 ArrayList
中的所有值public void refreshTimer() {
Timer timer = new Timer(0, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ArrayList<FloorDetails> arrayList = clientMain.getSensors();
Object[][] data = new Object[arrayList.size()][6];
for(int i = 0; i < arrayList.size(); i++) {
data[i][0] = arrayList.get(i).getId();
data[i][1] = arrayList.get(i).getRoomNo();
data[i][2] = arrayList.get(i).getFloorNo();
data[i][3] = arrayList.get(i).getCo2Level();
data[i][4] = arrayList.get(i).getSmokeLevel();
data[i][5] = arrayList.get(i).getStatus();
}
//I want to refresh the table with new data set received from the server as an array list
}
});
timer.setDelay(30000); // delay for 30 seconds
timer.start();
}
我在网上找到了一些使用fireDataChanged
方法的例子。但是他们都使用 ResultSet
直接检索数据。就我而言,我收到一个 ArrayList。
我怎样才能做到这一点?还是有其他方法可以做到这一点?提前致谢!
使用 initialize
和 executeTable
方法将 updateTable
方法添加到 class。
public void updateTable(List<FloorDetails> arrayList) {
DefaultTableModel dataModel = new DefaultTableModel();
for (int i = 0; i < arrayList.size(); i++) {
Object[] rowData = new Object[6];
rowData[0] = arrayList.get(i).getId();
rowData[1] = arrayList.get(i).getRoomNo();
rowData[2] = arrayList.get(i).getFloorNo();
rowData[3] = arrayList.get(i).getCo2Level();
rowData[4] = arrayList.get(i).getSmokeLevel();
rowData[5] = arrayList.get(i).getStatus();
dataModel.addRow(rowData);
}
table.setModel(dataModel);
}
将 class 的实例传递给 Timer
中的匿名 class,并调用 updateTable
方法。使用 SwingUtilities invokeLater
方法调用 updateTable
,以便 JTable
更新在 Event Dispatch Thread.
您可能还想修改 executeTable
方法以使用 DefaultTableModel
。