2011-05-28 5 views
9

bir tablo ve karşılık gelen model, herhangi bir karşılık gelen bir TableRowSorter ilave edildikten sonra firetabletablerowsinserted neden istisna spesifik olarak ekler. Testten GetRowCount() 'ın model aralığını geçtiği bir değer döndürdüğü açıktır. Ancak, bir sıralayıcı veya filtre eklendikten sonra tabloya değer eklemeye devam etmem benim için anlamlı değil mi?: geçersiz aralık

Örnek olarak, o zaman benim modelinde aşağıdaki çağrıları ile tabloya bir değer katmak tabloya şey eklemeden önce satır filtre ayarlayın:

this.addRow(row, createRow(trans,row)); 
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount()); 

Rowcount büyüklüğü 1 ve istisna olduğu atılır: ilk sıralayıcı her şeyi eklemeden aynı adımları yaparsanız

java.lang.IndexOutOfBoundsException: Invalid range 
at javax.swing.DefaultRowSorter.checkAgainstModel(Unknown Source) 
at javax.swing.DefaultRowSorter.rowsInserted(Unknown Source) 
at com.gui.model 

gayet iyi. Ben muhtemelen sıralayıcı değişiklikler yapmış ve çalışmış olabileceğini modeli bildirmek için gerekli olduğu kabul Aşağıdaki ama hala bir istisna verir:

this.addRow(row, createRow(trans,row)); 
this.fireTableStructureChanged() 
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount()); 

Hatta bir değer eklenmiştir modelin içindeki ayırıcı bildirmek için çalıştı aşağıdaki gibi ateş çağırmadan önce modele ama buna da başarısız:

this.addRow(row, createRow(trans,row)); 
if(sorter.getRowFilter() != null){ 
     //if a sorter exists we are in add notify sorter 
     sorter.rowsInserted(getRowCount(), getRowCount()); 
    } 
    this.fireTableRowsInserted(this.getRowCount(), this.getRowCount()); 

Son olarak, sert FireTableRowsInsterted (0,0) kodlu ve herhangi istisna değil. Ama hiçbir şey masaya eklenmez mi? Yani, kesinlikle bir tür OutOfBounds sorun olduğunu biliyorum. Her yere baktım ve cevap bulmak için görünmüyor olabilir. Bunun nasıl çalıştığını düşünen herhangi bir fikri varsa, çok yardımcı olabilir. Eğer Modelinizdeki gibi kontrol görünüyor eğer şimdilik

public void update(Observable o, Object evt) { 
    if (evt instanceof ObservableEvent<?>) { 

     ObservableEvent<?> event = (ObservableEvent<?>) evt; 

     if (event.getElement() instanceof HttpTransaction) { 

      HttpTransaction trans = (HttpTransaction) event.getElement(); 

      // handle adding of an element 
      if (event.getAction() == PUT) { 

       if (includeTransaction(trans)) { 

        // handle request elements 
        if (trans.getRequest() != null && idMap.get(trans.getID()) == null) { 

         idMap.put(trans.getID(), count++); 
         // transactionManager.save(trans); 
         int row = idMap.get(trans.getID()); 
         this.addRow(row, createRow(trans,row)); 
         if(sorter.getRowFilter() != null){ 
          sorter.rowsInserted(getRowCount(), getRowCount()); 
         } 
         this.fireTableRowsInserted(this.getRowCount(), this.getRowCount()); 

        } 
+3

'this.fireTableRowsInserted (this.getRowCount(), this.getRowCount());' - basitçe yanlış – Whired

+0

var kapalı - @Paul 'un yorumuna kendi cevabına bakın: sizinkiyle aynı hata. BTW, asla modelin _outside_'ından bir model olayı ateşlemez. İlgili taraflara bildirmek için modelin özel sorumluluğu ... – kleopatra

cevap

0

Yani: modele değer katan

İşte
messageTable.setRowSorter(null); 
    HttpTransactionTableModel m = getTransactionTableModel(); 
    final int statusIndex = m.getColIndex("status"); 
    RowFilter<Object,Object> startsWithAFilter = new RowFilter<Object,Object>() { 
      public boolean include(Entry<? extends Object, ? extends Object> entry) { 

       for(char responseCode:responseCodes) 
       { 
        if (entry.getStringValue(statusIndex).startsWith(Character.toString(responseCode))) { 
         return true; 
         } 
       } 


      // None of the columns start with "a"; return false so that this 
      // entry is not shown 
      return false; 
      } 
     }; 


     m.sorter.setRowFilter(startsWithAFilter); 
     messageTable.setRowSorter(m.sorter); 

benim modeli içinde kodudur: Burada Jpanel içindeki ayırıcı setleri koddur eğer şu anda sıralama modundaysa ve eğer durum buysa, sadece sıralama modelinde güncellemeyi arayın. Aksi takdirde, normal model yangın güncellemelerini arayın. 1 hatasından

      if(sorter.getRowFilter() != null){ 
          sorter.modelStructureChanged(); 
          } 
          else 
         this.fireTableRowsInserted(this.getRowCount(), this.getRowCount()); 
+0

:-) iyi lekelenme - teker, bu 1 @Whired sıfır tabanlı dizin – kleopatra

2

Sen bir çıkış vardır: iyi yollar bu olsa işlemek için hala açığım. olay ateş için doğru kod şudur:

this.fireTableRowsInserted(this.getRowCount()-1, this.getRowCount()-1); 
+0

cevabınızı düzenlemeyi düşünün: Kodunuzda bulduğunuz hata, OP'lerin kodundaki hatayla aynıdır :-) – kleopatra

+0

Kleopatra, iyi öneri, benim düzenledim Cevabınız sadece cevaptır. – Paul

3

Geri döndüm ve Kleopatra'nın yorumunu gördükten sonra bu daha iyi bir göz vardı. Bir RowSorter oluşturduktan sonra TableModel'imi değiştirdim, ancak RowSorter'ı JTable'a eklemeden önce. İşte sahip olduğum problemi gösteren bir örnek.

import javax.swing.*; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableRowSorter; 
import java.util.ArrayList; 
import java.util.List; 

public class TestTableMain { 
    public static void main(String[] args) { 
     new TestTableMain(); 
    } 

    public TestTableMain() { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       buildAndShowMainFrame(); 
      } 
     }); 
    } 

    private void buildAndShowMainFrame() { 
     JFrame frame = new JFrame(); 
     JScrollPane scrollPane = new JScrollPane(); 

     TestTableModel model = new TestTableModel(); 
     JTable table = new JTable(model); 

     TableRowSorter<TestTableModel> rowSorter = new TableRowSorter<>(model); 
     rowSorter.setRowFilter(null); 

     model.add("First added item."); 
     /* The RowSorter doesn't observe the TableModel directly. Instead, 
     * the JTable observes the TableModel and notifies the RowSorter 
     * about changes. At this point, the RowSorter(s) internal variable 
     * modelRowCount is incorrect. There are two easy ways to fix this: 
     * 
     * 1. Don't add data to the model until the RowSorter has been 
     * attached to the JTable. 
     * 
     * 2. Notify the RowSorter about model changes just prior to 
     * attaching it to the JTable. 
     */ 

     // Uncomment the next line to notify rowSorter that you've changed 
     // the model it's using prior to attaching it to the table. 
     //rowSorter.modelStructureChanged(); 
     table.setRowSorter(rowSorter); 

     scrollPane.setViewportView(table); 
     frame.setContentPane(scrollPane); 

     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 

     model.add("Second added item."); 
    } 

    private class TestTableModel extends AbstractTableModel { 
     private List<String> items = new ArrayList<>(); 

     public TestTableModel() { 
      for(int i=0;i<5;i++) { 
       add("Item " + i); 
      } 
     } 

     @Override 
     public int getRowCount() { 
      return items.size(); 
     } 

     @Override 
     public int getColumnCount() { 
      return 1; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      return items.get(rowIndex); 
     } 

     public void add(String item) { 
      items.add(item); 
      fireTableRowsInserted(items.size() - 1, items.size() - 1); 
     } 
    } 
} 
+1

sadece yanlış - hiç ikinci Normal iç güncelleştirme tahmin etmeye çalışın asla.Bunun yerine, hatayı rastgele ekleyerek kodunuzda bulmaya çalışın ;-) – kleopatra

+0

Kleopatra Haklısınız. Bugün gerçek sebebi takip ettim ve cevabımı güncelledim. –

+0

orijinal parçayı kaldırmayı düşünebilirsiniz - yanlış şeyler akılda kalmaya eğilimlidir :-) – kleopatra