Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не добавляется колонка в TableModel 
V
    Опции темы
x8m6
Дата 12.6.2010, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



Написал свою модель данных для таблицы, хранящей записи о людях. Но при добавлении столбца в модель данных ничего не происходит. Если добавлять столбец в модель столбцов то он заполняется данными, взятыми из 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
PM MAIL   Вверх
dorogoyIV
Дата 12.6.2010, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



не глядя сразу скажу - методы не так пишутся...

Цитата(x8m6 @  12.6.2010,  00:58 Найти цитируемый пост)
public Object setValue(int ind, Object value){        return values.set(ind, value);    }


Код

 public void setValue(int ind, Object value) {
  values.set(ind, value);
 }

PM MAIL   Вверх
x8m6
Дата 12.6.2010, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



Цитата

не глядя сразу скажу - методы не так пишутся...

А как же?
PM MAIL   Вверх
pathfinder
Дата 12.6.2010, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 7
Всего: 10



В методах addColumn/delColumn вместо fireTableDataChanged нужно использовать fireTableStructureChanged.
PM MAIL   Вверх
x8m6
Дата 12.6.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



Цитата

В методах addColumn/delColumn вместо fireTableDataChanged нужно использовать fireTableStructureChanged. 

Да уже нашел. Спасибо. Еще в этом примере неправильный метод getColumnClass. Должно быть так:
Код

 @Override
            public Class<?> getColumnClass(int columnIndex) {                
                return humans.get(0).getValue(columnIndex).getClass();
            }


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.