powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка при удалении записи из таблицы
4 сообщений из 4, страница 1 из 1
Ошибка при удалении записи из таблицы
    #39033893
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Подскажите, пожалуйста, с чем может быть связана ошибка. Сам никак найти не могу
Класс таблицы:

Код: java
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.
import java.awt.HeadlessException;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import net.proteanit.sql.DbUtils;


public class DublicateJFrame extends javax.swing.JFrame {

    static Connection conn = null;

    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    public javax.swing.JProgressBar jProgressBar1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    public javax.swing.JPanel pan;
    public javax.swing.JLabel jLabel1;
    
    JTableHeader th;
    TableColumnModel tcm;
    int row;         
    DublicateJFrame current=this;
   
    public DublicateJFrame() {
    initComponents();

    setSize(670, 690);
    
    try{
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection("jdbc:mysql://localhost/db","login","password");
         
     }        
        catch(Exception e) {
            JOptionPane.showMessageDialog(null,"Connection to Database server Error in mysqlconnect " + e);
    }
        for(int c=0; c<jTable1.getColumnCount();c++)
        {// remove editor 
        Class<?> col_class = jTable1.getColumnClass(c);
        jTable1.setDefaultEditor(col_class, null); 
       }
              
    jTable1.setDefaultEditor(String.class, null);
    jTable1.setAutoCreateRowSorter(true);
        
    UpdateJTable (); 
    
    jTable1.addKeyListener(new KeyListener() {
        @Override
        public void keyPressed(KeyEvent e) {
                                          
            // Обработчик нажатия на DELETE   
           
                if(e.getKeyCode() == KeyEvent.VK_DELETE) {   
               
                 int n = JOptionPane.showConfirmDialog(null,
                "Вы действительно хотите удалить запись из таблицы?",
                "Удаление записи из таблицы",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.QUESTION_MESSAGE);
                
                 if (n==0){
                jProgressBar1.setIndeterminate(true);
                
                row=jTable1.convertRowIndexToModel(jTable1.getSelectedRow()); //Текущая строка;
                
                //Максимальный id
                String max_id="SELECT MAX(id) FROM changes WHERE pcname='"+jTable1.getModel().getValueAt(row, 0).toString()+"'"+ "and inv='"+jTable1.getModel().getValueAt(row, 1).toString() +"' AND ip='"+jTable1.getModel().getValueAt(row, 2).toString()+"' AND mac='"+jTable1.getModel().getValueAt(row, 3).toString()+"';";
                 
                //Удаление по максимальному id                      
                String del_str="DELETE FROM changes WHERE pcname='"+jTable1.getModel().getValueAt(row, 0).toString()+"'"+ "and inv='"+jTable1.getModel().getValueAt(row, 1).toString() +"' AND ip='"+jTable1.getModel().getValueAt(row, 2).toString()+"' AND mac='"+jTable1.getModel().getValueAt(row, 3).toString()+"' AND id<";

                jLabel1.setText("<html><p align=center>Подождите, идет удаление записи: <p align=center> Имя pc='"+jTable1.getModel().getValueAt(row, 0).toString()+ ", инв. №="+jTable1.getModel().getValueAt(row, 1).toString() +", ip='"+jTable1.getModel().getValueAt(row, 2).toString()+", mac='"+jTable1.getModel().getValueAt(row, 3).toString());
              
                //Поток на удаление
                DelForm all=new DelForm(max_id, del_str, current);
                all.start();}
                }
        }
      
        @Override
            public void keyTyped(KeyEvent e) {
                 }

            @Override
            public void keyReleased(KeyEvent e) {
                }
        });
    addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
        //
         System.out.println("Закрываемся");
         try {
            conn.close();
            System.exit(0);
         } catch (SQLException ex) {
            
            JOptionPane.showMessageDialog(null,"Ошибка закрытия соединения с базой данных: " + ex);
            }
        }
    });
        
   }
  // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jProgressBar1 = new javax.swing.JProgressBar();
        jLabel1 = new javax.swing.JLabel();
        pan = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
 

        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null}
            },
            new String [] {
                "Имя ПК", "Инв. №", "ip", "MAC", "Кол-во дубликатов"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_NEXT_COLUMN);
        jTable1.setAutoscrolls(false);
        jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jScrollPane1.setViewportView(jTable1);

        getContentPane().add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 70, 630, 540));
        getContentPane().add(jProgressBar1, new org.netbeans.lib.awtextra.AbsoluteConstraints(250, 10, -1, -1));

        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 20, 610, 40));
        getContentPane().add(pan, new org.netbeans.lib.awtextra.AbsoluteConstraints(220, 0, 210, 30));
        getContentPane().add(jPanel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 590, -1, 10));

        jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2, javax.swing.BoxLayout.LINE_AXIS));

         }// </editor-fold>                        

                                    

    public void UpdateJTable() {
      
    jTable1.setEnabled(false);

    try(PreparedStatement pst=conn.prepareStatement("SELECT pcname, inv, ip, mac,  COUNT(*)  FROM changes GROUP BY ip, mac, pcname, inv HAVING COUNT(*)>1;"); ResultSet rs = pst.executeQuery();){
                 
            th = jTable1.getTableHeader();
            tcm = th.getColumnModel();
           
            jTable1.setModel(DbUtils.resultSetToTableModel(rs)); 
                    
            TableColumn tc0 = tcm.getColumn(0);
            tc0.setHeaderValue( "Имя ПК" );
            
            TableColumn tc1 = tcm.getColumn(1);
            tc1.setHeaderValue( "Инвент." );
            
            TableColumn tc2 = tcm.getColumn(2);
            tc2.setHeaderValue( "IP" );
            
            TableColumn tc3 = tcm.getColumn(3);
            tc3.setHeaderValue( "MAC" );
            
            TableColumn tc4 = tcm.getColumn(4);
            tc4.setHeaderValue( "Кол-во дубликатов" );

        }
    catch(SQLException | HeadlessException e) {
        JOptionPane.showMessageDialog(null,"Line=217, Error = " + e);    
        }
    

    jTable1.setEnabled(true);
    } 
   
  public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            //java.util.logging.Logger.getLogger(DupJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DublicateJFrame().setVisible(true);
            }
        });
    }
                  
}



Класс потока:

Код: java
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.
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.swing.JOptionPane;

public class DelForm extends Thread  {
String max;
String del;
int id;
DublicateJFrame current;

 public DelForm(String max, String del, DublicateJFrame cur) {
       this.del=del;
       this.max=max;
       current=cur;
    }

    @Override
    public void run() {
        try(PreparedStatement pst_max=DublicateJFrame.conn.prepareStatement(max); ResultSet rs_max= pst_max.executeQuery();){    
                         
            while(rs_max.next()) {    
                   id = rs_max.getInt(1);
                }
            }
            catch(Exception ex) {
            JOptionPane.showMessageDialog(null, "Line 39, Error = "+ ex);
            }
        del=del+id+";";
        try(PreparedStatement pst_del=DublicateJFrame.conn.prepareStatement(del);){  
             
             int count_del= pst_del.executeUpdate();
             JOptionPane.showMessageDialog(null,"delete: "+count_del+" row");
             }
        catch(Exception ex) {
            JOptionPane.showMessageDialog(null, "Line 61, Error = "+ ex);
            }
        
               current.jProgressBar1.setIndeterminate(false);
               current.UpdateJTable();
            
    }
}



Ошибка может возникать при удалении 3-й записи, а может и 21. Причем вот эта часть: "1 >= 1" почти всегда разная.
Понятно, что я где-то выхожу за границы массива, но где - не могу понять
Текст ошибки:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
at java.util.Vector.elementAt(Vector.java:474)
at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294)
at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.java:648)
at javax.swing.plaf.synth.SynthTableHeaderUI.paint(SynthTableHeaderUI.java:173)
at javax.swing.plaf.synth.SynthTableHeaderUI.update(SynthTableHeaderUI.java:144)
at javax.swing.JComponent.paintComponent(JComponent.java:780)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5219)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1572)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1495)
at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
at javax.swing.JComponent._paintImmediately(JComponent.java:5167)
at javax.swing.JComponent.paintImmediately(JComponent.java:4978)
at javax.swing.RepaintManager$4.run(RepaintManager.java:824)
at javax.swing.RepaintManager$4.run(RepaintManager.java:807)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
at javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
...
Рейтинг: 0 / 0
Ошибка при удалении записи из таблицы
    #39033905
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обновления UI нельзя вызывать из других потоков.
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/
Нужно синхронизировать с EDT.

Ну и вот с этим тоже большая проблема:
http://www.oracle.com/technetwork/java/codeconvtoc-136057.html
...
Рейтинг: 0 / 0
Ошибка при удалении записи из таблицы
    #39033948
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczОбновления UI нельзя вызывать из других потоков.
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/
Нужно синхронизировать с EDT.

Ну и вот с этим тоже большая проблема:
http://www.oracle.com/technetwork/java/codeconvtoc-136057.html

Просто тогда непонятно, почему ошибка не сразу вылетает. Да и таблица обновляется.

То есть если я уберу отдельный поток и вставлю код с него в основной поток, то ошибок я больше получать не буду?
...
Рейтинг: 0 / 0
Ошибка при удалении записи из таблицы
    #39033961
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeinПросто тогда непонятно, почему ошибка не сразу вылетает. Да и таблица обновляется.
Потому что так себя проявляют ошибки многопоточности. Порядок операций не детерминирован. Один раз первый поток выполняется раньше, другой раз - позже, чем обновление экрана. Вот в одном случае есть ошибка, в другом нет. Исключения, кстати, могут быть и другие.

TimeinТо есть если я уберу отдельный поток и вставлю код с него в основной поток, то ошибок я больше получать не буду?
Да, но тогда будут фризы UI в моменты обращения к БД, что тоже плохо. Лучше изучить SwingWorker
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка при удалении записи из таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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