2016-02-17 3 views
0

У меня есть List (List<MyBean>). Затем я использовал его для заполнения 2D array. Для этого я использовал следующие шаги.Как загрузить этот ArrayList в JTable

MyBean.java

public class MyBean{ 
private int id; 
private String name; 
private String address; 

/** 
* @return the id 
*/ 
public int getId() 
{ 
    return id; 
} 

/** 
* @param id the id to set 
*/ 
public void setId(int id) 
{ 
    this.id = id; 
} 

/** 
* @return the name 
*/ 
public String getName() 
{ 
    return name; 
} 

/** 
* @param name the name to set 
*/ 
public void setName(String name) 
{ 
    this.name = name; 
} 

/** 
* @return the address 
*/ 
public String getAddress() 
{ 
    return address; 
} 

/** 
* @param address the address to set 
*/ 
public void setAddress(String address) 
{ 
    this.address = address; 
} 
}  

public void myMethod(List<MyBean> list){ 
    List<Object> objects = new ArrayList<>(); 
    for (Object object : list){ 
      objects.add(object != null ? object : null); 
    } 

    Object rowData1[][] = new Object[objects.size()][]; 
    for (int i = 0; i < objects.size(); i++){ 
      List<Object> row = (ArrayList<Object>)(Object)objects.get(i); 
      rowData1[i] = row.toArray(new Object[row.size()]); 
    } 

    Object columnNames1[] ={"HEADER 1", "HEADER 2", "HEADER 3"}; 
} 

Когда я бегу исполнить этот код, я получил следующие исключения.

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: 
MyBean cannot be cast to java.util.ArrayList 

Исключение составляет на этой линии

List<Object> row = (ArrayList<Object>)(Object)objects.get(i); 

Я использую это 2D массив для следующих целей.

JTable table1 = new TableWithRowHeader(rowData1, columnNames1); 
table1.getColumnModel().getColumn(0).setPreferredWidth(120); 

JScrollPane scrollPane1 = new JScrollPane(table1); 
scrollPane1.setColumnHeaderView(null); 

JPanel jPanel = new JPanel(); 
jPanel.setLayout(new BorderLayout()); 
JButton button = new JButton("Add Button"); 
button.addActionListener(new ActionListener(){ 

@Override 
public void actionPerformed(ActionEvent ae){ 
     JDialog dialog = new JDialog(); 
     dialog.setTitle("terance"); 
     dialog.setSize(600, 500); 
     dialog.setLocationRelativeTo(null); 
     dialog.setVisible(true); 
} 
}); 

jPanel.removeAll(); 
jPanel.add(button, BorderLayout.EAST); 
jPanel.revalidate(); 

JFrame frame = new JFrame("Testing"); 
frame.setLayout(new BorderLayout()); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.add(jPanel, BorderLayout.NORTH); 
frame.add(scrollPane1); 
frame.pack(); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true); 

Вот пример эскиза для окончательного результата.

enter image description here

Как я мог обработать исключение?

Есть идеи?

спасибо.

+0

Почему вы используете двойное литье? '(ArrayList ) (Object) objects.get (i);' –

+0

Первый раз для объекта, а затем для списка объектов. Я ошибаюсь ? – Barrier

+0

Все объекты Java относятся к классу 'Object'. Кастинг к нему бессмысленен, а литье дважды бессмысленно, потому что самый левый бросок имеет преимущество –

ответ

2
  • В вашей myMethod вы четко пропускания списка MyBean объектов.

  • Из этого списка вы копируете каждый MyBean экземпляра в новый список называется objects

  • Тогда вы циклически objects и делает это: List<Object> row = (ArrayList<Object>)(Object)objects.get(i);

  • Но (Object)objects.get(i); здесь, в этом коде будет всегда возвращайте объект объекта MyBean, а не список. Это невозможно придать методу в ArrayList. И, таким образом, ошибка!

Вам нужно изменить код вокруг rowData1 и objects списка согласно вашему требованию.

+0

Хорошо. Я хочу прочитать этот «список» и задать значения для этого 2D-массива, используя этот «список». Как я могу это сделать? – Barrier

+0

Для двумерного массива вы должны иметь строки и столбцы, в этом коде вы передаете только один список. Что должно присутствовать в этом 2D-массиве как строка и столбец? Или это похоже на то, что вы хотите поместить все экземпляры MyBean в 2D-массив? –

+0

Я хочу поместить все экземпляры MyBean в 2D-массив. – Barrier

2

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

table sample

Здесь я загрузить List<MyBean> выборки данных

java.util.List<MyBean> list = new ArrayList<MyBean>(); 
for (int i = 0; i < 3; i++) { 
    MyBean b = new MyBean(); 
    b.setId(i); 
    b.setName("Name " + i); 
    b.setAddress("Address " + i); 
    list.add(b); 
} 

Здесь я загрузить Object[][] с этим List<MyBean>. Не требуется литье.

Object[][] data = new Object[list.size()][]; 
for (int i = 0; i < list.size(); i++) { 
    MyBean b = list.get(i); 
    Object[] row = new Object[] { b.getId(), b.getName(), b.getAddress() }; 
    data[i] = row; 
} 

Object columnNames1[] = {"HEADER 1", "HEADER 2", "HEADER 3"}; 

JTable table1 = new TableWithRowHeader(data, columnNames1); 
+0

Дорогой, можете ли вы внести некоторые изменения для своего кода для меня? Потому что вы так близки к ожидаемому ответу – Barrier

+0

Umm, никаких изменений не требуется. Вам просто нужно знать, где разместить эти 2 блока кода. Это ваша задача –

+0

Собственно, я хочу следующую цель. Если имя «Заголовок 2», все необработанное должно содержать имена. – Barrier