Написал свою модель данных для таблицы, хранящей записи о людях. Но при добавлении столбца в модель данных ничего не происходит. Если добавлять столбец в модель столбцов то он заполняется данными, взятыми из 1-ого столбца. Какой то бред. Ничего не пойму. Помогите найти ошибку. Ниже код: | Код |
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList;
import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel;
public class TestTable {
public static void main(String[] args) { Window window = new Window(); window.setVisible(true); } private static class Window extends JFrame implements ActionListener{ private HumanTableModel model; private JTable table; public Window() { super(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setContentPane(getContentPane()); pack(); } public JPanel getContentPane(){ JPanel contentPane = new JPanel(new FlowLayout()); JScrollPane pane = new JScrollPane(); table = new JTable(); model = new HumanTableModel("имя","пол","возраст"); // добавление людей Human h1 = new Human("Олег","мужской",23); Human h2 = new Human("Юлия","женский",34); Human h3 = new Human("Андрей","мужской",27);
model.addHuman(h1); model.addHuman(h2); model.addHuman(h3); table.setModel(model); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); pane.setViewportView(table); contentPane.add(pane); JButton btn = new JButton("добавить рост"); btn.addActionListener(this); contentPane.add(btn); return contentPane; } @Override public void actionPerformed(ActionEvent e) { addGrowthHumanToModel(); } /** * Метод должен добавить новую колонку - "рост" в модель */ private void addGrowthHumanToModel(){ int defaultValue = 170; // значение роста по умолчанию // проставляем уже существуюшим людям значения роста по умолчанию for (Human h:model.humans) h.addValue(defaultValue); // добавляем колонку model.addColumn("рост"); //table.addColumn(new TableColumn()); } // модель для хранения списка людей в таблице private class HumanTableModel extends AbstractTableModel{ ArrayList<Human> humans = new ArrayList<Human>(); // люди (строки в таблице) ArrayList<String> colNames = new ArrayList<String>(); // характеристики людей (столбцы в таблице) public HumanTableModel(String... colNames) { for (int i = 0;i<colNames.length;i++) addColumn(colNames[i]); } @Override public int getRowCount() { return humans.size(); } @Override public int getColumnCount() { return colNames.size(); } @Override public String getColumnName(int column) { return colNames.get(column); } @Override public Class<?> getColumnClass(int columnIndex) { return humans.get(columnIndex).getClass(); } @Override public Object getValueAt(int row, int column) { Human h = humans.get(row); return h.getValue(column); } @Override public void setValueAt(Object value, int rowIndex, int columnIndex) { Human h = humans.get(rowIndex); h.setValue(columnIndex, value); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return true; } // Добавляет человека в таблицу (как новую строку) public void addHuman(Human h){ humans.add(h); fireTableDataChanged(); } // Удаляет человека из таблицы public void delHuman(int ind){ humans.remove(ind); fireTableDataChanged(); } // добавляет новый параметр человека (новая колонка) public void addColumn(String colName){ colNames.add(colName); fireTableDataChanged(); } // удаляет параметр человека public void delColumn(int ind){ colNames.remove(ind); fireTableDataChanged(); }
} }
}
|
Ну и сам класс Human: | Код | import java.util.ArrayList;
public class Human {
private ArrayList<Object> values; public Human() { values = new ArrayList<Object>(); } public Human(Object... values){ this(); addValues(values); } public void addValue(Object value){ values.add(value); } public void addValues(Object... values){ for (int i = 0;i<values.length;i++) addValue(values[i]); } public Object getValue(int ind){ return values.get(ind); } public Object setValue(int ind, Object value){ return values.set(ind, value); } }
|
Это сообщение отредактировал(а) x8m6 - 12.6.2010, 01:00
|