登录时从数据库填充JTable [英] Populate JTable from database on login

查看:52
本文介绍了登录时从数据库填充JTable的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用JDBC从Oracle数据库连接中填充JTable.它当前正在工作,但是我正在尝试对破坏它的代码进行修改.

I am populating a JTable from an oracle database connection using JDBC. It currently is working, but I'm trying to make a modification to the code that is breaking it.

当前,当创建JTable时,它通过查询数据库来填充JTable.

Currently it populates the JTable by querying the database when the JTable is created.

我正在尝试将此功能移至ActionListener.基本上,我想创建一个空表,然后当用户按下JButton时,它应该运行sql查询并填充并重新绘制该表.我已经尝试了所有我能想到的一切,但我不禁认为这是一个基本的尝试,但是我的逻辑使我失望了.

I am trying to move this functionality to an ActionListener. Basically, I want to create an empty table, then when a user presses a JButton it should run the sql query and populate and redraw the table. I've tried everything I can think of, and I can't help but think this is a basic one but my logic is failing me.

当前实施:

private void makeTable() {
    Vector columnNames = new Vector();
    Vector data = new Vector();
    String userName = "aUsername";
    String password = "aPassword";
    try {
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        Connection connection = DriverManager.getConnection("redactedDatabaseConnection", userName, password);
        String sql = "select upper(choreName) as Chore, dueDate as due, completedDate as completed, fname as completedby from chore inner join choreCompletion on chore.choreid = chorecompletion.choreid inner join users on users.userID = choreCompletion.completedby";  

        Statement statement = connection.prepareStatement(sql);
        ResultSet rset = statement.executeQuery(sql);
        ResultSetMetaData metaData = rset.getMetaData();
        int columns = metaData.getColumnCount();
        for (int i = 1; i <= columns; i++) {
            columnNames.addElement(metaData.getColumnName(i));
        }
        while (rset.next()) {
            Vector row = new Vector(columns);
            for (int i = 1; i <= columns; i++) {
                row.addElement(rset.getObject(i));
            }
            data.addElement(row);
        }
        rset.close();
        statement.close();
        connection.close();
    } catch (SQLException ex) {ex.printStackTrace();}
    JTable choresTable = new JTable(data, columnNames);
    TableColumn column;
    for (int i = 0; i<choresTable.getColumnCount(); i++) {
        column = choresTable.getColumnModel().getColumn(i);
        column.setMaxWidth(250);
    }
    JScrollPane scrollPane = new JScrollPane(choresTable);
    scrollPane.getViewport().setBackground(new Color(144, 167, 204));
}

当前尝试实施

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.Vector;

@SuppressWarnings("unchecked")
public class FillTable extends JFrame
{
private Vector columnNames, data, row;
private Connection connection;
private final String dbUsername = "aUsername";
private final String dbPassword = "aPassword";

private JTable groceryTable;
private TableColumn column;
private JScrollPane pane;
private JPanel panel;

public FillTable()
{
    try {
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    } catch(Exception e){
        e.printStackTrace();
    }
    createComponents();
    setSize(800,800);
    setTitle("A filled Table");
}

public static void main(String[] args)
{
    JFrame frame = new FillTable();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setUndecorated(false);
    frame.setLocationRelativeTo(null);
    frame.setResizable(true);
    frame.setVisible(true);
}

class ButtonListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        try {
            connection = DriverManager.getConnection("redactedServerInfo", dbUsername, dbPassword);
            String sql = "select upper(name) as Grocery, fname as ordered_by, dateordered as date_ordered from groceries inner join grocerylist on groceries.groceryid=grocerylist.groceryid inner join users on grocerylist.orderedby= users.userid";  
            Statement statement = connection.prepareStatement(sql);
            ResultSet rset = statement.executeQuery(sql);
            ResultSetMetaData metaData = rset.getMetaData();
            int columns = metaData.getColumnCount();
            for (int i=1; i<= columns; i++) {
                columnNames.addElement(metaData.getColumnName(i));
            }
            while (rset.next()) {
                row = new Vector(columns);
                for(int i=1;i<=columns;i++) {
                    row.addElement(rset.getObject(i));
                }
                data.addElement(row);
            }
            rset.close();
            statement.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        for(int i=0;i<groceryTable.getColumnCount(); i++) {
            column = groceryTable.getColumnModel().getColumn(i);
            column.setMaxWidth(250);
        }
        pane.repaint();
        pane.revalidate();
        groceryTable.repaint();
        groceryTable.revalidate();
        panel.repaint();
        panel.revalidate();
        repaint();
        revalidate();
    }
}

private void createComponents()
{
    JButton button = new JButton("Press me");

    ActionListener buttonListener = new ButtonListener();
    button.addActionListener(buttonListener);

    columnNames = new Vector();
    data = new Vector();
    row = new Vector();

    groceryTable = new JTable(data, columnNames);

    pane = new JScrollPane(groceryTable);

    panel = new JPanel();
    panel.add(button);
    panel.add(pane);
    add(panel);
}   

}

推荐答案

经过数小时的研究和许多失败的尝试,我最终解决了这个问题.解决方案的关键是引入了一个帮助程序方法,该方法返回一个表模型以将更新激发到该表.

I ended up solving the problem after alot of hours of research and many failed attempts. The introduction of a helper method that returns a table model to fire the update to the table was the key to the solution.

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.Vector;

@SuppressWarnings("unchecked")
public class FillTable extends JFrame
{
    private Vector columnNames, data, row;
    private Connection connection;
    private final String dbUsername = "aUsername";
    private final String dbPassword = "aPass";

    private JTable groceryTable;
    private TableColumn column;
    private JScrollPane pane;
    private JPanel panel;

    public FillTable()
    {
        createComponents();
        setSize(800,800);
        setTitle("A filled Table");
    }

    public static void main(String[] args)
    {
        JFrame frame = new FillTable();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(false);
        frame.setLocationRelativeTo(null);
        frame.setResizable(true);
        frame.setVisible(true);
    }

class ButtonListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        try {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            connection = DriverManager.getConnection("redactedDBINFO", dbUsername, dbPassword);
            String sql = "select upper(name) as Grocery, fname as ordered_by, dateordered as date_ordered from groceries inner join grocerylist on groceries.groceryid=grocerylist.groceryid inner join users on grocerylist.orderedby= users.userid";  
            Statement statement = connection.prepareStatement(sql);
            ResultSet rset = statement.executeQuery(sql);            
            groceryTable.setModel(updateModel(rset));
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

public DefaultTableModel updateModel(ResultSet rset) throws SQLException
{

    ResultSetMetaData metaData = rset.getMetaData();

    Vector<String> columnNames = new Vector<String>();

    int columnCount = metaData.getColumnCount();
    for (int column = 1; column <= columnCount; column++) {
        columnNames.add(metaData.getColumnName(column));
    }

    Vector<Vector<Object>> data = new Vector<Vector<Object>>();
    while (rset.next()) {
        Vector<Object> vector = new Vector<Object>();
        for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
            vector.add(rset.getObject(columnIndex));
        }
        data.add(vector);
    }
    return new DefaultTableModel(data, columnNames);
}

private void createComponents()
{
    JButton button = new JButton("Press me");
    ActionListener buttonListener = new ButtonListener();
    button.addActionListener(buttonListener);

    groceryTable = new JTable();

    pane = new JScrollPane(groceryTable);

    panel = new JPanel();
    panel.add(button);
    panel.add(pane);
    add(panel);
}   
}

这篇关于登录时从数据库填充JTable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆