登录时从数据库填充JTable [英] Populate JTable from database on login
问题描述
我正在使用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屋!