我有一个jTable
,它根据一些jComboBox
加载搜索结果。
我使用 DefaultTableModel
来实现此目的,对于其他 jTable,我使用 TableModel
。
搜索后,jTable 中显示的字段始终相同,但是如果 jTable 中显示的字段并不总是相同,我如何创建一个可以工作的 TableModel
?无需为每种可能的组合创建一个?
第一个场景我基于jComboBox
执行搜索,它返回所有数据并将其显示在jTable
上。在第二个中,我选择我想从某些jRadioButtons
返回的对象
中看到的内容。
jTable
。
jTable
。
我的一个TableModel
:
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 "";
}
}
}
现在谢谢。
这是我正在工作的方法的一部分:
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]}); } }
但是,每次我单击按钮时,它都会显示重复的“Id”和“Name”列。
最佳答案
In the second i select what i want to see from the object returned in some jRadioButtons.
您始终执行查询以返回所有可能的数据。
然后,您可以从 JTable
的 TableColumnModel
中删除 TableColumn
,以仅显示您想要的列。
因此,如果您创建第一个表并且不想看到“Line”列,则只需执行以下操作:
table.removeColumn( table.getColumn( "Line" ) );
如果您需要重新显示“Line”列的能力,那么您只需将 TableColumn 添加回表的 TableColumnModel 即可。为此,您可能需要查看 Table Column Manager该类将通过使用 hideColumn(...)
和 showColumn(...)
方法帮助您管理此操作。
关于java - 自定义 TableModel - 所有查询的模型相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36461605/