2012-08-02 110 views
0

我有一個Java應用程序連接到MySQL數據庫,並使用select語句通過JTable顯示狀態爲「O」的行。我添加了一個鼠標事件,以便一旦選定的行被點擊,行的細節就會以另一種GUI形式顯示。在新窗體上發生鼠標事件後,數據庫表更新爲狀態「R」。當我回到JTable上的原始顯示時,我預計該行不再顯示。但是,我發現之前選擇的行仍然顯示在JTable上,我必須退出整個程序才能使JTable刷新並更新狀態。刷新數據庫連接

表狀態得到更新,以「R」和正在使用

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

從每個窗體進行導航。有沒有辦法刷新數據庫連接,以便一旦我回到顯示器GUI,表更新使用更改的狀態?

我顯示使用此代碼:

public class ReceiveOrderedParts extends JFrame{ 
static Vector<Vector<String>> data = new Vector<Vector<String>>(); 
static JTable table; 
ReceiveOrderedParts(final String st) throws InterruptedException, SQLException{    
    super("Order Details Inquiry"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JPanel topPanel = new JPanel(); 

    getContentPane().add(topPanel, BorderLayout.PAGE_START); 

    Vector<String> headers = new Vector<String>(); 
    headers.add("Order Number"); 
    headers.add("Date");  
    headers.add("Part Number"); 
    headers.add("Part Name"); 
    headers.add("Application"); 
    headers.add("Quantity"); 
    headers.add("Total Cost"); 
    headers.add("Supplier");      
    headers.add("Country"); 

    getData(); 

    //this is the model which contain actual body of JTable 
    DefaultTableModel model = new DefaultTableModel(data, headers); 
    table = new JTable(model); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);  
    //table.enable(false); 
    table.addMouseListener(new ReceiveOrderedParts.MyMouseAdapter()); 
    boolean b = table.isCellEditable(WIDTH, WIDTH); 
    b = false; 

    header_size(); 

    JScrollPane scroll = new JScrollPane(table); 

    scroll.setHorizontalScrollBarPolicy(
      JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    scroll.setVerticalScrollBarPolicy(
      JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 

    getContentPane().add(scroll, BorderLayout.PAGE_START); 

    pack(); 
    setResizable(false); 
    setVisible(true); 
    setSize(1000, 700); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
public class MyMouseAdapter extends MouseAdapter { 

    public void mousePressed(MouseEvent e) {   
      int colIdx = table.columnAtPoint(e.getPoint());     
      int rowIdx = table.rowAtPoint(e.getPoint()); 
      Object obj = table.getModel().getValueAt(rowIdx, colIdx) ; 
       String order = obj.toString();     
      JOptionPane.showMessageDialog(null,"Receive Order "+ order + "?", "Success", 
         JOptionPane.INFORMATION_MESSAGE); 
        // return; 
     try { 
      SelectOrder seo = new SelectOrder(order); 
      seo.setVisible(true); 
      setVisible(false); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(ReceiveOrderedParts.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

} 

/** 
* Setting the particular Column Size in JTable 
*/ 
public static void header_size() { 
    TableColumn column = table.getColumnModel().getColumn(0); 
    column.setPreferredWidth(100); 

    column = table.getColumnModel().getColumn(1); 
    column.setPreferredWidth(100); 
} 

/** 
* Fetching Data From MySql Database and storing in a Vector of a Vector to 
* Display in JTable 
*/ 
private static void getData() throws SQLException { 
    // Enter Your MySQL Database Table name in below Select Query. 
    String str = "select order_number, Part_number, spare_desc, vehicle_app, qnty_ordered," 
      + "seller_name, total_purchases, country, order_date from order_details_table where status = 'O'"; 
    Connection cn = null; 
    ResultSet rs; 
    Statement st; 

    try { 
     // Change the database name, hosty name, 
     // port and password as per MySQL installed in your PC. 
     cn = DriverManager.getConnection("jdbc:mysql://" 
       + "localhost:3306/test", "root", "[email protected]"); 
     st = cn.createStatement(); 

     rs = st.executeQuery(str); 

     while (rs.next()) { 
      Vector<String> d = new Vector<String>(); 

      d.add(rs.getString("order_number")); 
      d.add(rs.getString("order_date"));     
      d.add(rs.getString("Part_number")); 
      d.add(rs.getString("spare_desc")); 
      d.add(rs.getString("vehicle_app")); 
      d.add(rs.getString("qnty_ordered")); 
      d.add(rs.getString("total_purchases")); 
      d.add(rs.getString("seller_name"));             
      d.add(rs.getString("country")); 

      d.add("\n\n\n\n\n\n\n"); 
      data.add(d); 

     } 
     cn.close(); 

    } catch (SQLException e) { 

     e.printStackTrace(); 

    } 
} 
} 

我回去與此代碼;

Connection conn = null; 
String url = "jdbc:mysql://localhost:3306/"; 
String db = "test"; 
String driver = "com.mysql.jdbc.Driver"; 
Class.forName(driver); 
conn = DriverManager.getConnection(url + db, "user", "password"); 
Statement st = conn.createStatement(); 
String partno = tpart.getText(); 
String sparedesc = tdesc.getText(); 
String vapp = tapp.getText(); 
String qunty = tqnty.getText(); 
String costper = tcost.getText(); 
String country = tcountry.getText(); 
String retail = tretail.getText(); 
String store = tstore.getText(); 
String location = tlocation.getText(); 
String rdate = trdate.getText(); 
String storeit = "INSERT INTO Store_info_table (Part_number, spare_desc, vehicle_app, qnty_received, cost_per_unit" 
     + ", selling_price, country, store_name, store_location, recvd_date) " 
     + "VALUES ('" + partno + "', '" + sparedesc + "', '" + vapp + "', '" + qunty + "', '" + costper + "','" + retail + "','" + country + "','" + store + "','" + location + "','" + rdate + "')"; 
st.execute(storeit); 

String updateOrder = "UPDATE order_details_table set status = 'R' where order_number = '" + order + "'"; 
st.execute(updateOrder); 

JOptionPane.showMessageDialog(null,"Item Stored Successfully", "Success", 
     JOptionPane.INFORMATION_MESSAGE); 
conn.close(); 

ReceiveOrderedParts rop = new ReceiveOrderedParts(order); 
rop.invalidate(); 
rop.setVisible(true); 
setVisible(false);       

回答

1

您應該考慮實施observer pattern來處理這種情況。因此,當新表單中的數據更新時,會發送通知,並通過從數據庫中提取新值來更新原始表。