powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / непонятки с removeRow и moveRow
4 сообщений из 4, страница 1 из 1
непонятки с removeRow и moveRow
    #34098794
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот исходник:
Код: 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.
 import  java.awt.BorderLayout;
 import  javax.swing.JPanel;
 import  javax.swing.JFrame;
 import  javax.swing.JButton;
 import  javax.swing.JScrollPane;
 import  javax.swing.JTable;
 import  javax.swing.table.DefaultTableModel;
 import  java.awt.GridLayout;

 public   class  MainFrm  extends  JFrame {

	 private   static   final   long  serialVersionUID = 1L;

	 private  JPanel jContentPane =  null ;

	 private  JScrollPane jScrollPane =  null ;

	 private  JTable jTable =  null ;
	 private  String[] columnNames = {"ID","First Name",
            "Last Name",
            "Sport",
            "# of Years",
            "Vegetarian"};

	 private  Object[][] data = {
{ null ,"Mary", "Campione",
"Snowboarding",  new  Integer( 5 ),  new   Boolean (false)},
{ null ,"Alison", "Huml",
"Rowing",  new  Integer( 3 ),  new   Boolean (true)},
{ null ,"Kathy", "Walrath",
"Knitting",  new  Integer( 2 ),  new   Boolean (false)},
{ null ,"Sharon", "Zakhour",
"Speed reading",  new  Integer( 20 ),  new   Boolean (true)},
{ null ,"Philip", "Milne",
"Pool",  new  Integer( 10 ),  new   Boolean (false)}
};

	 private  JPanel jPanel =  null ;

	 private  JButton jButton =  null ;

	 private  JButton jButton1 =  null ;

	 private  JButton jButton2 =  null ;
	MyModel tm;


	 private   class  MyModel  extends  DefaultTableModel {
		
		 public  MyModel(Object[][] data, Object[] names) {
			 super (data,names);
		}
		
	     public  Object getValueAt( int  row,  int  col) {
	    	 if  (col== 0 ) {
	    		 return  row+ 1 ;
	    	}  else  {
	             return  data[row][col];
	    	}
	    }

	     public   void  setValueAt(Object value,  int  row,  int  col) {
	        data[row][col] = value;
	        fireTableCellUpdated(row, col);
	    }

	     public   boolean  isCellEditable( int  row,  int  col) {
	        //Note that the data/cell address is constant,
	        //no matter where the cell appears onscreen.
	         if  (col ==  0 ) {
	             return  false;
	        }  else  {
	             return  true;
	        }
	    }
	    
	}
	
	/**
	 * This is the default constructor
	 */
	 public  MainFrm() {
		 super ();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	 private   void  initialize() {
		 this .setSize( 300 ,  200 );
		 this .setContentPane(getJContentPane());
		 this .setTitle("JFrame");

		tm =  new  MyModel(data, columnNames);
		jTable.setModel(tm);
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	 private  JPanel getJContentPane() {
		 if  (jContentPane ==  null ) {
			jContentPane =  new  JPanel();
			jContentPane.setLayout( new  BorderLayout());
			jContentPane.add(getJScrollPane(), BorderLayout.CENTER);
			jContentPane.add(getJPanel(), BorderLayout.NORTH);
		}
		 return  jContentPane;
	}

	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	 private  JScrollPane getJScrollPane() {
		 if  (jScrollPane ==  null ) {
			jScrollPane =  new  JScrollPane();
			jScrollPane.setViewportView(getJTable());
		}
		 return  jScrollPane;
	}

	/**
	 * This method initializes jTable	
	 * 	
	 * @return javax.swing.JTable	
	 */
	 private  JTable getJTable() {
		 if  (jTable ==  null ) {
			jTable =  new  JTable();
		}
		 return  jTable;
	}

	/**
	 * This method initializes jPanel	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	 private  JPanel getJPanel() {
		 if  (jPanel ==  null ) {
			GridLayout gridLayout =  new  GridLayout();
			gridLayout.setRows( 1 );
			jPanel =  new  JPanel();
			jPanel.setLayout(gridLayout);
			jPanel.add(getJButton1(),  null );
			jPanel.add(getJButton(),  null );
			jPanel.add(getJButton2(),  null );
		}
		 return  jPanel;
	}

	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	 private  JButton getJButton() {
		 if  (jButton ==  null ) {
			jButton =  new  JButton();
			jButton.setText("v");
		}
		 return  jButton;
	}

	/**
	 * This method initializes jButton1	
	 * 	
	 * @return javax.swing.JButton	
	 */
	 private  JButton getJButton1() {
		 if  (jButton1 ==  null ) {
			jButton1 =  new  JButton();
			jButton1.setText("^");
			jButton1.addActionListener( new  java.awt.event.ActionListener() {
				 public   void  actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
					 int  selRow = jTable.getSelectedRow();
					System.out.println(selRow);
					((DefaultTableModel)jTable.getModel()).removeRow( 1 );
					 if  (selRow> 0 ) {
						//((DefaultTableModel)jTable.getModel()).moveRow(selRow, selRow, selRow-1);
						//jTable.repaint();
					}
				}
			});
		}
		 return  jButton1;
	}

	/**
	 * This method initializes jButton2	
	 * 	
	 * @return javax.swing.JButton	
	 */
	 private  JButton getJButton2() {
		 if  (jButton2 ==  null ) {
			jButton2 =  new  JButton();
		}
		 return  jButton2;
	}

}

На кнопку JButton1 повешено действие - удаление из модели строки 1 (т.е. второй). Однако у меня всегда удаляется последняя... Что не так.
Также видна закомментированная попытка вызова moveRow (собственно, с нее все началось). Никакого перемещения не происходит.
Я предположил, что нужно перекрыть этот метод и писать свой обработчик, но для проверки решил вызвать удаление - оно работает, но не так, как ожидал.

PS. Да, я еще только разбираюсь с джавой, поэтому вопросы может и глупые.
...
Рейтинг: 0 / 0
непонятки с removeRow и moveRow
    #34099177
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка в модели. Вы передаете в конструктор
Код: plaintext
MyModel
двумерный массив данных, который модель
Код: plaintext
DefaultTableModel
конвертирует в вектор (точнее вектор, элементы которого также являются векторами).
Затем, в переопределенных методах модели
Код: plaintext
1.
 public  Object getValueAt( int  row,  int  col) { ... }
и
Код: plaintext
1.
 public   void  setValueAt(Object value,  int  row,  int  col) { ... }
вы работаете со своим массивом, тогда как нужно работать с вектором модели.

Вот исправленный код:

Код: 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.
 import  javax.swing.*;
 import  javax.swing.table.DefaultTableModel;
 import  java.awt.*;
 import  java.util.Vector;

 public   class  MainFrm  extends  JFrame {

     private   static   final   long  serialVersionUID = 1L;

     private  JPanel jContentPane =  null ;

     private  JScrollPane jScrollPane =  null ;

     private  JTable jTable =  null ;
     private  String[] columnNames = {"ID", "First Name",
            "Last Name",
            "Sport",
            "# of Years",
            "Vegetarian"};

     private  Object[][] data = {
            { null , "Mary", "Campione", "Snowboarding",  new  Integer( 5 ),  new   Boolean (false)},
            { null , "Alison", "Huml", "Rowing",  new  Integer( 3 ),  new   Boolean (true)},
            { null , "Kathy", "Walrath", "Knitting",  new  Integer( 2 ),  new   Boolean (false)},
            { null , "Sharon", "Zakhour", "Speed reading",  new  Integer( 20 ),  new   Boolean (true)},
            { null , "Philip", "Milne", "Pool",  new  Integer( 10 ),  new   Boolean (false)}
    };

     private  JPanel jPanel =  null ;

     private  JButton jButton =  null ;

     private  JButton jButton1 =  null ;

     private  JButton jButton2 =  null ;
    MyModel tm;


     private   class  MyModel  extends  DefaultTableModel {

         public  MyModel(Object[][] data, Object[] names) {
             super (data, names);
        }

         public  Object getValueAt( int  row,  int  col) {
             if  (col ==  0 ) {
                 return  row +  1 ;
            }  else  {
                 return  ((Vector) dataVector.get(row)).get(col);
            }
        }

         public   void  setValueAt(Object value,  int  row,  int  col) {
            ((Vector) dataVector.get(row)).set(col, value);

            fireTableCellUpdated(row, col);
        }

         public   boolean  isCellEditable( int  row,  int  col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
             if  (col ==  0 ) {
                 return  false;
            }  else  {
                 return  true;
            }
        }

    }

    /**
     * This is the default constructor
     */
     public  MainFrm() {
         super ();
        initialize();
    }

    /**
     * This method initializes this
     *
     * @return void
     */
     private   void  initialize() {
         this .setSize( 300 ,  200 );
         this .setContentPane(getJContentPane());
         this .setTitle("JFrame");

        tm =  new  MyModel(data, columnNames);
        jTable.setModel(tm);
    }

    /**
     * This method initializes jContentPane
     *
     * @return javax.swing.JPanel
     */
     private  JPanel getJContentPane() {
         if  (jContentPane ==  null ) {
            jContentPane =  new  JPanel();
            jContentPane.setLayout( new  BorderLayout());
            jContentPane.add(getJScrollPane(), BorderLayout.CENTER);
            jContentPane.add(getJPanel(), BorderLayout.NORTH);
        }
         return  jContentPane;
    }

    /**
     * This method initializes jScrollPane
     *
     * @return javax.swing.JScrollPane
     */
     private  JScrollPane getJScrollPane() {
         if  (jScrollPane ==  null ) {
            jScrollPane =  new  JScrollPane();
            jScrollPane.setViewportView(getJTable());
        }
         return  jScrollPane;
    }

    /**
     * This method initializes jTable
     *
     * @return javax.swing.JTable
     */
     private  JTable getJTable() {
         if  (jTable ==  null ) {
            jTable =  new  JTable();
        }
         return  jTable;
    }

    /**
     * This method initializes jPanel
     *
     * @return javax.swing.JPanel
     */
     private  JPanel getJPanel() {
         if  (jPanel ==  null ) {
            GridLayout gridLayout =  new  GridLayout();
            gridLayout.setRows( 1 );
            jPanel =  new  JPanel();
            jPanel.setLayout(gridLayout);
            jPanel.add(getJButton1(),  null );
            jPanel.add(getJButton(),  null );
            jPanel.add(getJButton2(),  null );
        }
         return  jPanel;
    }

    /**
     * This method initializes jButton
     *
     * @return javax.swing.JButton
     */
     private  JButton getJButton() {
         if  (jButton ==  null ) {
            jButton =  new  JButton();
            jButton.setText("v");
        }
         return  jButton;
    }

    /**
     * This method initializes jButton1
     *
     * @return javax.swing.JButton
     */
     private  JButton getJButton1() {
         if  (jButton1 ==  null ) {
            jButton1 =  new  JButton();
            jButton1.setText("^");
            jButton1.addActionListener( new  java.awt.event.ActionListener() {
                 public   void  actionPerformed(java.awt.event.ActionEvent e) {
                    System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
                     int  selRow = jTable.getSelectedRow();
                    System.out.println(selRow);
                    ((MyModel) jTable.getModel()).removeRow( 1 );
                     if  (selRow >  0 ) {
                        //((DefaultTableModel)jTable.getModel()).moveRow(selRow, selRow, selRow-1);
                        //jTable.repaint();
                    }
                }
            });
        }
         return  jButton1;
    }

    /**
     * This method initializes jButton2
     *
     * @return javax.swing.JButton
     */
     private  JButton getJButton2() {
         if  (jButton2 ==  null ) {
            jButton2 =  new  JButton();
        }
         return  jButton2;
    }
}
...
Рейтинг: 0 / 0
непонятки с removeRow и moveRow
    #34099238
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял. Огромное спасибо.
...
Рейтинг: 0 / 0
непонятки с removeRow и moveRow
    #34099551
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А глюк, между прочим, из-за того, что когда вы удаляете 1-ю строку таблицы, она удаляется из вектора модели и количество строк становится равным 4-м. Затем модель перечитывает данные и читает первые 4 строки ваших данных, включая и 1-ю строку, которая была удалена. Таким образом создается впечатление, что всегда удаляется последняя строка.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / непонятки с removeRow и moveRow
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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