Qual é a maneira mais fácil para exibir o conteúdo de um ArrayList de objetos em uma JTable?
-
05-07-2019 - |
Pergunta
Eu tenho um ArrayList de rastrear objetos. Cada objeto faixa tem os seguintes campos (todas as strings):
url, título, criador, álbum, gênero, compositor
I deseja exibir estas faixas em uma JTable, com cada linha sendo uma instância de um objecto de Pista, e cada coluna contendo uma das propriedades de um objecto de Pista.
Como posso exibir esses dados usando um JTable? Eu usei um AbstractTableModel que implementa o método getValueAt () corretamente. Ainda assim, eu não vejo nada na tela.
Ou é mais fácil apenas para matrizes de uso?
Solução
Para adicionar conteúdo para exibição em um JTable
, um usa o TableModel
para adicionar itens à exibição.
Um de uma maneira de adicionar uma linha de dados para o DefaultTableModel
é usando o addRow
método que terá uma matriz de Object
s que representa os objectos da fila. Como não existem métodos para adicionar diretamente o conteúdo de um ArrayList
, pode-se criar uma matriz de Object
s acessando o conteúdo do ArrayList
.
O exemplo a seguir usa uma classe KeyValuePair
que é um suporte para dados (semelhante a sua classe Track
), que será usado para preencher um DefaultTableModel
para exibir uma tabela como um JTable
:
class KeyValuePair
{
public String key;
public String value;
public KeyValuePair(String k, String v)
{
key = k;
value = v;
}
}
// ArrayList containing the data to display in the table.
ArrayList<KeyValuePair> list = new ArrayList<KeyValuePair>();
list.add(new KeyValuePair("Foo1", "Bar1"));
list.add(new KeyValuePair("Foo2", "Bar2"));
list.add(new KeyValuePair("Foo3", "Bar3"));
// Instantiate JTable and DefaultTableModel, and set it as the
// TableModel for the JTable.
JTable table = new JTable();
DefaultTableModel model = new DefaultTableModel();
table.setModel(model);
model.setColumnIdentifiers(new String[] {"Key", "Value"});
// Populate the JTable (TableModel) with data from ArrayList
for (KeyValuePair p : list)
{
model.addRow(new String[] {p.key, p.value});
}
Outras dicas
então, o problema que tenho é que eu não posso ver o problema em tudo. aqui está o código que usei para fazer a interface:
public Interface(){
setSize(1024, 768);
setBackground(new Color(0,0,0));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(new MenuBar());//simple JMenuBar implementation
table= new JTable();
table.setPreferredScrollableViewportSize(new Dimension(500, 500));
JScrollPane jsp = new JScrollPane(table);
add(jsp);
pack();
setVisible(true);
}
após esse código é executado, eu tenho o código em outra classe que faz isso muitas vezes:
((DefaultTableModel)mainInterface.table.getModel()).addRow(
new String[] {t.location,t.title,t.creator,t.album,t.genre,t.composer});
t é um objeto faixa pelo caminho.