2012-04-11 128 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