如何在按钮事件上从数据库填充JTable

我有一个文本框,允许用户输入选择类型查询,并认为当他们单击按钮时,select语句的结果将显示在JTable中。 我没有收到任何错误,但按下我的按钮时textPane中也没有显示任何错误。 我有以下内容:

public class Console { String myquery=""; private JFrame frame; private JTextField textField; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Console window = new Console(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public Console() { initialize(); } private void initialize() { frame = new JFrame(); frame.setBounds(100, 100, 950, 800); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextArea textAreaQuery = new JTextArea(); JTable table_ResQues = new JTable(); JButton btnNewButton = new JButton("Execute"); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String connectDB = "jdbc:ucanaccess:///Users/sebastianzeki/Documents/PhysJava/Physiology.mdb;"; System.out.println("Connection To Database Made"); Connection conn = null; try { conn = DriverManager.getConnection(connectDB); } catch (SQLException e1) { e1.printStackTrace(); } Statement st = null; try { st = conn.createStatement(); } catch (SQLException e1) { e1.printStackTrace(); } myquery=textAreaQuery.getText(); String stg2 = "Select "+myquery; ResultSet rs = null; try { rs = st.executeQuery(stg2); table_ResQues.setModel(getDataFromDatabase); } catch (SQLException e1) { e1.printStackTrace(); } } } 

以及构建模型的代码:

  public TableModel getDataFromDatabase() { DefaultTableModel model = new DefaultTableModel(5, 5); model.setValueAt("Hard", 0, 0); model.setValueAt("Coded", 1, 1); model.setValueAt("Data", 2, 2); return model; } } 

我删除了局部变量

不,您删除了实例变量。 您是否真的尝试使用真实代码或只是编辑问题?

我不知道如何为这个问题提供可测试的数据库

我已经建议你创建一个简化逻辑的方法。 Somethng喜欢:

 public TableModel getDataFromDatabase() { DefaultTableModel model = new DefaultTableModel(5, 5); model.setValueAt("Hard", 0, 0); model.setValueAt("Coded", 1, 1); model.setValueAt("Data", 2, 2); return model; } 

然后在ActionListener中,您可以执行以下操作:

 table_ResQues.setModel( getDataFromDataBase() ); 

一旦获得此基本逻辑,就可以将SQL逻辑移动到getDataFromDatabase()方法中。

因此,现在您创建SSCCE,显示您实际创建框架的方式并将组件添加到框架中。 代码应该是可编译和可执行的。

编辑:

你被告知要显示一个表是一个滚动窗格。 这样做并不需要额外的努力。 而不是使用:

 panel.add(table); 

你用:

 panel.add( new JScrollPane( table ) ); 

我还建议您测试布局,可以使用以下代码显示虚拟表:

 //JTable table_ResQues = new JTable(); JTable table_ResQues = new JTable(5,5); 

然后,当您使用setModel()方法时,只会影响数据,而不会影响表的布局。

我不能帮助,但感觉这是fireTableDataChanged问题。

我对此表示怀疑。 当您更改模型中的数据时,TableModel将调用该方法。 在这种情况下不使用它,因为您使用的是setModel(...)方法。 这将导致表自动重绘()。

这是我解决您问题的方法。 我保留了您的变量名称,但并非所有变量名称都遵循Java约定。 我想你想要的只是用户在JTextArea键入SQL查询并在JTable查看查询结果。

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.table.AbstractTableModel; public class Console { private JFrame frame; private JTextArea textAreaQuery; private JTable table_ResQues; private JButton btnNewButton; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Console window = new Console(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public Console() { initialize(); } private void initialize() { frame = new JFrame("SQL Query"); frame.setBounds(100, 100, 950, 800); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); textAreaQuery = new JTextArea(); btnNewButton = new JButton("Execute"); table_ResQues = new JTable(); JPanel queryPanel=new JPanel(new BorderLayout()); // holds JTextArea and JButton queryPanel.add(new JScrollPane(textAreaQuery), BorderLayout.CENTER); JPanel btnPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); btnPanel.add(btnNewButton); queryPanel.add(btnPanel, BorderLayout.SOUTH); JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, queryPanel, new JScrollPane(table_ResQues)); splitPane.setOneTouchExpandable(true); splitPane.setDividerLocation(150); frame.setContentPane(splitPane); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { /*try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e2) { e2.printStackTrace(); }*/ String connectDB = "jdbc:ucanaccess:///Users/sebastianzeki/Documents/PhysJava/Physiology.mdb;"; Connection conn = null; Statement st = null; try { conn = DriverManager.getConnection(connectDB); //conn = DriverManager.getConnection("jdbc:mysql://localhost/cwcx", "root", "admin");// MySQL connection st = conn.createStatement(); System.out.println("Connection To Database Made"); } catch (SQLException e1) { e1.printStackTrace(); } String myquery = textAreaQuery.getText(); if(myquery.endsWith(";")){ myquery=myquery.substring(0, myquery.length()-1); } ResultSet rs = null; try { rs = st.executeQuery(myquery); // extract column information ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); List columnData = new ArrayList(columnCount); for (int i = 1; i <= columnCount; i++) { columnData.add(rsmd.getColumnName(i)); } // sql result data List> rowData = new ArrayList>(); while (rs.next()) { List row = new ArrayList(columnCount); for (int i = 0; i < columnCount; i++) { row.add(rs.getObject(i + 1)); } rowData.add(row); } table_ResQues.setModel(new ListTableModel(rowData, columnData)); } catch (SQLException e1) { JOptionPane.showMessageDialog(frame, e1.getMessage(), "SQL Exception", JOptionPane.ERROR_MESSAGE); e1.printStackTrace(); }finally{ if(rs!=null){ try { rs.close(); } catch (SQLException e1) { e1.printStackTrace(); } } if(st!=null){ try { st.close(); } catch (SQLException e1) { e1.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e1) { e1.printStackTrace(); } } } } }); } // this table model is created from two dimensional List rowData and single dimensional List columnData private static class ListTableModel extends AbstractTableModel{ private static final long serialVersionUID = 1L; private List> rowData; private List columnData; public ListTableModel(List> rowData, List columnData) { this.rowData = rowData; this.columnData = columnData; } @Override public int getRowCount() { return rowData.size(); } @Override public int getColumnCount() { return columnData.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { return rowData.get(rowIndex).get(columnIndex); } @Override public String getColumnName(int column) { return columnData.get(column); } @Override public Class getColumnClass(int columnIndex) { Object obj=rowData.get(0).get(columnIndex); return obj.getClass(); } } } 

在我的系统上,我用MySQL数据库测试过它。 但我已经评论过那一部分。 您可以在系统上尝试此操作而无需任何修改。 请告诉我您是否想要实现此解决方案。