【问题标题】:Is it possible to open a file using a similar name from a database?是否可以使用数据库中的相似名称打开文件?
【发布时间】:2020-03-13 06:23:55
【问题描述】:

因此,当我单击按钮(“打开课程”)时,将出现来自不同类的 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) 在 javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 在 javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 在 javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 在 javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 在 java.awt.Component.processMouseEvent(Component.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.awt.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(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) 在 java.awt.EventQueue$4.run(EventQueue.java:733) 在 java.awt.EventQueue$4.run(EventQueue.java:731) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:730) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java: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                   

}

我开始认为这是不可能的。如果是这样,请告诉我我能做什么。非常感谢

【问题讨论】:

    标签: java sqlite filereader


    【解决方案1】:

    getSelectedColumn()/getSelectedRow() 之前调用 updateDBlessons() 会将选定的行/列重置为 -1。

    不要在 btnOpenLessonPopUpActionPerformed 中调用 updateDBlessons(),而是在显示 JFrame 之前调用它。

    【讨论】:

    • 修复了这个错误,非常感谢。但是,我现在收到一个 FileNotFound 错误“java.io.FileNotFoundException: Lessons\null.txt (系统找不到指定的文件)”,就像 9000 说的那样。我尝试将 .toString() 放在 tblOpenLesson.getModel().getValueAt(selectedRow, selectedColumn) 部分,但我没有工作
    猜你喜欢
    • 2015-12-10
    • 2022-09-30
    • 2015-11-17
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2021-08-11
    相关资源
    最近更新 更多