2012-04-11 19 views
2

So arbeite ich mit einem JTable, hat es Spalten A-K. mit A und B sind die einzigen editierbaren. Wenn jemand eine leere Zeile in A Bearbeitungen, mache ich einen API-Aufruf zu erhalten B dann ich eine DB Anruf alle Zeilen zu erhalten, wo B exists.If jemand eine leere Zeile in B bearbeitet, ich mache derselbe Aufruf wie der wird ebenfalls aus der DB für diese Zeile abgerufen. Der Aufruf gibt 0-N Zeilen zurück. Wenn 0 Zeilen zurückgegeben wurden, ändere ich die Werte aller Zeilen mit Ausnahme von B zu N/A, andernfalls befülle ich die Zeilen mit den Daten.Nachdem alle Spalten gefüllt sind, kann ich sie nicht bearbeiten. Der DB-Aufruf findet in einem eigenen Thread statt, sobald der Aufruf zurückgegeben wird, erstelle ich mein eigenes Datensatzobjekt, das ich dem Tabellenmodell hinzufüge.JTable Lastwerte bei Änderung, Fortschrittsbalken beim Laden anzeigen

Ich habe meine eigenen TableModel und eine TableModelListener, um die Daten zu behalten und Änderungen der Werte zu behandeln.

Hier ist mein Problem. Ich verwende TableCellRenderer und mit der CellRenderer zu sehen, ob der Wert geändert wurde, wenn ja, dann mache ich die Anrufe und füllen Sie wie benötigt. Wenn eine große Anzahl von Zeilen aus der DB gezogen wird, dauert es eine Weile, um alle diese Datensätze zu laden und zu machen, also habe ich versucht, einen ProgressBar Benutzer zu zeigen, dass der Bildschirm nicht nur eingefroren ist, es geht und um wieviel . Der angezeigte Rahmen ist jedoch leer und es wird nichts angezeigt. Ich habe das Gefühl, dass ich etwas falsch mache oder etwas vermisse. Jede Hilfe wird sehr geschätzt.

einige Code zu verstehen, was ich über

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

Sorry für Formatierungsprobleme

Antwort

4

Verwenden SwingWorker, mit dem Sie Ihre TableModel aktualisieren können, wie Sie Ihre Ergebnismenge prüfen.

Addendum: Versuchen Sie nicht, die TableModel vom Renderer zu aktualisieren. Sie können das Modell aktualisieren, wenn Ihre Implementierung von CellEditor abgeschlossen ist, indem Sie einen geeigneten Mitarbeiter in getCellEditorValue() starten. Auf diese Weise werden die überarbeiteten Daten verfügbar sein, wenn der Renderer das nächste Mal für eine oder mehrere modifizierte Zelle (n) aufgerufen wird. Diese verwandte example umreißt den Ansatz.

Nachtrag: getCellEditorValue() wird aufgerufen, nachdem die Bearbeitung abgeschlossen wurde, aber das Starten des Worker in setValueAt() bietet einen zuverlässigeren Zugriff auf die Zielzeile und -spalte.

+0

hmm, es tut mir leid, ich denke, ich kann mich nicht klar erklären. Ich verwende SwingWorker, um mit dem Resultset zu arbeiten und Datensätze zu erstellen. Allerdings füge ich das Datensatzobjekt nicht dem Tabellenmodell in Swingworker hinzu, sondern in diesem Tabellenzellen-Renderer. Wenn der Benutzer den Fokus auf eine Spalte verliert, die er gerade bearbeitet hat, möchte ich meinen Befehl ausführen, nachdem ich gegoogelt habe, entdeckte ich den obigen Code so, wie ich es wollte. Gibt es einen alternativen Weg um die Zeile zu aktualisieren, die man empfehlen kann – dsymquen

+1

Sie brauchen dafür einen 'CellEditor'; mehr oben. – trashgod

+0

Danke, ich wusste, dass meine Herangehensweise nicht die beste war, das hilft sehr. – dsymquen