我在当地的遗嘱认证法庭工作,我们提供的一项服务是电子邮件提醒。他们填写一份表格,将其输入系统,他们会在到期时收到通知。我被允许创建一个程序,允许我从表单中输入信息以跟踪已经注册的律师。
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class Attempt1 {
public static void setConnection() throws SQLException {
Connection conn = null;
Statement state = null;
try {
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:dummy3.db");
} catch (Exception e) {
e.printStackTrace();
}
setStatement(conn, state);
setInsert(conn, state);
setQuery(conn, state);
}
// Test method
public static void setStatement(Connection conn, Statement state)
throws SQLException {
state = conn.createStatement();
String sql = "CREATE TABLE IF NOT EXISTS ATTORNEY "
+ "(ID INT PRIMARY KEY NOT NULL,"
+ " NAME TEXT NOT NULL, "
+ " EMAIL CHAR(50), " + " DATE TEXT NOT NULL)";
state.executeUpdate(sql);
}
public static void setInsert(Connection conn, Statement state)
throws SQLException {
int entries;
int i = 0;
String input;
String sql = "";
state = conn.createStatement();
Scanner keyboard = new Scanner(System.in);
System.out.print("How many entries will you insert?");
entries = keyboard.nextInt();
keyboard.nextLine();
while (i < entries) {
System.out
.println("Enter the values for ID, NAME, EMAIL, and DATE");
input = keyboard.nextLine();
sql = "INSERT INTO ATTORNEY (ID, NAME, EMAIL, DATE) " + "VALUES ("
+ input + ");";
state.executeUpdate(sql);
i++;
}
}
// Test method
public static void setQuery(Connection conn, Statement state)
throws SQLException {
state = conn.createStatement();
String sql = "SELECT * FROM ATTORNEY";
ResultSet result = state.executeQuery(sql);
/*
* while (result.next()) {
*
* String name = result.getString("NAME"); long age =
* result.getLong("ID");
*
* System.out.println(name); System.out.println(age); }
*/
JTable table = new JTable(buildTableModel(result));
JOptionPane.showMessageDialog(null, new JScrollPane(table));
result.close();
state.close();
}
public static DefaultTableModel buildTableModel(ResultSet rs)
throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();
// names of columns
Vector<String> columnNames = new Vector<String>();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++) {
columnNames.add(metaData.getColumnName(column));
}
// data of the table
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
return new DefaultTableModel(data, columnNames);
}
public static void main(String[] args) throws SQLException {
setConnection();
}
}
我遇到的问题是方法setQuery。它显示一个包含输入数据的表。它当前位于第21行,它不显示表,也不会终止程序。目标是使用一些条目更新表,然后显示Jtable。当置于setInsert方法之上时,它显示正常,并将反映下次启动时添加的新条目。我仍然在自己的课堂环境之外学习Java,所以我只能想象这里的编码很糟糕,但我似乎无法弄清楚为什么它没有显示出来调用setInsert方法后的表,虽然我认为这是一个非常明显的东西。在它的当前状态下,该程序仅用于测试SQLite与Java的功能。从那里它将使用GUI创建。
小更新: 虽然我仍在计算调试器以解决我的问题,但我注意到我是否这样做:
setStatement(conn, state);
setQuery(conn, state);
setInsert(conn, state);
setQuery(conn, state);
在setInsert方法之前添加setQuery方法并保留第二个setQuery,它将在条目之前和之后显示该表。它没有解决我的问题,看到它确实显示了表并在setInsert方法之后正确终止了程序,这很有趣。
第二次更新:
我注意到昨晚我关闭电脑的事情。当我的节目关闭时,我注意到了背景中的Jtable。在今天鬼混之后,我意识到它实际上是在显示Jtable,但在桌面上。我必须将Eclipse最小化到桌面才能看到这一点。我之前从未见过这个,但我无法用一种在Google上产生结果的方式来表达它。