【问题标题】:Editable JTable可编辑的 JTable
【发布时间】:2015-08-12 08:34:13
【问题描述】:

我有一个使用 SQL Query 填充的 JTable。我还使单元格可编辑,我编辑的任何单元格都没有保存,它只是恢复到我完成编辑后的状态。

我不完全确定使 JTable 完全可编辑的正确方法是什么,并且任何正在更新的单元格都将保存在 JTable 本身上,并将在 SQL 数据库上得到更新。

我想我应该将 TableModelListener 与 fireTableCellUpdated 一起使用,但我无法让它工作。

这是我用来显示 JTable 的代码

import java.sql.*;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;
import java.awt.Dimension;
import java.awt.event.*;
import java.util.*;

@SuppressWarnings("serial")
public class Test_Table extends JPanel {
    //Load Componenets
    JTable table;
    static TableModel dataModel;
    static Connection conn;
    static Statement stmt;  
    static Vector<Vector<String>> resultVector=new Vector<Vector<String>>();
    static Vector<String> fieldVector=new Vector<String>();
    String[] col_name = {"A","B","C","D","E","F","G"};


    //Get Data from SQL Database
    public static void getTableData(Vector<Vector<String>>resultVector, Vector<String>fieldVector) throws SQLException {
        fieldVector.clear();
        resultVector.clear();
        int colCount;
        String query="SELECT *FROM test_table WHERE DATE(time_stamp)=CURDATE() ORDER BY time_stamp DESC";
        ResultSet result;
        result=stmt.executeQuery(query);
        ResultSetMetaData metaData=result.getMetaData();
        colCount=metaData.getColumnCount();
        for (int i=0; i<colCount; i++)
            fieldVector.add(metaData.getCatalogName(i+1));
        for (int i=0; result.next(); i++) {
            resultVector.add(new Vector<String>());
        for (int j=0; j<colCount; j++)
            resultVector.get(i).add(result.getString(j+1));
        }
    }

    public Test_Table() throws SQLException, ClassNotFoundException {

        //Connection to the SQL Database
        Class.forName("com.mysql.jdbc.Driver");
          final String url = "jdbc:mysql://localhost:3306/test_table";
          final String username = "";
          final String password = "";
        conn=DriverManager.getConnection(url, username, password);
        stmt=conn.createStatement();

        //Model to Create JTable filled with SQL Database
        getTableData(resultVector,fieldVector);
            dataModel=new AbstractTableModel(){
            public int getColumnCount() {return fieldVector.size();}
            public int getRowCount() {return resultVector.size();}
            public Object getValueAt(int row, int col) {
                return resultVector.get(row).get(col);
            }
               public boolean isCellEditable(int row, int col) {
                   return true;
                }


               public String getColumnName(int index) {
                return col_name[index];
            }

        };

        //Adds TableMode Listener
        dataModel.addTableModelListener(new TableModelListener() {
            public void tableChanged(TableModelEvent e) {
                try {
                    tableModelTableChanged(e);
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }

        });

        //Create JTable with Database and add to JPanel
        table=new JTable(dataModel);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        table.setPreferredScrollableViewportSize(new Dimension(1500,400));
        DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
        centerRenderer.setHorizontalAlignment( SwingConstants.CENTER );
        table.setDefaultRenderer(Object.class, centerRenderer);
        final JScrollPane scrollpane=new JScrollPane(table);
        add(scrollpane);
    }

    public void tableModelTableChanged(TableModelEvent evt) throws SQLException{
          ?????????
        }

    //Update JTable when new row Inserted
    public static void update_table() throws SQLException {
    getTableData(resultVector, fieldVector);
    ((AbstractTableModel) dataModel).fireTableDataChanged();
    }

    //Close SQL Connection
    static void close() throws SQLException {
        if (stmt!=null)stmt.close();
        if(conn!=null) conn.close();
    }



    public void processWindowEvenet(WindowEvent e) {
        if (e.getID()==WindowEvent.WINDOW_CLOSING) {
            try {
                Testing_Table.close();
            }
            catch (SQLException e1) {
                e1.printStackTrace();
            }
            System.exit(0);
        }
    }

    public static void main (String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException, SQLException {
        UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        JFrame frame=new JFrame();
        frame.add(new Testing_Table());
        frame.pack();
        frame.setVisible(true);
    }
}

【问题讨论】:

  • 1.您必须使用 SwingWorker、Runnable#Thread 进行 JDBC#UPDATE...、2. 覆盖 JTable.setValueAt、3. JDBC#Connection.OPEN / CLOSE 在运行时是硬而长的事件,4。如果出现故障(单独的类。void,必须包含 JTable / XxxTableModel 中的原始坐标),则从 JDBC 创建一些通知程序(即向屏幕返回异常)

标签: java sql swing jtable


【解决方案1】:

TableModelEvent 告诉您哪些数据已更改。由您来编写逻辑并制作适当的 JDBC 调用来更新数据库中的数据。

由于 JTable 中的数据已被用户更改。从数据库再次更新它没有意义。

是的,@mKorbel 是正确的,您应该在 SwingWorker 中执行此操作。但是首先,首先在 tableModelTableChanged() 方法中实现所有内容,然后再对其进行重构可能会更容易。

【讨论】:

  • 我对 JAVA 很陌生。我从未体验过 SwingWorker。也许你可以给我一个例子或某种参考点?
猜你喜欢
  • 1970-01-01
  • 2015-11-14
  • 2013-08-10
  • 2015-03-17
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
相关资源
最近更新 更多