Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 登录时从数据库填充JTable_Java_Swing_Jdbc - Fatal编程技术网

Java 登录时从数据库填充JTable

Java 登录时从数据库填充JTable,java,swing,jdbc,Java,Swing,Jdbc,我正在使用JDBC从oracle数据库连接填充JTable。它目前正在工作,但我正试图对破坏它的代码进行修改 当前,它通过在创建JTable时查询数据库来填充JTable 我正在尝试将此功能移动到ActionListener。基本上,我想创建一个空表,然后当用户按下JButton时,它应该运行sql查询并填充和重画该表。我已经尝试了我能想到的一切,我忍不住认为这是一个基本的,但我的逻辑是失败的 目前的执行情况: private void makeTable() { Vector colu

我正在使用JDBC从oracle数据库连接填充JTable。它目前正在工作,但我正试图对破坏它的代码进行修改

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

我正在尝试将此功能移动到ActionListener。基本上,我想创建一个空表,然后当用户按下JButton时,它应该运行sql查询并填充和重画该表。我已经尝试了我能想到的一切,我忍不住认为这是一个基本的,但我的逻辑是失败的

目前的执行情况:

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));
}
private void makeTable(){
向量列名称=新向量();
向量数据=新向量();
字符串userName=“aUsername”;
字符串password=“aPassword”;
试一试{
registerDriver(新的oracle.jdbc.driver.OracleDriver());
Connection Connection=DriverManager.getConnection(“redactedDatabaseConnection”,用户名,密码);
String sql=“选择upper(choreName)作为Chore,dueDate作为到期日期,completedDate作为已完成日期,fname作为已完成日期,从Chore的内部join choreCompletion中选择choreCompletion。choreid=choreCompletion.choreid内部join users on users.userID=choreCompletion.completedby”;
语句=connection.prepareStatement(sql);
ResultSet rset=statement.executeQuery(sql);
ResultSetMetaData元数据=rset.getMetaData();
int columns=metaData.getColumnCount();

对于(inti=1;i我希望您熟悉Task、TableView和ObservableList

您可以在任务类内的控制器中使用FXCollections.observableList(您可以在控制器中创建本地类并扩展任务)和TableView

基本上使用一种方法来提取sql查询结果并将这些结果转换为列表,然后返回要填充到FXCollection.observableList的形式参数中的项目列表


使用要执行的“任务”绑定TableView列,也就是说,在这种情况下,您可能希望使用从列表中获得的不同字段绑定每列,现在使用调用线程(任务)的方法绑定按钮。启动方法和所有操作都应能正常工作。

使用0行作为字段创建表

之后

因此,带有模型的瞬时表格创建代码可以移动到通用创建代码


设置重画就足够了。

基本上,您希望创建并显示一个空的
JTable
ActionListener
应该更新表模型:

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

//based on 
//https://docs.oracle.com/javase/tutorial/uiswing/examples/components/SimpleTableDemoProject/src/components/SimpleTableDemo.java
public class SimpleTableDemo extends JPanel {

    private JTable table;
    private JButton populate;

    public SimpleTableDemo() {

        makeTable();
        populate = new JButton("Populate");
        populate.addActionListener(e -> populateTable());
        add(populate, BorderLayout.SOUTH);
    }

    private void makeTable() {
        String[] columnNames = {"click button to populate table"};
        Object[][] data = new  Object[][] {};
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        table = new JTable(model);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);

        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
    }
    private void populateTable() {

        populate.setEnabled(false);
        DefaultTableModel model =  ((DefaultTableModel) table.getModel());
        String[] columnNames = {"First Name", "Last Name"};
        Object[][] data = {
                {"Kathy", "Smith"},
                {"John", "Doe"},
                {"Sue", "Black"},
                {"Jane", "White"},
                {"Joe", "Brown"}
        };
        model.setDataVector(data, columnNames);
    }

    private static void createAndShowGUI() {

        JFrame frame = new JFrame("SimpleTableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        SimpleTableDemo newContentPane = new SimpleTableDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

经过长时间的研究和多次失败的尝试,我最终解决了这个问题。引入一个helper方法,返回一个表模型,对表进行更新,这是解决问题的关键

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);
}   
}
import javax.swing.*;
导入javax.swing.table.*;
导入java.awt.*;
导入java.awt.event.*;
导入java.sql.*;
导入java.util.Vector;
@抑制警告(“未选中”)
公共类FillTable扩展了JFrame
{
专用向量列名称、数据、行;
专用连接;
私有最终字符串dbUsername=“aUsername”;
私有最终字符串dbPassword=“aPass”;
私人JTable杂货店;
私有表列;
私有JScrollPane;
私人JPanel小组;
公共填充表()
{
createComponents();
设置大小(800800);
setTitle(“填好的表格”);
}
公共静态void main(字符串[]args)
{
JFrame frame=新的FillTable();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置未装饰(假);
frame.setLocationRelativeTo(空);
frame.setresizeable(true);
frame.setVisible(true);
}
类ButtonListener实现ActionListener
{
已执行的公共无效操作(操作事件e)
{
试一试{
registerDriver(新的oracle.jdbc.driver.OracleDriver());
connection=DriverManager.getConnection(“redactedDBINFO”、dbUsername、dbPassword);
String sql=“选择upper(name)作为杂货店,fname作为ordered_by,dateordered作为date_从杂货店内部加入杂货店列表(在杂货店上)。groceryid=grocerylist.groceryid内部加入用户(在杂货店列表上)。orderedby=users.userid”;
语句=connection.prepareStatement(sql);
ResultSet rset=statement.executeQuery(sql);
setModel(updateModel(rset));
}
捕获(例外情况除外){
例如printStackTrace();
}
}
}
public DefaultTableModel updateModel(ResultSet rset)引发SQLException
{
ResultSetMetaData元数据=rset.getMetaData();
向量列名称=新向量();
int columnCount=metaData.getColumnCount();

对于(int column=1;column 1)“但我正在尝试对破坏它的代码进行修改。”破坏?如何?具体一点。作为一个侧面提示,在启动时添加表格,然后在单击按钮时更改模型。2)为了更快地获得更好的帮助,请发布or。使用一些硬编码数据替换DB.BTW-我刚刚注意到,包含标签的滚动窗格是一个局部变量,从未添加到父容器(然后超出范围)。当您重新编写代码以在启动时添加滚动窗格时,不要忘记添加它。
choresTable
需要声明为类的属性,以便在执行操作时,它是可见的/在范围内(以便可以更改其模型)。基本上,您希望创建并显示一个空的
JTable
。ActionListener应该更新表模型和fire
tableModel.fireTableDataChanged()
。有关更多帮助,请发布硬编码数据(矢量)。我在OP中添加了一个更新,我目前试图解决这个问题,但没有成功。对更新代码的任何输入都将非常有用
choresTable.setModel(new DefaultTableModel(data, columnNames));
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

//based on 
//https://docs.oracle.com/javase/tutorial/uiswing/examples/components/SimpleTableDemoProject/src/components/SimpleTableDemo.java
public class SimpleTableDemo extends JPanel {

    private JTable table;
    private JButton populate;

    public SimpleTableDemo() {

        makeTable();
        populate = new JButton("Populate");
        populate.addActionListener(e -> populateTable());
        add(populate, BorderLayout.SOUTH);
    }

    private void makeTable() {
        String[] columnNames = {"click button to populate table"};
        Object[][] data = new  Object[][] {};
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        table = new JTable(model);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);

        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
    }
    private void populateTable() {

        populate.setEnabled(false);
        DefaultTableModel model =  ((DefaultTableModel) table.getModel());
        String[] columnNames = {"First Name", "Last Name"};
        Object[][] data = {
                {"Kathy", "Smith"},
                {"John", "Doe"},
                {"Sue", "Black"},
                {"Jane", "White"},
                {"Joe", "Brown"}
        };
        model.setDataVector(data, columnNames);
    }

    private static void createAndShowGUI() {

        JFrame frame = new JFrame("SimpleTableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        SimpleTableDemo newContentPane = new SimpleTableDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
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);
}   
}