Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / jTable, удаление строки / 10 сообщений из 10, страница 1 из 1
07.08.2007, 15:26:04
    #34711158
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jTable, удаление строки
Добрый день!
Подскажите, как правильно удалять строки ( row ) из jTable, перечитал литературу ( каюсь, Портянкина у меня нет, может в той книге я нашел бы ответ ), но так и не получилось сложить полученную информацию во единое ...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
 package  BlackContacts;
 import  java.util.*;
 import  java.awt.*;
 import  java.awt.event.*;
 import  java.io.*;
 import  javax.swing.*;
 import  javax.swing.event.*;
 import  javax.swing.table.*;

 public   class  MainFrame  extends  javax.swing.JFrame 
{
     private   static   final   long  serialVersionUID = 3228205948477711045L; 
     private   static   final   int  DEFAULT_WIDTH =  800 ;
     private   static   final   int  DEFAULT_HEIGHT =  600 ;
     private  DefaultContactsTableModel defaultTableModel =  new  DefaultContactsTableModel();
     private  SortContactsTableModel sortTableModel =  new  SortContactsTableModel( defaultTableModel );
    
    /** Creates new form MainFrame */
     public  MainFrame() 
    {        
        initComponents();
        setSize( DEFAULT_WIDTH, DEFAULT_HEIGHT );
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
     private   void  initComponents() {
        rootPanel =  new  javax.swing.JPanel();
        ContactsScrollPane =  new  javax.swing.JScrollPane();
        MenuBar =  new  javax.swing.JMenuBar();
        FilejMenu =  new  javax.swing.JMenu();
        ExitFilejMenuItem =  new  javax.swing.JMenuItem();
        ContactjMenu =  new  javax.swing.JMenu();
        NewContactjMenuItem =  new  javax.swing.JMenuItem();

        ....

        ContactsTable.setModel(sortTableModel);
        ContactsTable.getTableHeader().addMouseListener
        (
             new  MouseAdapter()
            {
                 public   void  mouseClicked( MouseEvent event )
                {
                     if  ( event.getClickCount() <  2  )  return ;
                     int  tableColumn = ContactsTable.columnAtPoint( event.getPoint() );
                     int  modelColumn = ContactsTable.convertColumnIndexToModel( tableColumn );
                    sortTableModel.sort( modelColumn );
                }
            }
        );
        
        ...

        pack();
    }// </editor-fold>                        

        // Слушатель удаление строк
     private   void  ContactsTableKeyPressed(java.awt.event.KeyEvent evt) {                                         
        // TODO add your handling code here:
         if  ( evt.getKeyText( evt.getKeyCode() ).equals( "Delete" ) && ContactsTable.getSelectedRowCount() >  0  )
        {
             int [] selected = ContactsTable.getSelectedRows();
            ContactsTable.clearSelection();
             for  (  int  i = selected.length -  1 ; i >=  0 ; i-- ) sortTableModel.delete( selected[i] );
            //ContactsTable.repaint();
        }
    }                                        

    ...                                             
    
    /**
     * @param args the command line arguments
     */
     public   static   void  main(String args[]) 
    {
        java.awt.EventQueue.invokeLater
        (
             new  Runnable() 
            {
                 public   void  run() 
                {
                     new  MainFrame().setVisible(true);
                }
            }
        );
    }
    
     class  DefaultContactsTableModel  extends  AbstractTableModel 
    {
         private   static   final   long  serialVersionUID = 3228235948477711045L; 
         private  Contact contact;
         private  java.util.List<Contact> contacts;
        
         public  DefaultContactsTableModel () 
        {
             try 
            {
                contact =  new  Contact();
                contacts =  new  GetContacts( "name" ).get();
            }
             catch ( IOException e )
            {
                System.exit( 0 );
            }
        }
        
         public   int  getRowCount() {  return  contacts.size(); }
         public   int  getColumnCount() {  return   4 ; }
        
         public  Object getValueAt(  int  row,  int  col )
        {
            Object s =  null ;
            
             if  ( col ==  0  ) s = contacts.get( row ).name();
             else   if  ( col ==  1  ) s = contacts.get( row ).lastName();
             else   if  ( col ==  2  ) s = contacts.get( row ).phoneNumber();
             else   if  ( col ==  3  ) s = contacts.get( row ).email();
             else   if  ( col ==  4  ) s = contacts.get( row ).byteNumber();
             else   if  ( col ==  5  ) s = contacts.get( row ).id();
            
             return  s;
        }
        
         public   boolean  isCellEditable(  int  row,  int  col ) {  return  true; }
        
         public   void  setValueAt( Object newValue,  int  row,  int  col ) 
        {
             int  update =  0 ;
                    
             if  ( col ==  0  && !contacts.get( row ).name().equals( newValue ) ) 
            {
                update =  1 ; 
                contacts.get( row ).name( newValue );
            }
             else   if  ( col ==  1  && !contacts.get( row ).lastName().equals( newValue ) ) 
            {
                update =  1 ; 
                contacts.get( row ).lastName( newValue );
            }
             else   if  ( col ==  2  && !contacts.get( row ).phoneNumber().equals( newValue ) ) 
            {
                update =  1 ; 
                contacts.get( row ).phoneNumber( newValue );
            }
             else   if  ( col ==  3  && !contacts.get( row ).email().equals( newValue ) ) 
            {
                update =  1 ; 
                contacts.get( row ).email( newValue );
            }
            
             if  ( update ==  1  )
            {
                 try 
                {
                    EditContact ec =  new  EditContact
                    (
                             new  Contact
                            (
                                contacts.get( row ).byteNumber(), 
                                contacts.get( row ).id(), 
                                contacts.get( row ).name(), 
                                contacts.get( row ).lastName(), 
                                contacts.get( row ).phoneNumber(), 
                                contacts.get( row ).email() 
                            )
                    );
                     if  ( ec.edit() ) 
                    {
                        System.out.println("Контакт id " + contacts.get( row ).id() + " успешно изменен!");
                    }
                }
                 catch  ( IOException e ) { System.exit( 0 ); }
            }
        }
        
         public   void  delete(  int  row )
        {
            contacts.remove( row );
            fireTableRowsDeleted( row, row );
        }
        
         public  String getColumnName(  int  col ) 
        { 
            String s =  null ;
                        
             if  ( col ==  0  ) s = contact.nameTitle();
             else   if  ( col ==  1  ) s = contact.lastNameTitle();
             else   if  ( col ==  2  ) s = contact.phoneNumberTitle();
             else   if  ( col ==  3  ) s = contact.emailTitle();        
            
             return  s;
        }
    }
    
     class  SortContactsTableModel  extends  AbstractTableModel 
    {
         private   static   final   long  serialVersionUID = 3228135948477711045L; 
         private  TableModel model;
         private   int  sortColumn;
         private  ArrayList<Row> rows;
        
         public  SortContactsTableModel ( TableModel model )
        {
             this .model = model;
            rows =  new  ArrayList<Row>();
            
             for  (  int  i =  0 ; i <  this .model.getRowCount(); i++ ) rows.add(  new  Row( i ) );
        }
        
         public   void  sort(  int  col )
        {
            sortColumn = col;
            Collections.sort( rows );
            fireTableDataChanged();
        }
        
         public  Object getValueAt(  int  row,  int  col ) {  return  model.getValueAt( rows.get( row ).getIndex(), col ); }
         public   boolean  isCellEditable(  int  row,  int  col ) {  return  model.isCellEditable( rows.get( row ).getIndex(), col ); }
         public   void  setValueAt( Object aValue,  int  row,  int  col ) { model.setValueAt( aValue, rows.get( row ).getIndex(), col ); }        
        
         public   void  delete(  int  row )
        {            
            // Что тут написать?
            //rows.remove( row );
            

            defaultTableModel.delete( row );
            
            //rows.clear();
            //for ( int i = 0; i < model.getRowCount(); i++ ) rows.add( new Row( i ) );
        }
        
         public   int  getRowCount() {  return  model.getRowCount(); }
         public   int  getColumnCount() {  return  model.getColumnCount(); }
         public  String getColumnName(  int  col ) {  return  model.getColumnName( col ); }
         public   Class  getColumnClass(  int  col ) {  return  model.getColumnClass( col ); }
        
         class  Row  implements  Comparable<Row>
        {
             private   int  index;
            
             public  Row(  int  index )
            {
                 this .index = index;
            }
            
             public   int  compareTo( Row other )
            {
                Object a = model.getValueAt( index, sortColumn );
                Object b = model.getValueAt( other.index, sortColumn );
                 if  ( a  instanceof  Comparable )  return  ((Comparable) a).compareTo( b );
                 else   return  a.toString().compareTo( b.toString() );
            }
            
             public   int  getIndex() {  return  index; }
        }
    }
    
    // Variables declaration - do not modify                     
     private  javax.swing.JMenu ContactjMenu;
     private  javax.swing.JScrollPane ContactsScrollPane;
     private   final  javax.swing.JTable ContactsTable =  new  javax.swing.JTable();
     private  javax.swing.JMenuItem ExitFilejMenuItem;
     private  javax.swing.JMenu FilejMenu;
     private  javax.swing.JMenuBar MenuBar;
     private  javax.swing.JMenuItem NewContactjMenuItem;
     private  javax.swing.JPanel rootPanel;
    // End of variables declaration                   
    
}


Как я понимаю, для удаления строк из таблицы, надо удалить значения из модели таблицы ... у меня есть две модели, defaultTableModel... и sortTableModel... которая наследует defaultTableModel ...

в sortTableModel у меня есть индексируемая последовательность, которая хранит индекс для сортировки.

Подскажите, из какой модели ( или обоих ) надо удалять запись о строке?!
Что мне делать с последовательностью rows, ведь после удаления элемента, она хранит неверный индеск!

Заранее очень благодарен, если кто-то сможет внести ясность в данный вопрос!!!
...
Рейтинг: 0 / 0
07.08.2007, 15:32:27
    #34711181
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jTable, удаление строки
какую модель таблице дали, из той и удаляйте.
портянкин есть на www.programmizd.ru до завтра (срок делигирования
кончается завтра, и если меня одолеет лень с проплатой, завтра все
накроется)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.08.2007, 16:26:19
    #34711402
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jTable, удаление строки
Deady
какую модель таблице дали, из той и удаляйте.
портянкин есть на www.programmizd.ru до завтра (срок делигирования
кончается завтра, и если меня одолеет лень с проплатой, завтра все
накроется)
Posted via ActualForum NNTP Server 1.4
Спасибо за подсказку и ссылку, но, к сожалению, в той книге нет упоминания о удаление строки :(

Когда я удаляю элемент из sortTableModel
Код: plaintext
1.
2.
            rows.remove( row );
            fireTableRowsDeleted( row, row );
я получаю экзепшен java.lang.IndexOutOfBoundsException, т.к. индекс в rows выходит за пределы ...
у меня никак не получается, собрать все в единое целое :(
...
Рейтинг: 0 / 0
07.08.2007, 16:39:53
    #34711485
hinotf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jTable, удаление строки
DefaultTableModel.removeRow();

Nai tiruvantel ar varyuvantel i Valar tieyanna nu vilya
Aiya Eärendil Elenion Ancalima!
...
Рейтинг: 0 / 0
07.08.2007, 16:42:33
    #34711498
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jTable, удаление строки
hinotfDefaultTableModel.removeRow();

Nai tiruvantel ar varyuvantel i Valar tieyanna nu vilya
Aiya Eärendil Elenion Ancalima!
спасибо конечно, но где Вы увидели у меня модель наследуюущую DefaultTableModel ?
...
Рейтинг: 0 / 0
07.08.2007, 16:44:43
    #34711513
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jTable, удаление строки
У тебя 2-е модели, из двух и удаляй. Наверное.
...
Рейтинг: 0 / 0
07.08.2007, 16:45:58
    #34711521
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jTable, удаление строки
напишите там

model.delete(row)

а вообще сами наверно понимаете как все запущено.
ваш DefaultContactsTableModel при удалении вызовет fireRowsDeleted, но
ничего не произойдет. вам нужно делегировать вызов
addКакой-то-тамListener в SortContactsTableModel:

model.addКакой-то-тамListener(listener);
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.08.2007, 16:48:34
    #34711535
hinotf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jTable, удаление строки
А я не читал код, там слишком много нот. Подумалось, что именуете согласно стандарту.

Nai tiruvantel ar varyuvantel i Valar tieyanna nu vilya
Aiya Eärendil Elenion Ancalima!
...
Рейтинг: 0 / 0
07.08.2007, 16:55:31
    #34711574
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jTable, удаление строки
Deady
напишите там
model.delete(row)

Интересно, но почему-то метод delete не виден в модели model !?

Deady
а вообще сами наверно понимаете как все запущено.
ваш DefaultContactsTableModel при удалении вызовет fireRowsDeleted, но
ничего не произойдет. вам нужно делегировать вызов
addКакой-то-тамListener в SortContactsTableModel:

model.addКакой-то-тамListener(listener);

Я об этом догадывался, но моих знаний, пока не хватает ...
Скажите, а зачем мне добавлять листенер?

Очень был бы благодарен, если Вы более раскрыли свой совет ...
...
Рейтинг: 0 / 0
07.08.2007, 17:07:37
    #34711625
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jTable, удаление строки
> Интересно, но почему-то метод delete не виден в модели model !?

потому что у вас модель типа TableModel, сделайте ее типа
DefaultContactsModel.

> model.addКакой-то-тамListener(listener);
>
> Я об этом догадывался, но моих знаний, пока не хватает ...
> Скажите, а зачем мне добавлять листенер?
>
> Очень был бы благодарен, если Вы более раскрыли свой совет ...

когда вы присоедините модель к таблице, таблица тут же добавит своих
слушателей.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / jTable, удаление строки / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]