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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отсортировать данные в JTable 
:(
    Опции темы
rang3r
Дата 28.1.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток всем, пишу на Java форум, при выводе сообщений в таблицу возникла такая проблема, некоторые ответы(потомки сообщения) отображаются выше чем потомки того же уровня, но которые были добавлены раньше, как решить данную проблему, хотелось бы пример с сортировкой по Дате. Вот код модели таблицы и код класса Message
Код

public class MessageTableModel extends AbstractTableModel
{
    private Collection<ParentObject> messages = Manager.getObjectCol(Message.class);
    private Topic topic;
    private Collection messForTopic = getMessages(topic);
    private ArrayList<Message> messForTable;
    private HashMap mess =new HashMap();
    public void setTop(Topic top)
    {
        if (top != null)
        {
            topic = top;
            messages = Manager.getObjectCol(Message.class);
            messForTopic = getMessages(top);
            messForTable = new ArrayList<Message>();
            if (messForTopic.size() != 0)
            {
                buildHierarchicMessage(messForTopic, null, 0);
            }
            TableModelEvent tEvent = new TableModelEvent(this);
            this.fireTableChanged(tEvent);
        }
    }


    private Collection getMessages(Topic top)
    {
        Collection mess = new ArrayList();
        for (Object obj : messages)
        {

            if (top != null)
                if (((Message) obj).getTop().getId().equals(top.getId()))
                    mess.add(obj);

        }
        return mess;
    }


    private void buildHierarchicMessage(Collection<Message> messages, Message parentMessage, int lvl)
    {
        for (Message message : messages)
        {
            if (Utils.areEquals(message.getParent(), parentMessage))
            {
                String str= "";
                for (int i = 0; i < lvl; i++)
                    str += "  ";
                messForTable.add((Message) message.clone());
                mess.put(message,lvl);
                buildHierarchicMessage(messages, message, lvl + 1);
            }
        }
    }
    private String buildTabulation(Message mes)
    {
           
           Integer lvl= (Integer) mess.get(mes);
           String str="";
             for(int i=0;i<lvl;i++)
              str+="  ";
         return str;
    }

    public void getFindMessage(ArrayList list)
    {
        messForTopic = list;
        TableModelEvent tEvent = new TableModelEvent(this);
        this.fireTableChanged(tEvent);
    }

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

    public int getColumnCount()
    {
        return 4;
    }

    public Object getValueAt(int rowIndex, int columnIndex)
    {
        ArrayList<Message> message = new ArrayList<Message>();
        for (Message mes : messForTable)
            message.add(mes);
        switch (columnIndex)
        {
            case 0:
                return buildTabulation(message.get(rowIndex))+(message.get(rowIndex)).getName();
            case 1:
                if ((message.get(rowIndex)).getParent() != null)
                    return (message.get(rowIndex)).getParent().getName();
                else
                    return "";
            case 2:
                return message.get(rowIndex).getCreator().getLogin();
            case 3:
                return (message.get(rowIndex)).getDate();
            default:
                return message.get(rowIndex);
        }
    }

    public Message getMessage(int rowIndex)
    {
        return (Message) getValueAt(rowIndex, 4);
    }

    public String getColumnName(int column)
    {
        switch (column)
        {
            case 0:
                return "Name";
            case 1:
                return "Message Parent";
            case 2:
                return "Creator";
            case 3:
                return "Date";
        }
        return super.getColumnName(column);
    }

    public boolean isCellEditable(int rowIndex, int columnIndex)
    {
        return false;
    }

    public Class<?> getColumnClass(int columnIndex)
    {
        switch (columnIndex)
        {
            case 0:
                return String.class;
            case 1:
                return String.class;
            case 2:
                return String.class;
            case 3:
                return Date.class;
            default:
                return Object.class;
        }

    }

    public boolean deleteMessage(int[] mas, Topic top)
    {
        if (mas.length != 0)
        {
            for (Object obj : mas)
            {
                Message mes = getMessage((Integer) obj);
                deleteChild(mes.getId(), mes.getClass());
                Manager.removeObject(mes.getId(), Message.class);
            }
            setTop(top);

            return true;
        }
        return false;
    }

    private void deleteChild(Long id, Class clazz)
    {
        List<ParentObject> childs = Manager.findChildren(id, clazz);
        for (ParentObject obj : childs)
        {
            Manager.removeObject(obj.getId(), clazz);
        }
    }

    public Topic getTopic()
    {
        return topic;
    }

    public void fireTableChanged(TableModelEvent e)
    {
        super.fireTableChanged(e);
    }
}

public class Message extends ParentObject
{
    private String body;
    private Message parent;//+
    private Topic top;
    private User creator;//++
    private Date date=new Date();//++

    public Message(String name, String body, User creator, ParentObject top, ParentObject parent) throws NullNameException
    {
        super(name);
        setBody(body);
        setCreator(creator);
        setTop((Topic) top);
        setParent((Message) parent);
    }
    public void setCreator(User creator)
    {
       if(creator!=null)
        this.creator=creator;
       else
        throw new IllegalArgumentException("field creator is empthy");
    }

    public User getCreator()
    {
        return creator;
    }
    public String getBody()
    {
        return body;
    }

    public void setBody(String body)
    {
       if(body!=null)
        this.body = body;
       else
        throw new IllegalArgumentException("field body is empthy");
    }

    public ParentObject getParent()
    {
        return parent;
    }

    public void setParent(Message parent)
    {
        this.parent = parent;
    }

    public Topic getTop()
    {
        return top;
    }

    public void setTop(Topic top)
    {
       if(top!=null)
        this.top = top;
       else
       {
           new JDialog(new JFrame(),"Choose topic",true); //todo
           throw new IllegalArgumentException("Choose topic for create message");
       }
       }

    public String  toString()
    {
        return  String.valueOf("name: " + name + "  body: " + body+ "  creator: "+creator.getLogin()+" id:"+ id);
    }

    public Date getDate()
    {
        return date;
    }
}

 
PM MAIL Skype   Вверх
COVD
Дата 28.1.2010, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



У вас довольно грубая, на мой взгляд, ошибка. В методе public Object getValueAt(int rowIndex, int columnIndex) вы всякий раз заново создаете модель ( ArrayList<Message> message = new ArrayList<Message>(); )  . Это не только источник проблем, но и медленно очень будет работать - этот метод вызывается при любой перерисовке таблицы. Модель надо создавать один раз. Если данные в модели изменились, то надо уведомить таблицу.

Это сообщение отредактировал(а) COVD - 28.1.2010, 22:14
PM MAIL   Вверх
rang3r
Дата 28.1.2010, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо за указание ошибки, исправил, может еще какие будут замечания?
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0713 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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