Загрузить массив в таблицу Java - PullRequest
4 голосов
/ 22 июня 2010

Это сводит меня с ума. Я прочитал учебник Sun по созданию базовой таблицы с моделью данных по умолчанию, но не могу найти простой пример того, как загрузить массив объектов данных, таких как:

class dataObject{
String name;
String gender;
Byte age;

public dataObject (String name, String gender, Byte age){
   this.name = name;
   .
   .

}

Затем я создаю, например, вектор этого материала:

Vector v = new Vector(99);

v.addElement(new dataObject("Marrie", "Female", 33);
v.addElement(new dataObject("John", "Male", 32);

С dataObject я собирал информацию, теперь, как, черт возьми, я показываю ее в таблице? Потому что это не работает:

JTable newTable = new Jtable(v, header) // header is another Vector.

Я получаю некоторые ошибки, которые приводят меня к этой последней строке. Так что любая помощь, даже маленькая, ценится. Я знаю, что есть несколько тем по этому поводу, но эти люди уже задыхаются о том, как работает JTable + TableModel, я просто едва понимаю.

Большое спасибо.

Ответы [ 5 ]

4 голосов
/ 22 июня 2010

Существует два способа создания JTable с базовым подготовленным набором данных:

  1. 2D Object массив
  2. a Vector с элементами Vector

так что вы можете сделать это:

 Object [][] model = {{"Marrie", "Female","33"},{"John","Male","32"}};
 JTable table = new JTable(model);

или вы можете сделать это:

 Vector model = new Vector();
 Vector row = new Vector();

 row.add("Marrie");
 row.add("Female");
 row.add("33");
 model.add(row);

 row = new Vector();
 row.add("John");
 row.add("Male");
 row.add("32");
 model.add(row);

 JTable table = new JTable(model);

Следующим шагом будет реализация собственного TableModel для использования класса DataObject, который вы собрали вместе (обратите внимание, что классы Java начинаются с заглавных букв). Расширение AbstractTableModel облегчает жизнь, поскольку для начала вам нужно всего лишь реализовать три метода:

public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);

первые два просты, вы можете получить размер вашего Vector для количества строк и жестко кодировать значение val для количества столбцов. getValueAt - это место, где вы извлекаете данные из вашего DataObject

Вот пример использования анонимного класса с расширением AbstractTableModel.

final Vector<DataObject> myDataObjects = new Vector<DataObject>();
myDataObjects.add(...);// add your objects
JTable table = new JTable(new AbstractTableModel() {

    public int getRowCount() {return myDataObjects.size();}
    public int getColumnCount() { return 3; }
    public Object getValueAt(int row, int column){
         switch (column) {
           case 0:
              return myDataObjects.get(row).getName();
           case 1:
              return myDataObjects.get(row).getGender();
           case 2:
              return myDataObjects.get(row).getAge();
           default:
              return "";
         }
    }
});

Я сохранил Vector, чтобы он был близок к вашей текущей реализации. В этом примере вы можете легко изменить его на ArrayList, не беспокоясь.

3 голосов
/ 22 июня 2010

Проблема в том, что используемый вами конструктор был разработан для хранения вектора, который содержит другие векторы.

Каждый с информацией.

Посмотрите этот рабочий образец, чтобы лучше понять его:

import javax.swing.*;
import java.util.Vector;

public class TableDemo {
    public static void main( String [] args ){
        Vector<Vector<Object>> data = new Vector<Vector<Object>>();

        Vector<Object> row = new Vector<Object>();
        row.add( "Marie");
        row.add( "Female");
        row.add( 33);
        data.add(row);

        Vector<Object> otherRow = new Vector<Object>();
        otherRow.add( "John");
        otherRow.add( "Male");
        otherRow.add( 32 );
        data.add(otherRow);

        Vector<String> headers = new Vector<String>();
        headers.add("Name");
        headers.add("Gender");
        headers.add( "Age");


        JTable table = new JTable( data, headers );

        JFrame frame = new JFrame();
        frame.add( new JScrollPane( table ));
        frame.pack();
        frame.setVisible( true ); 

    }
}

Что создает:

как то так http://img695.imageshack.us/img695/2032/capturadepantalla201006r.png

На всякий случай, вы должны взглянуть на это:

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

Если вы еще не сделали.

1 голос
/ 22 июня 2010

Вы не можете загрузить объекты данных в DefaultTableModel.Вам нужно создать пользовательскую TableModel для этого.Модель Bean Table - это такая модель, которая может упростить вам этот процесс.

0 голосов
/ 29 июня 2010

Я знаю, что многие люди могут опасаться включения еще одного jar-файла, но, честно говоря, независимо от того, насколько прост JTable (или JList или JComboBox), я всегда использую библиотеку GlazedLists . Откровенно говоря, это одна из самых удивительных библиотек, которые вы когда-либо использовали. Это очень, очень гибкий. Но простой пример состоит из помещения ваших bean-компонентов в специальный список, называемый EventList. Затем создайте формат таблицы; создайте модель, привязав формат к списку данных, а затем установите в качестве модели таблицы.

Предположим, у вас есть класс Person:

public class Person {
  private String firstName;
  private String surname;
  private int age;

  ... standard constructors, getters and setters...
}

Теперь, чтобы ваша таблица отображала список этих людей:

EventList<Person> peopleEventList = new BasicEventList<Person>();
peopleEventList.add(... create some objects and add it the usual way ...);
...

String[] columnProperties = { "firstName", "surname", "age" };
String[] columnLabels = { "First name", "Surname", "Age" };
TableFormat personTableFormat = GlazedLists.tableFormat(columnProperties, columnLabels);
EventTableModel personTableModel = new EventTableModel(peopleEventList, personTableFormat);
myJTable.setModel(personTableModel);

Я пишу это по памяти, но я думаю, что это более или менее правильно. С этой библиотекой можно легко добавить сортировку и фильтрацию к таблице. Сначала начните работать с базовой таблицей, а затем начните искать на сайте GlazedLists, чтобы узнать, что еще вы можете сделать. Есть несколько действительно хороших скринкастов .

PS Я никоим образом не связан с этой библиотекой, я просто думаю, что она потрясающая!

0 голосов
/ 22 июня 2010

Я никогда раньше не использовал JTable, но в документации сказано, что конструктор принимает в качестве первого параметра «Вектор векторов», а не «Вектор» dataObjects.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...