2012-04-11 77 views
2

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

我有我自己的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; 
    } 
} 

对不起,格式问题

回答

4

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

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

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

+0

嗯,我很抱歉,我想我没有清楚地解释自己。我正在使用SwingWorker来处理结果集并创建记录对象。不过,我并没有将这个记录对象添加到摆轮工作台中的表模型中,而是添加到该表格单元格渲染器中。当用户失去对他刚刚编辑的列的关注时,我想运行我的命令,经过一些Google搜索后,我发现上面的代码按我的意思去做。是否有一些替代方法可以避免更新可以推荐的更改行 – dsymquen 2012-04-12 00:10:56

+1

您需要一个'CellEditor';更上面。 – trashgod 2012-04-12 00:46:14

+0

谢谢,我知道我的方法不是最好的,这有助于很多。 – dsymquen 2012-04-12 14:47:46