java - 使用 JTextFields 中的字符串填充 JTable

标签 java mysql swing jdbc jtable

我正在与 jdbc 合作使用 JFrames 为 MySQL 构建 GUI。 我对 Java 不太擅长,我无法弄清楚以下内容。

我想用我的查询中的数据填充 JTable,但我希望该查询内部包含用户参数。所以..

这是查询:

 String sql = "SELECT `field1`, `field2`, `field3`"
            + "FROM `Table1` INNER JOIN `Table2` on `table1PK` = `table2PK`"
            + "WHERE `column1Value` = '"+JTextfield1.getText()+'" AND"
            + " `column2Value` = '"+JTextfield2.getText()+"'";

然后,通过该字符串的输出,在按下 JButton 后,我想填充 JTable。

换句话说,我希望 JTable 的“输出”为“UserParameterDefined”(通过 JTextFields)

这是一个工作自动填充 JTable 的漏洞代码,但没有用户定义的参数,我拥有并且工作完美:

package pkginterface;

import java.awt.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.time.*;
import java.sql.Date;
import java.text.*;

public class Movies_Info extends JFrame
{
    public Movies_Info()
{
    ArrayList columnNames = new ArrayList();
    ArrayList data = new ArrayList();

    //  Connect to an MySQL Database, run query, get result set
    String url = "jdbc:mysql://localhost:3306/cinema";
    String userid = "root";
    String password = "root";
    String sql = "SELECT movie_title, timetable_starttime, timetable_movietype "
            + "FROM Movies INNER JOIN TimeTable on timetable_movie_ID = movie_ID";

    try (Connection connection = DriverManager.getConnection( url, userid, password );
        Statement stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery( sql ))
    {
        ResultSetMetaData md = rs.getMetaData();
        int columns = md.getColumnCount();

        //  Get column names
        for (int i = 1; i <= columns; i++)
        {
            columnNames.add( md.getColumnName(i) );
        }

        //  Get row data
        while (rs.next())
        {
            ArrayList row = new ArrayList(columns);

            for (int i = 1; i <= columns; i++)
            {
                row.add( rs.getObject(i) );
            }

            data.add( row );
        }
    }
    catch (SQLException e)
    {
        System.out.println( e.getMessage() );
    }

    Vector columnNamesVector = new Vector();
    Vector dataVector = new Vector();

    for (int i = 0; i < data.size(); i++)
    {
        ArrayList subArray = (ArrayList)data.get(i);
        Vector subVector = new Vector();
        for (int j = 0; j < subArray.size(); j++)
        {
            subVector.add(subArray.get(j));
        }
        dataVector.add(subVector);
    }

    for (int i = 0; i < columnNames.size(); i++ )
        columnNamesVector.add(columnNames.get(i));

    //  Create table with database data    
    JTable table = new JTable(dataVector, columnNamesVector)
    {
        public Class getColumnClass(int column)
        {
            setTitle("Staff Interface - Movies Info");
            for (int row = 0; row < getRowCount(); row++)
            {
                Object o = getValueAt(row, column);

                if (o != null)
                {
                    return o.getClass();
                }
            }

            return Object.class;
        }
    };

    JScrollPane scrollPane = new JScrollPane( table );
    getContentPane().add( scrollPane );

    JPanel buttonPanel = new JPanel();
    getContentPane().add( buttonPanel, BorderLayout.SOUTH );

    TableCellRenderer tableCellRenderer = new DefaultTableCellRenderer() {

    // Time shown correction
   SimpleDateFormat f = new SimpleDateFormat("HH:mm:ss");
   public Component getTableCellRendererComponent(JTable table,
           Object value, boolean isSelected, boolean hasFocus,
        int row, int column) {
    if( value instanceof Time) {
        value = f.format(value);
    }
    return super.getTableCellRendererComponent(table, value, isSelected,
            hasFocus, row, column);
    }
  };
  table.setDefaultRenderer(Time.class, tableCellRenderer);
  // Time shown correction finish
    pack();

}

public static void main(String[] args)
{
    Movies_Info frame = new Movies_Info();
    frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
    frame.pack();
    frame.setVisible(true);
}
}

预先感谢您提供任何帮助!

最佳答案

基本概念看起来像......

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextField field;
        private JTable table;

        public TestPane() {
            setLayout(new BorderLayout());
            field = new JTextField(20);
            table = new JTable();

            add(field, BorderLayout.NORTH);
            add(new JScrollPane(table));

            JButton update = new JButton("Update");
            add(update, BorderLayout.SOUTH);

            update.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        TableModel model = executeQueryWith(field.getText());
                        table.setModel(model);
                    } catch (SQLException ex) {
                        JOptionPane.showMessageDialog(TestPane.this, "Failed to execute query", "Error", JOptionPane.ERROR_MESSAGE);
                        ex.printStackTrace();
                    }
                }
            });
        }

        protected TableModel executeQueryWith(String value) throws SQLException {
            String url = "jdbc:mysql://localhost:3306/cinema";
            String userid = "root";
            String password = "root";
            String sql = "SELECT movie_title, timetable_starttime, timetable_movietype "
                    + "FROM Movies INNER JOIN TimeTable on timetable_movie_ID = ?";

            DefaultTableModel model = new DefaultTableModel();
            try (Connection connection = DriverManager.getConnection(url, userid, password)) {
                try (PreparedStatement stmt = connection.prepareStatement(sql)) {
                    stmt.setString(1, value);
                    try (ResultSet rs = stmt.executeQuery()) {
                        ResultSetMetaData md = rs.getMetaData();
                        int columns = md.getColumnCount();

                        //  Get column names
                        for (int i = 1; i <= columns; i++) {
                            model.addColumn(md.getColumnName(i));
                        }

                        //  Get row data
                        while (rs.next()) {
                            Vector<Object> row = new Vector(columns);
                            for (int i = 1; i <= columns; i++) {
                                row.add(rs.getObject(i));
                            }
                            model.addRow(row);
                        }
                    }
                }
            }
            return model;
        }

    }

}

您可能还想看看:

关于java - 使用 JTextFields 中的字符串填充 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35402520/

相关文章:

mysql - mysql 中可能有区分重音和不区分大小写的 utf8 排序规则吗?

php - 用常量定义表和列名

java - 如何将用户数据与我的 Swing 组件分开?

java - 泛型下界 ('super' ) 问题?

java - Thread.yield() 和 Thread.sleep() 之间的区别

html - 在 Laravel Markdown 中嵌入 <canvas> 标签?

java - 是否可以将 ArrayList 的值作为 Java Swing 中的工具提示进行迭代?

java - 表渲染器在 Java 中无法正常工作

java - 如何对java代码进行单元测试

java - 是否可以使用微基准框架只对某些语句计时?