Прежде чем вы ответите: Да, я прочитал руководство по jtable на Sun. Нет, мне это не помогло. Да я идиот. Пожалуйста, не отвечайте со ссылкой на этот документ. Что меня особенно интересует, так это то, как динамически добавлять строки и столбцы в мою Jtable через IDE Netbeans. У меня уже есть объект, содержащий хэш-карту с моими данными. Я не могу понять, куда или какому объекту я должен передать этот объект. Спасибо за ваше время!
У меня есть вектор, содержащий серию (длиной l) объектов (каждый соответствует строке). Как мне получить этот векторный объект для отображения в JTable?




JTable использует TableModel для хранения данных. Ваш хэш / вектор данных необходимо будет адаптировать для использования; вы можете написать реализацию TableModel, используя хэш / вектор в качестве резервных данных, или, если вы не будете динамически обновлять хэш / вектор и вам нужно, чтобы он отображался автоматически, вы можете просто скопировать все в экземпляр DefaultTableModel и использовать который.
Если вы используете адаптер и динамически обновляете хэш / вектор, помните, что все обновления должны выполняться в потоке отправки событий. :-)
Чтобы добавить к моему предыдущему ответу, чего бы это ни стоило, я на самом деле написал модель таблицы, которая использует (по сути) ArrayList<Row> в качестве резервных данных, где Row - это HashMap<String, Object>, сопоставляя имена столбцов со значениями.
Все это составляет около 1500 строк кода, хотя мой код может быть излишним для ваших целей, и вам, вероятно, не придется писать почти столько же кода. Всего наилучшего!
Для иллюстрации ниже приведены примеры использования DefaultTableModel для отображения данных с HashMap и Vector.
Ниже приведен пример сброса данных с HashMap на DefaultTableModel, который используется в качестве TableModel для JTable.
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class JTableExample extends JFrame
{
private void makeGUI()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// HashMap with some data.
HashMap<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
// Create a DefaultTableModel, which will be used as the
// model for the JTable.
DefaultTableModel model = new DefaultTableModel();
// Populate the model with data from HashMap.
model.setColumnIdentifiers(new String[] {"key", "value"});
for (String key : map.keySet())
model.addRow(new Object[] {key, map.get(key)});
// Make a JTable, using the DefaultTableModel we just made
// as its model.
JTable table = new JTable(model);
this.getContentPane().add(table);
this.setSize(200,200);
this.setLocation(200,200);
this.validate();
this.setVisible(true);
}
public static void main(String[] args)
{
new JTableExample().makeGUI();
}
}
Для использования Vector для включения столбца данных в JTable:
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class JTableExample extends JFrame
{
private void makeGUI()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Vector with data.
Vector<String> v = new Vector<String>();
v.add("first");
v.add("second");
// Create a DefaultTableModel, which will be used as the
// model for the JTable.
DefaultTableModel model = new DefaultTableModel();
// Add a column of data from Vector into the model.
model.addColumn("data", v);
// Make a JTable, using the DefaultTableModel we just made
// as its model.
JTable table = new JTable(model);
this.getContentPane().add(table);
this.setSize(200,200);
this.setLocation(200,200);
this.validate();
this.setVisible(true);
}
public static void main(String[] args)
{
new JTableExample().makeGUI();
}
}
Я должен признать, что имена столбцов не отображаются при использовании приведенных выше примеров (я обычно использую метод DefaultTableModelsetDataVector), поэтому, если у кого-то есть предложения о том, как сделать так, чтобы имена столбцов отображались, пожалуйста, сделайте :)
Просто дополнение к сообщению coobird; чтобы появился заголовок, я сделал следующее:
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class JTableExample extends JFrame
{
private void makeGUI()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// HashMap with some data.
HashMap<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
// Create a DefaultTableModel, which will be used as the
// model for the JTable.
DefaultTableModel model = new DefaultTableModel();
// Populate the model with data from HashMap.
model.setColumnIdentifiers(new String[] {"key", "value"});
for (String key : map.keySet())
model.addRow(new Object[] {key, map.get(key)});
// Make a JTable, using the DefaultTableModel we just made
// as its model.
JTable table = new JTable(model);
this.getContentPane().add(new JScrollPane(table));
this.setSize(200,200);
this.setLocation(200,200);
this.validate();
this.setVisible(true);
}
public static void main(String[] args)
{
new JTableExample().makeGUI();
}
}
Кстати, твой пост был мне очень полезен, coobird, ты даже не представляешь, как я благодарен!
И убедитесь, что если вы изменяете столбцы / строки, модель правильно запускает события изменения модели, иначе вы не увидите никаких обновлений в таблице.