簡體   English   中英

當查詢更改時,Java刷新JTable

[英]java refresh JTable when query changed

我正在構建一個SQL DB GUI。 我遇到的問題是,當用戶從SHOW TABLES雙擊表時,它不會更新顯示新表結果的表。

這是我的代碼:

JTabbedPane tabbedPane = new JTabbedPane();
Statement stat = Gui.getStat();
private JPanel panel;
private String query;

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


public void showTables() throws SQLException{
        ResultSet showTablesResult = null;
        query = "abc";
        try {
            showTablesResult = stat.executeQuery("SHOW TABLES");
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Error connecting to databse");
        }
        displayResultSet(showTablesResult);
    }


    public void displayResultSet(ResultSet rs) throws SQLException{

        JTable table = new JTable(buildTableModel(rs)){
            private static final long serialVersionUID = 1L;

            @Override
                public boolean isCellEditable(int row, int column) {
                   return false;
                }
        };

        panel.add(new JScrollPane(table));


        table.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
                if(e.getClickCount() == 2){
                    if(query == "abc"){
                        //get value in selected cell
                        String selectedData = null;
                        int[] selectedRow = table.getSelectedRows();
                        int[] selectedColumns = table.getSelectedColumns();

                        for (int i = 0; i < selectedRow.length; i++) {
                          for (int j = 0; j < selectedColumns.length; j++) {
                            selectedData = (String) table.getValueAt(selectedRow[i], selectedColumns[j]);
                          }
                        }

                        try {
                            viewTable(selectedData);
                        } catch (SQLException e1) {
                            e1.printStackTrace();
                        }

                    }
                }
            }
        });

    }



    public void viewTable(String tName) throws SQLException{
        ResultSet showTablesResult = null;
        query = "123";
        try {
            showTablesResult = stat.executeQuery("SELECT * FROM " +tName);
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Error connecting to databse");
        }
        displayResultSet(showTablesResult);
    }



    public static DefaultTableModel buildTableModel(ResultSet rs)
            throws SQLException {

        ResultSetMetaData metaData = rs.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 (rs.next()) {
            Vector<Object> vector = new Vector<Object>();
            for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                vector.add(rs.getObject(columnIndex));
            }
            data.add(vector);
        }


        return new DefaultTableModel(data, columnNames);

    }

我該如何解決這個問題使其起作用? 我認為可能有一個重繪或刷新表之類的函數,但我找不到它。

謝謝 :)

panel.add(new JScrollPane(table));

默認情況下,組件的大小為(0,0),因此無需繪制任何內容。

從可見的GUI添加(或刪除)組件時,您需要調用布局管理器,以便在面板上為組件指定大小/位置。 基本代碼是:

panel.add(...);
panel.revalidate();
panel.repaint();

但是,當使用邏輯“刷新”表時,這樣做容易得多:

table.setModel( your updated TableModel );

無需每次都重新創建JScrollPane和JTable。

正如camickr所說,不需要每次都重新創建JTable和TableModel

我會這樣做:

從viewTable(...)方法中刪除displayResultSet(...),只需將其替換為以下內容:

Vector<Vector<Object>> newDataVector = //fill with new data
defaultTableModel.setDataVector(newDataVector, columnIdentifiers);
defaultTableModel.fireTableDataChanged();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM