方法不生成JTable

时间:2015-01-13 21:07:01

标签: java sqlite

我在当地的遗嘱认证法庭工作,我们提供的一项服务是电子邮件提醒。他们填写一份表格,将其输入系统,他们会在到期时收到通知。我被允许创建一个程序,允许我从表单中输入信息以跟踪已经注册的律师。

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上产生结果的方式来表达它。

0 个答案:

没有答案