2

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

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

这是我的问题。我正在使用TableCellRenderer和使用cellrenderer来查看值是否已更改,如果是,则我会进行调用并根据需要进行填充。当从数据库中提取大量行时,加载和制作所有记录需要一段时间,因此我尝试使用 aProgressBar向用户显示屏幕不仅被冻结,它还在进行中,并且正在进行多少。然而,出现的框架是空白的,什么都没有显示。我觉得我在做某事不正确或遗漏了什么。非常感谢任何帮助。

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

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;
   }
}

格式问题抱歉

4

1 回答 1

4

使用SwingWorker,它允许您在TableModel检查结果集时更新您的结果。

附录:不要尝试TableModel从渲染器更新。您可以在您的实施CellEditor结束后更新模型,方法是在getCellEditorValue(). 这样,当下次为任何修改的单元格调用渲染器时,修改后的数据将可用。此相关示例概述了该方法。

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

于 2012-04-12T00:02:03.887 回答