更改时的JTable加载值,加载时显示进度条

时间:2012-04-11 23:48:23

标签: java swing jtable tablemodel tablecellrenderer

所以我正在使用JTable,它有 A-K 列。 A B 是唯一可编辑的。如果有人在 A 中编辑了一个空行,我会进行API调用以获取 B 然后我进行数据库调用以获取所有行 B 如果有人在 B 中编辑了一个空行,我也会进行相同的调用,也会从该行的数据库中检索该行。该调用返回0-N行。如果返回0行,我将除 B 之外的所有行的值更改为N / A,否则我使用data填充行。一旦填充,我将使所有列不可编辑。 DB调用发生在它自己的线程中,因为一旦调用返回我创建我自己的记录对象,我将其添加到tablemodel。

我有自己的TableModelTableModelListener来保存数据并处理值的变化。

这是我的问题。我正在使用TableCellRenderer并使用 cellrenderer 来查看值是否已更改,如果是,那么我会根据需要进行调用并填充。当从DB中提取大量行时,加载并制作所有记录需要一段时间,因此我尝试使用ProgressBar向用户显示屏幕不仅仅是冻结的,它正在进行中多少钱但是,出现的帧是空白的,没有显示任何内容。我感觉我正在做一些不正确或缺少某事的事情。任何帮助都非常感激。

一些代码来理解我在说什么

public class MyPanel extends JPanel {
    private JTable myTable;
    private MyTableModel tm;
    //OTHER FIELDS

    public static void createPanel() {
           tm = new MyTableModel(columnnames);
           myTable = new JTable(tm);

           TableColumn account = myTable.getColumnModel().getColumn(
            MyTableModel.ACCOUNT_INDEX);
    account.setCellRenderer(new MyTableRenderer(
            MyTableModel.ACCOUNT_INDEX));
    }
}

public class MyTableRenderer extends DefaultTableCellRenderer{

   protected int interactiveColumn;

   public MyTableRenderer(int interactiveColumn) {
        this.interactiveColumn = interactiveColumn;
    }

   public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        Component c = super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, column);
        if (column == interactiveColumn && hasFocus) {
             //DO DB and API CALLS HERE
             //IF DB CALL DISPLAY A NEW FRAME WITH PROGRESSBAR
        }
        return c;
   }
}

对不起格式问题

1 个答案:

答案 0 :(得分:4)

使用SwingWorker,可以在检查结果集时更新TableModel

附录:不要尝试从渲染器更新TableModel。通过在CellEditor中启动合适的工作人员,您可以在getCellEditorValue()的实施结束后更新模型。这样,下次为任何修改过的单元格调用渲染器时,修改后的数据将可用。这个相关的example概述了这种方法。

附录:编辑结束后调用getCellEditorValue(),但启动setValueAt()中的工作人员可以更可靠地访问目标行和列。

相关问题