【问题标题】:Is it possible to query within a JTable renderer?是否可以在 JTable 渲染器中查询?
【发布时间】:2014-10-17 14:18:40
【问题描述】:

我正在尝试根据我从 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;
    }

}

【问题讨论】:

    标签: java mysql netbeans jtable


    【解决方案1】:

    您正在表格单元格渲染器中执行 SQL 查询。这是完全错误的。考虑到渲染器一次只处理一个单元格,这意味着将对每个渲染的单元格执行查询,这可能会非常频繁地发生。因此渲染会过慢。由于它发生在 AWT 事件线程中,这将导致整个 UI 看起来被有效冻结。

    您需要重新设计您的代码,使查询在渲染器之外执行且频率大大降低,并将查询结果的字段存储在单独的数据结构中,例如值对象的列表或数组,每个 VO表示查询中的表行。

    然后,您需要能够将这些对象中的每一个与 JTable 中的位置(行和/或列坐标)相关联,或者至少与作为输入发送到单元格渲染器的 value 参数相关联。这通常通过使用适当的表模型来完成。

    所有这些概念都在 Swing 教程的 How to Use Tables 部分进行了说明,我邀请您仔细看看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 2011-10-02
      • 2020-11-14
      • 1970-01-01
      相关资源
      最近更新 更多