如何在按钮事件

时间:2016-06-02 04:41:21

标签: java database swing 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;
}
    }

2 个答案:

答案 0 :(得分:1)

  

我删除了本地变量

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

  

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

我已经建议你创建一个简化逻辑的方法。 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(...)方法。这将导致表自动重绘()。

答案 1 :(得分:0)

这是我解决您问题的方法。我保留了您的变量名称,但并非所有变量名称都遵循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<String> columnData = new ArrayList<String>(columnCount);
                for (int i = 1; i <= columnCount; i++) {
                    columnData.add(rsmd.getColumnName(i));
                }
                // sql result data
                List<List<Object>> rowData = new ArrayList<List<Object>>();
                while (rs.next()) {
                    List<Object> row = new ArrayList<Object>(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<List<Object>> rowData;     
    private List<String> columnData;        
    public ListTableModel(List<List<Object>> rowData, List<String> 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数据库对其进行了测试。但我已经评论过那一部分。您可以在您的系统上尝试此操作而无需任何修改。请告诉我你是否想要实现这个解决方案。