是否可以使用数据库中的相似名称打开文件?
Is it possible to open a file using a similar name from a database?
因此,当我单击按钮 ("Open Lesson") 时,将出现来自不同 class 的 JFrame(使用 .setVisible(true))。在该 JFrame 中有一个 JTable (tblOpenLesson) 和两个按钮(btnOpenLesson 和 btnCancel)。
现在我想要发生的是,当我单击打开课程按钮时,它将执行以下操作: 1. 更新 table 以将 sqlite 数据库(课程)反映到 JTable 中 2. 打开通过获取文件名(与数据库中的相同)并将其用于 FileReader 函数,从 table 中选择文件。
但是,它给我错误:
Exception in thread "AWT-EventQueue-0"
java.lang.ArrayIndexOutOfBoundsException: -1 at
java.util.Vector.elementData(Vector.java:737) at
java.util.Vector.elementAt(Vector.java:480) at
javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:648)
at
mainWindow.openLesson.btnOpenLessonPopUpActionPerformed(openLesson.java:135)
at mainWindow.openLesson.access[=11=]0(openLesson.java:19) at
mainWindow.openLesson.actionPerformed(openLesson.java:60) at
javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at
javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at
javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at
javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at
javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6539) at
javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at
java.awt.Component.processEvent(Component.java:6304) at
java.awt.Container.processEvent(Container.java:2239) at
java.awt.Component.dispatchEventImpl(Component.java:4889) at
java.awt.Container.dispatchEventImpl(Container.java:2297) at
java.awt.Component.dispatchEvent(Component.java:4711) at
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
at
java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
at java.awt.Container.dispatchEventImpl(Container.java:2283) at
java.awt.Window.dispatchEventImpl(Window.java:2746) at
java.awt.Component.dispatchEvent(Component.java:4711) at
java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) at
java.awt.EventQueue.access0(EventQueue.java:97) at
java.awt.EventQueue.run(EventQueue.java:709) at
java.awt.EventQueue.run(EventQueue.java:703) at
java.security.AccessController.doPrivileged(Native Method) at
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
at java.awt.EventQueue.run(EventQueue.java:733) at
java.awt.EventQueue.run(EventQueue.java:731) at
java.security.AccessController.doPrivileged(Native Method) at
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:730) at
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
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)
我尝试搜索应该如何修复它,但我被困在这里 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
}
我开始认为这是不可能的。如果是这样,请告诉我我能做什么。非常感谢
在 getSelectedColumn()/getSelectedRow() 之前调用 updateDBlessons() 会将选定的 row/column 重置为 -1。
不要在 btnOpenLessonPopUpActionPerformed 中调用 updateDBlessons(),而是在显示 JFrame 之前调用它。
因此,当我单击按钮 ("Open Lesson") 时,将出现来自不同 class 的 JFrame(使用 .setVisible(true))。在该 JFrame 中有一个 JTable (tblOpenLesson) 和两个按钮(btnOpenLesson 和 btnCancel)。
现在我想要发生的是,当我单击打开课程按钮时,它将执行以下操作: 1. 更新 table 以将 sqlite 数据库(课程)反映到 JTable 中 2. 打开通过获取文件名(与数据库中的相同)并将其用于 FileReader 函数,从 table 中选择文件。
但是,它给我错误:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 at java.util.Vector.elementData(Vector.java:737) at java.util.Vector.elementAt(Vector.java:480) at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:648) at mainWindow.openLesson.btnOpenLessonPopUpActionPerformed(openLesson.java:135) at mainWindow.openLesson.access[=11=]0(openLesson.java:19) at mainWindow.openLesson.actionPerformed(openLesson.java:60) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6539) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6304) at java.awt.Container.processEvent(Container.java:2239) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2297) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476) at java.awt.Container.dispatchEventImpl(Container.java:2283) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) at java.awt.EventQueue.access0(EventQueue.java:97) at java.awt.EventQueue.run(EventQueue.java:709) at java.awt.EventQueue.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) at java.awt.EventQueue.run(EventQueue.java:733) at java.awt.EventQueue.run(EventQueue.java:731) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.awt.EventQueue.dispatchEvent(EventQueue.java:730) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) 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)
我尝试搜索应该如何修复它,但我被困在这里 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
}
我开始认为这是不可能的。如果是这样,请告诉我我能做什么。非常感谢
在 getSelectedColumn()/getSelectedRow() 之前调用 updateDBlessons() 会将选定的 row/column 重置为 -1。
不要在 btnOpenLessonPopUpActionPerformed 中调用 updateDBlessons(),而是在显示 JFrame 之前调用它。