Массив объектов JTable

#java #user-interface #jtable

#java — язык #пользовательский интерфейс #jtable #java

Вопрос:

 String[] columnNames = {"Type", "Employee ID", "First/Last Name","DOB", "Gender", "HIre Date", "OnCall", "BaseSalary", "Commission/Hourly Rate"};
    Object[][] data = new Object[10][9];
table = new JTable(data,columnNames);

public ArrayList<Person> employeeList = new ArrayList<Person>();
public ArrayList<Client> clientList = new ArrayList<Client>();
public ArrayList<Stock> stockList = new ArrayList<Stock>();
  

Я пытаюсь создать JTable с информацией внутри array-list. Я попробовал что-то вроде.

 data[0][0] = "Account";
data[0][1] = 1; //int
data[0][2] = "Name";
data[0][3] = dob; //Date class
data[0][4] = gender; //Enum 
data[0][5] = hire //Date class
data[0][6] = true; //boolean
data[0][7] = 125.23; //double
data[0][8] =  0.015; //double
  

Что получилось не очень хорошо, я пробую Google, но большинство примеров содержат готовые массивы, так что это не сильно помогло.

Комментарии:

1. Неясно, почему это не сработало, чего вы ожидали и что произошло вместо этого?

2. На самом деле я ожидал, что это сработает, но, по-видимому, этого не произошло, поскольку код, с которым я работаю у предыдущего пользователя, обработал исключение и выдал ошибку

3. Как ни странно, теперь я создаю таблицу, в которую вообще не поступает никаких данных…

4. Помещаете ли вы объекты в data перед созданием JTable?

5. Да, в чем, я думаю, может быть проблема, в итоге я просто создал пустую таблицу и просто добавил строки, которые кажутся более простыми.

Ответ №1:

Я думаю, что ваша проблема связана с массивом данных. Массивы в Java не являются динамическими. Определение

Object[][] data = {};

вы создаете массив длиной 0.

Вы должны были бы знать их длины заранее и использовать их при создании или использовать метод toArray списка.

Комментарии:

1. могу ли я указать размер, такой как данные Object [row] [col];

2. Нет. Object[][] data = new Object[rows][cols];

Ответ №2:

Документация по модели JTable сбивает с толку своими упрощенными объяснениями. Передача данных в конструктор таблиц почти всегда является ошибкой. Вы должны реализовать свою собственную табличную модель, которая является производной от AbstractTableModel, и передать этот объект модели в конструктор для таблицы.

Тогда ваша табличная модель может иметь просто закрытую переменную-член, например

 public ArrayList<Person> employeeList = new ArrayList<Person>();
  

затем вам просто нужно реализовать несколько методов, таких как

 public int getRowCount() {
    return emplyeeList.size();
}
  

и такие как

 public Object getValueAt(int rowIndex, int columnIndex) {
    Person p = employeeList.get(rowIndex);
    switch (columnIndex) {
        case 1: 
              return p.getName();
        ....
    }
}
  

и т.д.

Это значительно упрощает ваше программирование, поскольку модель использует ваши естественные структуры данных для хранения данных.