2014-09-28 28 views
0

我有一個JTable和我通過使用矢量對象填充表。我希望數據庫(將數據提供給我的jtable)在對jtable進行更改後進行更新。我認爲更新的特殊模式。我想用其他方法進行更新。該方法收到一個參數。我想給出用戶在JTable中選擇的行的第一列(它是數據庫中的表的代碼,所以它是一個整數)的值。 任何人都可以給我一個示例代碼來做到這一點?我不知道如何把「JTable中用戶選擇的行的第一列的值」。 我讀過,我必須創建一個costum tablemodel並重寫一些方法,但是哪些方法以及如何實現這些方法來實現我的目標?謝謝。當選擇一行時,JTable簡單代碼?

我的代碼是:

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.HeadlessException; 
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.Statement; 
import java.util.Vector; 
import java.util.logging.Level; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingWorker; 
import javax.swing.WindowConstants; 
import javax.swing.table.DefaultTableModel; 

public class provemain2 { 



public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new provemain2(); 
     } 
    }); 
} 

private final JButton button; 
private final JTable table; 
private final DefaultTableModel tableModel = new DefaultTableModel(); 

public provemain2() throws HeadlessException { 

    JFrame one =new JFrame(); 

    one.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    one.setVisible(true); 

    table = new JTable(tableModel); 
    one.add(new JScrollPane(table), BorderLayout.CENTER); 

    button = new JButton("Load Data"); 
    button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      new SwingWorker<Void, Void>() { 
       @Override 
       protected Void doInBackground() throws Exception { 
        loadData(); 
        return null; 
       } 
      }.execute(); 
     } 
    }); 
    one.add(button, BorderLayout.PAGE_START); 

    one.setSize(640, 480); 
} 

private void loadData() { 
    //LOG.info("START loadData method"); 

    button.setEnabled(false); 

    try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root","psw"); 
      Statement stmt = conn.createStatement()) { 

     ResultSet rs = stmt.executeQuery("select * from Acquirenti"); 
     ResultSetMetaData metaData = rs.getMetaData(); 

     // Names of columns 
     Vector<String> columnNames = new Vector<String>(); 
     int columnCount = metaData.getColumnCount(); 
     for (int i = 1; i <= columnCount; i++) { 
      columnNames.add(metaData.getColumnName(i)); 
     } 

     // Data of the table 
     Vector<Vector<Object>> data = new Vector<Vector<Object>>(); 
     while (rs.next()) { 
      Vector<Object> vector = new Vector<Object>(); 
      for (int i = 1; i <= columnCount; i++) { 
       vector.add(rs.getObject(i)); 
      } 
      data.add(vector); 
     } 

     tableModel.setDataVector(data, columnNames); 
    } catch (Exception e) { 
     //LOG.log(Level.SEVERE, "Exception in Load Data", e); 
    } 
    button.setEnabled(true); 

    //LOG.info("END loadData method"); 
} 

} 
+3

請參見[*如何編寫表模型監聽器*](http://docs.oracle.com/javase/tutorial/uiswing/events/tablemodellistener。 HTML),如這可能[重複](http://stackoverflow.com/q/17232118/230513)所示。 – trashgod 2014-09-28 11:26:45

+0

當您調用方法setValueAt(...)時,您可以編寫自己的[table model] [1]並將數據保存到數據庫中 [1]:http://docs.oracle.com/javase/教程/ uiswing /組件/ table.html#數據 – 2014-09-28 11:47:58

回答

0

答案是行加載所有數據到一個新的表(更新形式)或退出形式然後,當形式出現它會加載選擇的行的數據,表格更新按鈕 用戶可以更新任何字段,並且應該使用ID運行更新語句