2016-04-06 4 views
0

Ich habe eine jTable, wo es das Ergebnis einer Suche geladen wird, basierend auf einigen jComboBox. Ich verwende DefaultTableModel dafür, für die anderen jTables verwende ich TableModel.Custom TableModel - Das gleiche Modell für alle Abfragen

Die Felder, die nach der Suche an der jTabelle angezeigt werden, sind immer gleich, aber wie kann ich eine TableModel erstellen, die funktionieren würde, wenn die an der jTable angezeigten Felder nicht immer die gleichen wären? Ohne eines für jede mögliche Kombination zu schaffen?

Erstes Szenario Ich führe eine Suche basierend auf der jComboBox und es gibt alle Daten und zeigt es auf jTable. In der zweiten wähle ich, was ich von der object zurückgegeben in einigen jRadioButtons sehen möchte.

jTable vom ersten Szenario.

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

jTable aus der zweiten Szenario.

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

Einer meiner TableModels:

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 ""; 

    } 
} 

}

Dank für jetzt.

Hier ist ein Teil des Verfahrens, wo ich arbeite:

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]}); 
    } 

} 

Aber die Spalten „ID“ und „Name“ zeigt es jedes Mal, wenn ich auf die Schaltfläche klicken dupliziert.

+1

Verwenden Sie das [* Strategiemuster *] (https://en.wikipedia.org/wiki/Strategy_pattern). – trashgod

+1

+1 für Strategie-Vorschlag (interessanter Ansatz). * In der zweiten wähle ich aus, was ich von dem Objekt sehen möchte, das in einigen jRadioButtons zurückgegeben wird. * Was ist mit dem Verstecken/Zeigen von Spalten wie benötigt, wie hier [hier] (http://stackoverflow.com/a/6796673/1795530) und [hier] (http: // stackoverflow.com/a/6798013/1795530)? – dic19

+0

@ dic19: Ich auch [* finden Enums nützlich für die Umsetzung der Strategie Muster, *] (http://StackOverflow.com/a/15076852/230513) vor allem mit 'JComboBox'. – trashgod

Antwort

3

In der zweiten wähle ich, was ich von dem Objekt sehen möchte, das in einigen jRadioButtons zurückgegeben wird.

Sie tun immer Ihre Abfrage, um alle möglichen Daten zurückzugeben.

Dann können Sie die TableColumn aus dem TableColumnModel der JTable entfernen, um nur die Spalten anzuzeigen, die Sie möchten.

Also, wenn Sie Ihre erste Tabelle erstellen, und Sie wollen nicht die „Linie“ Spalte sehen Sie nur so etwas wie:

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

Wenn Sie die Möglichkeit, müssen die „Line“ Spalte dann erneut anzuzeigen Sie können TableColumn einfach zum TableColumnModel der Tabelle hinzufügen. Hierzu können Sie die Table Column Manager überprüfen, die eine Klasse ist, die Ihnen helfen wird, dies mit den Methoden hideColumn(...) und showColumn(...) zu verwalten.

+0

Ich fing an, durch Ihren Vorschlag zu versuchen, aber ich habe einige Probleme, vielleicht können Sie wieder helfen. Eine Sache ist, dass ich wollte, dass jedes Mal, wenn ich auf den Knopf klicke, das Modell "zurückgesetzt" wurde, ein anderer ist, warum zeigt es zweimal die Spalten. – Rodrigo

+0

@Rodrigo, Der 'TableColumnManager' sollte immer nur einmal erstellt werden, wenn Sie das JTable zum ersten Mal erstellen und die Daten in die Tabelle laden. Es sieht so aus, als ob Sie jedes Mal, wenn der ActionListener aufgerufen wird, einen neuen TableColumnManager für eine vorhandene Tabelle erstellen. Beginnen Sie mit der Erstellung einer einfachen Demo. Ich habe Ihnen bereits die grundlegenden 3 Zeilen Code gezeigt, die benötigt werden. Dann können Sie ein paar Optionsfelder hinzufügen, um die Spalten "C" und "D" umzuschalten. Sie testen Code wird etwa 15-20 Zeilen Code sein. Lass das zuerst funktionieren. Dann, sobald Sie verstehen, dass Sie Ihren echten Code beheben können. – camickr

+0

Ich löste das Problem mit 'SwingX' und 'JXTable', aber danke für die Vorschläge. – Rodrigo