Можно ли открыть файл, используя похожее имя из базы данных? - PullRequest
0 голосов
/ 13 марта 2020

Поэтому, когда я нажимаю кнопку («Открыть урок»), появляется JFrame из другого класса (с использованием .setVisible (true)). В этом JFrame есть JTable (tblOpenLesson) и две кнопки (btnOpenLesson и btnCancel).

Теперь я хочу, чтобы при нажатии кнопки «Открыть урок» выполнялись следующие действия: 1. Обновить таблица для отражения базы данных sqlite (урок) в JTable 2. Откройте выбранный файл из таблицы, получив имя файла (такое же, как в базе данных) и используя его для функции FileReader.

Однако, это дает мне ошибку:

Исключение в потоке "AWT-EventQueue-0" java .lang.ArrayIndexOutOfBoundsException: -1 в java .util.Vector.elementData ( Vector. java: 737) в java .util.Vector.elementAt (Vector. java: 480) в javax.swing.table.DefaultTableModel.getValueAt (DefaultTableModel. java: 648) в mainWindow.openLesson. .btnOpenLessonPopUpActionPerformed (openLesson. java: 135) в mainWindow.openLesson.access $ 000 (openLesson. java: 19) в mainWindow.openLesson $ 1.actionPerformed (openLesson. java: 60) в javaxsw.ing. .fireActionPerformed (AbstractButton. java: 2022) в javax.swing.AbstractButton $ Handler.actionPerformed (AbstractButton. java: 2348) в javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel. * 10) в 10:30 на * j30 swing.DefaultButtonModel.setPressed (DefaultButtonModel. java: 259) в javax.swing.plaf.basi c .BasicButtonListener.mouseReleased (BasicButtonListener. java: 252) в java .awt.Componentvent . java: 6539) на javax.swing.JComponent.processMouseEvent (JComponent. java: 3324) на java .awt.Component.processEvent (Component. java: 6304) на java .awt. Container.processEvent (Container. java: 2239) в java .awt.Component.dispatchEventImpl (Component. java: 4889) в java .awt.Container.dispatchEventImpl (Container. java: 2297) в java .awt.Component.dispatchEvent (Component. java: 4711) в java .awt.LightweightDispatcher.retargetMouseEvent (Container. java: 4904) в java .awt.LightweightDispatcher.processMouseEvent (Container java: 4535) на java .aw t.LightweightDispatcher.dispatchEvent (Container. java: 4476) в java .awt.Container.dispatchEventImpl (Container. java: 2283) в java .awt.Window.dispatchEventImpl (Window. java: 2746) в java .awt.Component.dispatchEvent (Component. java: 4711) в java .awt.EventQueue.dispatchEventImpl (EventQueue. java: 760) в java .awt.EventQueue.access $ 500 (EventQueue. java: 97) в java .awt.EventQueue $ 3.run (EventQueue. java: 709) в java .awt.EventQueue $ 3.run (EventQueue. java: 703) в java .security.AccessController.doPrivileged (собственный метод) в java .security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain. java: 74) в java .security.ProtectionDomain $ JavaSecuritydoge () java: 84) в java .awt.EventQueue $ 4.run (EventQueue. java: 733) в java .awt.EventQueue $ 4.run (EventQueue. java: 731) в java .security.AccessController.doPrivileged (собственный метод) в java .security.ProtectionDomain $ JavaSecurityAccessImpl.doInt ersectionPrivilege (ProtectionDomain. java: 74) в java .awt.EventQueue.dispatchEvent (EventQueue. java: 730) в java .awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread. *) 10: 20 at 1083 * .awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread. java: 116) в java .awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread. java: 105) в java .awtEpd. 1088 *: 101) в java .awt.EventDispatchThread.pumpEvents (EventDispatchThread. java: 93) в java .awt.EventDispatchThread.run (EventDispatchThread. java: 82)

Я пытался найти то, что я должен сделать, чтобы исправить это, но я застрял здесь на 3 дня безрезультатно.

это код всплывающего окна JFrame:

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
// </editor-fold>                        

private void btnCancelOpenLessonActionPerformed(java.awt.event.ActionEvent evt) {                                                    
    this.setVisible(false);
}                                                   

private void btnOpenLessonPopUpActionPerformed(java.awt.event.ActionEvent evt) {                                                   

    updateDBlessons(); // update list

    String[] fileName = null;

    int selectedColumn = tblOpenLesson.getSelectedColumn();
    int selectedRow = tblOpenLesson.getSelectedRow();
    try {
        Class.forName("org.sqlite.JDBC");
        Connection con = DriverManager.getConnection("jdbc:sqlite:sql_items.sqlite");
        Statement stmtGetLesson = con.createStatement();
        ResultSet rs = stmtGetLesson.executeQuery("SELECT * FROM lessons WHERE lesson_id  = '" + tblOpenLesson.getModel().getValueAt(selectedRow, selectedColumn) + "';");

        if (rs.next()) {
            fileName[0] = rs.getString("lesson");
        }
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, e);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(openLesson.class.getName()).log(Level.SEVERE, null, ex);
    }

        try {
        FileReader fr = new FileReader("Lessons\\" + fileName[0] + ".txt");
            try (BufferedReader br = new BufferedReader(fr)) {
            mainScreen.lessonPane.read(br, null); //  lessonPane is from another class
            br.close();
            }
        } catch (IOException e) {
        System.out.println(e);
        this.setVisible(false);
        }


}                                                  


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 
     */

    //</editor-fold>

    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(() -> {
        new openLesson().setVisible(false);
    });
}

public void updateDBlessons() {
    try {
        Class.forName("org.sqlite.JDBC");
        Connection  con = DriverManager.getConnection("jdbc:sqlite:sql_items.sqlite");
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM lessons");
        DefaultTableModel dtm = (DefaultTableModel) tblOpenLesson.getModel();
        dtm.setRowCount(0);

        while(rs.next()){
            Object o[] = {rs.getString("lesson")};
            dtm.addRow(o);
        }
    } catch (ClassNotFoundException | SQLException e) {

    }
}


// Variables declaration - do not modify                     
private javax.swing.JButton btnCancelOpenLesson;
private javax.swing.JButton btnOpenLessonPopUp;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JPanel pnlOpenLesson;
private javax.swing.JTable tblOpenLesson;
// End of variables declaration                   

}

Я начинаю думать, что это невозможно. Если так, пожалуйста, скажите мне, что я могу сделать. Большое вам спасибо

1 Ответ

0 голосов
/ 13 марта 2020

Вызов updateDBlessons () до getSelectedColumn () / getSelectedRow () сбрасывает выбранную строку / столбец в -1.

Не вызывайте updateDBlessons () in btnOpenLessonPopUpActionPerformed и вместо этого вызывайте его перед отображением JFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...