2016-04-06 30 views
0

bir jTable var, burada jComboBox bazı arama dayalı bir arama sonucu yüklendi. Bunun için DefaultTableModel kullanıyorum, diğer jTables için ben TableModel kullanın.Özel TableModel - Tüm sorgularda aynı model

jTable'da gösterilen alanlar, aramadan sonra her zaman aynıdır, ancak jTable'da gösterilen alanlar her zaman aynı olmadığında çalışacak bir TableModel nasıl oluşturabilirim? Her olası kombinasyon için bir tane oluşturmadan mı?

İlk senaryoda, jComboBox temelli bir arama gerçekleştiriyorum ve tüm verileri döndürür ve jTable'da gösterir. İkinci olarak, jRadioButtons numaralı telefondan geri döndüğüm object numaralı telefondan görmek istediklerimi seçiyorum. İlk senaryodan

jTable.

[! [İkinci senaryodan http://i.stack.imgur.com/FPElv.png][1]][1]

jTable. benim TableModels ait

http://i.stack.imgur.com/g3qnj.png

Bir: şimdilik

import java.util.ArrayList; 
import java.util.List; 
import javax.swing.table.AbstractTableModel; 
import modelo.Setor; 

public class ModeloSetor extends AbstractTableModel { 

private List<Setor> setores; 

public ModeloSetor() { 
    setores = new ArrayList<Setor>(); 
} 

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

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

@Override 
public Object getValueAt(int rowIndex, int columnIndex) { 
    Setor setor = setores.get(rowIndex); 
    switch (columnIndex) { 
     case 0: 
      return setor.getId(); 
     case 1: 
      return setor.getNome(); 
     default: 
      return ""; 
    } 
} 

public void adicionar(Setor setor) { 
    setores.add(setor); 
    fireTableRowsInserted(setores.size() - 1, setores.size() - 1); 
} 

public void remover(Setor setor) { 
    setores.remove(setor); 
    fireTableRowsInserted(setores.size() - 1, setores.size() - 1); 
} 

public Setor getSetor(int linha) { 
    return setores.get(linha); 

} 

public ModeloSetor(List<Setor> lista) { 
    this(); 
    setores.addAll(lista); 
} 

public void adicionaLista(List<Setor> lista) { 
    int i = setores.size(); 
    setores.addAll(lista); 
    fireTableRowsInserted(i, i + lista.size()); 
} 

public void limpaLista() { 
    if (setores.size() > 0) { 
     int i = setores.size(); 
     setores.clear(); 
     fireTableRowsDeleted(0, i - 1); 
    } 
} 

@Override 
public String getColumnName(int coluna) { 
    switch (coluna) { 
     case 0: 
      return "Id"; 
     case 1: 
      return "Nome"; 
     default: 
      return ""; 

    } 
} 

}

teşekkürler. o sütunları "İd" ve "Ad" i düğmesine tıklayın her zaman çoğaltılır gösteriyor,

private void jButtonSearchActionPerformed(java.awt.event.ActionEvent evt) {   


    jTableResultado.getColumnModel().getColumn(0).setMaxWidth(50); 
    jTableResultado.getColumnModel().getColumn(1).setPreferredWidth(180); 
    jTableResultado.getColumnModel().getColumn(2).setPreferredWidth(250); 
    jTableResultado.getColumnModel().getColumn(3).setPreferredWidth(310); 
    jTableResultado.getColumnModel().getColumn(4).setPreferredWidth(100); 
    jTableResultado.getColumnModel().getColumn(5).setPreferredWidth(250); 
    jTableResultado.getColumnModel().getColumn(6).setPreferredWidth(150); 
    jTableResultado.getColumnModel().getColumn(7).setPreferredWidth(150); 
    jTableResultado.getColumnModel().getColumn(8).setPreferredWidth(100); 
    jTableResultado.getColumnModel().getColumn(9).setPreferredWidth(100); 
    PersonDao personDao = new PersonDao(); 
    Person person= new Person(); 
    Condutor condutor = new Condutor(); 

    DefaultTableModel modelo = (DefaultTableModel) jTableResultado.getModel(); 
    modelo.setNumRows(0); 

    TableColumnManager tcm = new TableColumnManager(jTableResultado); 
    Date dataInicial = (dataInicialParaInserir(jTDataInicial.getText())); 
    Date dataFinal = (dataFinalParaInserir(jTDataFinal.getText())); 

    if (jRadioCodigoPerson.isSelected()) { 
     tcm.hideColumn("Id"); 
    } else { 
     tcm.showColumn("Id"); 
    } 
    if (jRadioNamePerson.isSelected()) { 
     tcm.hideColumn("Name"); 
    } else { 
     tcm.showColumn("Name"); 
    } 


    List<Object[]> listaObjetos = personDao.consultarDataParametros(person, dataInicial, dataFinal, 
    condutor); 
    for (Object[] t : listaObjetos) { 

     modelo.addRow(new Object[]{t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9]}); 
    } 

} 

Ama: Burada

ben çalışıyorum yöntemin bir parçasıdır.

+1

[* Strateji düzenini *] kullanın (https://en.wikipedia.org/wiki/Strategy_pattern). Strateji modeli önerisi için – trashgod

+1

+1 (ilginç yaklaşım). * İkincisi, bazı jRadioButtons döndürülen nesneyi görmek istediğimi seçin. * Burada gösterildiği gibi [burada] (http://stackoverflow.com/a/6796673/1795530) sütunları gizleme/gösterme ve [buradan] (http: // stackoverflow.com/a/6798013/1795530)? – dic19

+0

@ dic19: Ben de [* strateji desenini uygulamak için yararlı enumlar bul, *] (http://stackoverflow.com/a/15076852/230513) özellikle 'JComboBox' ile. – trashgod

cevap

3

İkinci jRadioButtons uygulamasında döndürülen nesneden görmek istediğimi seçin.

Mümkün olan tüm verileri döndürmek için her zaman sorgunuzu yaparsınız.

Ardından, yalnızca istediğiniz sütunları görüntülemek için JTable'un TableColumnModel numaralı TableColumnModel adresinden TableColumn öğesini kaldırabilirsiniz.

Yani ilk tablo oluşturmak ve size sadece böyle bir şey yapmak "Çizgi" sütunu görmek için istemiyorsanız: Eğer, "Satır" sütunu yeniden görüntülemek için yeteneği gerekiyorsa

table.removeColumn(table.getColumn("Line")); 

TableColumn'ı tablonun TableColumnModel dosyasına ekleyebilirsiniz. Bunun için, hideColumn(...) ve showColumn(...) yöntemlerini kullanarak bunu sizin için yönetmenize yardımcı olacak bir sınıf olan Table Column Manager'u kontrol etmek isteyebilirsiniz.

+0

Önerinizle denemeye başladım, ama bazı problemlerim var, belki tekrar yardımcı olabilirsiniz. Bir şey şu ki, düğmeyi tıklattığımda, modelin "sıfırlandı" olmasını istedim, diğeri de neden iki kez sütun gösteriyor. – Rodrigo

+0

@Rodrigo, "TableColumnManager", JTable'ı ilk oluşturduğunuzda ve verileri tabloya yüklediğinizde yalnızca bir kez oluşturulmalıdır. ActionListener her çağrıldığında varolan bir tablonun üzerinde yeni bir TableColumnManager yaratıyor gibi görünüyor. Basit bir demo oluşturmaya başlayın. Zaten gerekli olan 3 temel kod satırını gösterdim. Böylece "C" ve "D" sütunlarını değiştirmek için birkaç radyo düğmesi ekleyebilirsiniz. Test kodunu yaklaşık 15-20 satır kod olacak. Önce onu çalıştır. Sonra, gerçek kodunuzu düzeltebileceğinizi anladıktan sonra. – camickr

+0

Sorunu 'SwingX' ve 'JXTable' kullanarak çözdüm, ancak öneriler için teşekkürler. – Rodrigo