2012-02-10 7 views
0

ここで私は自分のデータベースに接続しますデータベースからGUIのJTableを更新するには?

package org.connect; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.Statement; 

public class dbconnect { 

    public static Connection getConnectionvalue() { 
     Statement stmt = null; 
     Connection con = null; 
     try { 
      Class.forName("oracle.jdbc.OracleDriver"); 
      String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
      con = DriverManager.getConnection(url, "system", "kingdom"); 
      con.setAutoCommit(true); 
     } catch (Exception e) { 
      System.out.println("Connection Error" + e); 
     } 
     return con; 
    } 

    public static Statement 
    getStatementvalue() { 
     Statement stmt = null; 
     Connection con = null; 
     try { 
      Class.forName("oracle.jdbc.OracleDriver"); 
      String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
      con = DriverManager.getConnection(url, "system", "kingdom"); 
      con.setAutoCommit(true); 
      stmt = con.createStatement(); 
     } catch (Exception e) { 
      System.out.println("Connection Error" + e); 
     } 
     return stmt; 
    } 
} 
ここ

私はフレームを作成し、データベーステーブルの値を取得します。そして私は

package org.frames.src; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

import javax.sql.RowSetEvent; 
import javax.sql.RowSetListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 

import org.connect.dbconnect; 
import org.reports.master.TESTJASPER; 
import org.table.model.DeptTableModel; 

import java.awt.event.ActionListener; 
import java.io.IOException; 

public class DeptFrame extends JFrame implements RowSetListener, ActionListener { 

    Statement stmt = dbconnect.getStatementvalue(); 
    Connection con = dbconnect.getConnectionvalue(); 
    public static JTable table; // The table for displaying data 
    public static JScrollPane scrollPane; 
    public static JPanel mainpanel, panel, panel1; 
    public static JButton button; 
    DeptTableModel depttm; 

    public DeptFrame() throws SQLException { 
     super("The Masters: Department"); 
     addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       try { 
        con.close(); 
       } catch (SQLException sqle) { 
        System.out.println("windowClosing" + sqle); 
       } 
       System.exit(0); 
      } 
     } 
     ); 

     ResultSet rstable = getContentsOfTable(); 
     depttm = new DeptTableModel(rstable); 

     table = new JTable(); // Displays the table 
     table.setModel(depttm); 
     table.setForeground(Color.gray); 
     table.setBackground(Color.ORANGE); 
     table.setRowSelectionAllowed(true); 
     table.setColumnSelectionAllowed(false); 
     table.setSize(300, 300); 
     scrollPane = new JScrollPane(table); 

     button = new JButton("ViewReport"); 

     button.addActionListener(this); 
     mainpanel = new JPanel(); 

     panel1 = new JPanel(); 

     panel1.add(button); 
     mainpanel.setLayout(new BorderLayout()); 
     mainpanel.add(scrollPane); 
     mainpanel.add("South", panel1); 
    } 

    /** 
    * @param args * @throws SQLException 
    */ 
    public static void main(String[] args) 
      throws SQLException { 
     DeptFrame df = new DeptFrame(); 
     df.add(mainpanel); 
     df.setSize(700, 700); 
     df.getContentPane().add(mainpanel); 
     df.setVisible(true); 
    } 

    public ResultSet getContentsOfTable() throws SQLException { 
     ResultSet rs = null; 
     try { 
      rs = stmt.executeQuery("select * from M_department"); 
     } catch (SQLException e) { 
      System.out.println("Query" + e); 
     } 
     return rs; 
    } 

    @Override 
    public void cursorMoved(RowSetEvent arg0) { 
    } 

    @Override 
    public void rowChanged(RowSetEvent arg0) { 
    } 

    @Override 
    public void rowSetChanged(RowSetEvent event) { 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) {   // TODO Auto-generated method stub   String action = 
     e.getActionCommand(); 
     if (action.equals("ViewReport")) { 
      String[] args = null; 
      TESTJASPER.main(args); 
      try { 
       TESTJASPER.openPdf(); 
      } catch (IOException e1) {    // TODO 
       Auto - generated catch block e1.printStackTrace(); 
      } catch 
        (InterruptedException e1) {    // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    } 
} 

Deptmodeltableにテーブル値の結果セットを通過し、ここで私はテーブルモデルのリスナーを実装し、JTableのを設定すること

package org.table.model; 

import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.sql.Statement; 

import javax.sql.RowSet; 
import javax.sql.RowSetListener; 
import javax.sql.rowset.CachedRowSet; 
import javax.swing.JTable; 
import javax.swing.event.TableModelListener; 
import javax.swing.table.TableModel; 

import oracle.jdbc.rowset.OracleCachedRowSet; 
import org.connect.dbconnect; 
import org.frames.src.DeptFrame; 

public class DeptTableModel implements TableModel { 
    Statement stmt = dbconnect.getStatementvalue(); 
    Connection con = dbconnect.getConnectionvalue(); 
    static ResultSet rsdept; 
    ResultSetMetaData metadata; // Additional information about the results 
    int numcols, numrows; 
    public OracleCachedRowSet ocrs; 

    public ResultSet getDeptRowSet() { 
     return rsdept; 
    } 

    public DeptTableModel(ResultSet rsarg) throws SQLException { 
     this.rsdept = rsarg; 
     this.metadata = this.rsdept.getMetaData(); 
     this.numcols = metadata.getColumnCount(); 
     ocrs = new OracleCachedRowSet(); 
     ocrs.populate(this.rsdept); 
     ocrs.beforeFirst(); 
     this.numrows = 0; 
     while (ocrs.next()) { 
      this.numrows++; 
     } 
     ocrs.beforeFirst(); 
     //System.out.println(numrows);  //System.out.println(numcols); } 

    public void close() { 
     try { 
      rsdept.getStatement().close(); 
     } catch (SQLException e) { 
      System.out.print(e); 
     } 
    } 

    /** 
    * Automatically close when we're garbage collected 
    */ 
    protected void finalize() { 
     close(); 
    } 

    @Override 
    public void addTableModelListener(TableModelListener arg0) {   // TODO Auto - generated method stub 
    } 

    @Override 
    public Class 
    getColumnClass(int column) { 
     return String.class; 
    } 

    @Override 
    public int getColumnCount() { 
     return numcols; 
    } 

    @Override 
    public String 
    getColumnName(int column) { 
     try { 
      return this.metadata.getColumnLabel(column + 1); 
     } catch (SQLException e) { 
      return e.toString(); 
     } 
    } 

    @Override 
    public int getRowCount() { 
     return numrows; 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     try { 
      ocrs.absolute(rowIndex + 1); 
      Object o = ocrs.getObject(columnIndex + 1); 
      if (o == null) 
       return null; 
      else 
       return o.toString(); 
     } catch (SQLException e) { 
      System.out.print(e); 
      return e.toString(); 
     } 
    } 

    @Override 
    public boolean isCellEditable(int rowIndex, int columnIndex) { 
     if (columnIndex != 0) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    @Override 
    public void 
    removeTableModelListener(TableModelListener arg0) {   // TODO Auto - generated method stub 
    } 

    @Override 
    public void setValueAt(Object value, int row, int column) { 
     System.out.println("Calling setValueAt row " + row + ", column " + column + " value is" + value.toString()); 

     System.out.println(getColumnName(column)); 
     System.out.println(getValueAt(row, 0)); 
     String updateq = "update M_department set " + getColumnName(column) + "='" + value.toString() 
       + "' where code = '" + getValueAt(row, 0) + "' "; 
     System.out.println(updateq); 
     try { 
      stmt.executeUpdate(updateq); 
      DeptFrame x = new DeptFrame(); 
      new DeptTableModel(x.getContentsOfTable()); 
     } catch (SQLException e) {    // TODO Auto-generated catch block 
      e.printStackTrace(); 
      System.out.println("Error" + e); 
     } 
    } 
} 

すべてが正常に動作しますが、私のJTableは更新後にリフレッシュし得ていない値行

+0

コードの書式を修正すると、実際には助けになるでしょう... –

+0

また、巨大なSQLインジェクションケースがあります:\t 'String updateq =" M_department set + getColumnName(column)+ "= '" + value。 toString()+ "' code ='" + getValueAt(row、0)+ "'"; '。 SQLを構築するのではなく、準備済みの文を実際に使用する必要があります。 –

+2

あなたの投稿されたコードは、読んで理解しようとするのが面倒です。私が持っている唯一の提案は、 ""コンポーネントを一度作成することです。モデルのデータを変更する場合は、 'TableModel'を再作成してから' table.setModel(...) 'を実行します。次回は、ちょうどあなたが掲示したような書式なしのコードを読むことを試みません。 – camickr

答えて

0
あなたは下の底部付近に持って

stmt.executeUpdate(updateq); 
    DeptFrame x=new DeptFrame(); 
    new DeptTableModel(x.getContentsOfTable()); 

1)stmt.executeUpdateコールが表示されていますが、commitコールが表示されません。あなたは自動コミットを有効にしていますか?私はオラクルがデフォルトでそれを持っていると思ったので、実行は発生していますが、新しいコンテンツ+がコミットされていないため、新しいフレーム+モデルは古いコンテンツを持っていますか?

2)なぜあなたはまだそこに参照のない別のDeptTableModelを作成していますか? DeptFrameは既に内部で作成しているようですので、この2番目のものは何ですか?

+0

はいdbconnect.javaファイルの自動コミットを有効にしました –

+0

'stmt.executeUpdate'はどのような値を返しますか?それは更新された行の#を返します、多分あなたのSQLはどの行も更新しませんでしたか? –

+0

いいえ、データベースへの値は完全に更新されますが、JFrameまたはJtableには反映されません –

関連する問題