What is the easiest way to display the contents of an ArrayList of Objects in a JTable?
-
05-07-2019 - |
Question
I have an ArrayList of Track objects. Each Track object has the following fields (all Strings):
url, title, creator, album, genre, composer
I want to display these tracks in a JTable, with each row being an instance of a Track object, and each column containing one of the properties of a Track object.
How can I display this data using a JTable? I've used an AbstractTableModel that implements the getValueAt() method correctly. Still, I dont see anything on the screen.
Or is it easier just to use arrays?
Solution
In order to add contents to display on a JTable
, one uses the TableModel
to add items to display.
One of a way to add a row of data to the DefaultTableModel
is by using the addRow
method which will take an array of Object
s that represents the objects in the row. Since there are no methods to directly add contents from an ArrayList
, one can create an array of Object
s by accessing the contents of the ArrayList
.
The following example uses a KeyValuePair
class which is a holder for data (similar to your Track
class), which will be used to populate a DefaultTableModel
to display a table as a 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});
}
OTHER TIPS
then, the problem i have is that i cant see the problem at all. here's the code i've used to make the 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);
}
after this code is executed, i have code in another class that does this many times:
((DefaultTableModel)mainInterface.table.getModel()).addRow(
new String[] {t.location,t.title,t.creator,t.album,t.genre,t.composer});
t is a Track object by the way.