我正在尝试制作一个表格,每个单元格可以有不同的颜色,具体取决于我从 mysql 带来的日期,问题是,当我尝试将查询中的日期带入新渲染器时,程序运行如此很慢,直到崩溃,netbenas 向我显示了很多消息“连接成功”,然后“连接关闭”,那是因为它连接了很多时间到 mysql。
我的渲染器代码需要帮助
public class MiRender extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
cell = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (!mes.getSelectedItem().toString().equals("All")) {
tabla.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
} else {
tabla.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
}
tabla.setRowHeight(26);
if (column == 0) {
tabla.setCellSelectionEnabled(false);
tabla.setEnabled(false);
} else {
tabla.setCellSelectionEnabled(true);
tabla.setEnabled(true);
}
tabla.getColumnModel().getColumn(0).setCellRenderer(tabla.getTableHeader().getDefaultRenderer());
DataBase db = new DataBase();
ResultSet /*Dudas de variable ResultSet se encuentran en línea 207 de EVR_Main*/ rs;
rs = db.getRecords( /*Ver funciones de método getRecords en línea 192 de EVR_Main*/
"SELECT Start_Date, End_Date, idmae, State FROM Capacity ");
try {
rs.beforeFirst();
while (rs.next()) {
if (isSelected) {
tabla.setRowSelectionInterval(tabla.getSelectedRow(), tabla.getSelectedRow());
cell.setBackground(new Color(colo));
cell.setForeground(Color.black);
cell.setOpaque(true);
cell.setBorder(BorderFactory.createLineBorder(Color.blue));
} else if (rs.getDate(1)== lastdate) {
cell.setBackground(Color.yellow);
cell.setForeground(Color.blue);
cell.setOpaque(true);
cell.setBorder(BorderFactory.createLineBorder(Color.blue));
} else {
// Restaurar los valores por defecto
cell.setBackground(Color.WHITE);
cell.setForeground(Color.BLACK);
cell.setOpaque(true);
cell.setBorder(BorderFactory.createLineBorder(Color.gray));
}
}
} catch (SQLException ex) {
Logger.getLogger(Capacity.class.getName()).log(Level.SEVERE, null, ex);
}
db.closeConnection();
return this;
}
}
最佳答案
您正在表格单元格渲染器中执行 SQL 查询。这是完全错误的。考虑到渲染器一次只处理一个单元格,这意味着将为每个渲染单元格执行查询,这种情况可能会非常频繁地发生。因此渲染速度会非常慢。由于它发生在 AWT 事件线程中,这将导致整个 UI 看起来实际上卡住了。
您需要重新设计代码,以便查询在渲染器外部执行并且频率要低得多,并将查询结果的字段存储在单独的数据结构中,例如值对象的列表或数组,每个 VO代表查询中的表行。
然后,您需要能够将这些对象中的每一个与 JTable 中的位置(行和/或列坐标)相关联,或者至少与作为输入发送到单元格渲染器的 value
参数相关联。这通常是通过使用适当的表模型来完成的。
所有这些概念都在 How to Use Tables 中进行了说明。 Swing 教程的一部分,我邀请您仔细阅读它。
关于java - 是否可以在 JTable 渲染器中进行查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26427068/