2015-09-09 47 views
3

我使用MySQL數據庫創建了一個Java通訊錄程序。我的程序有左側面板和右側面板。左側面板將新條目寫入數據庫,右側面板顯示所有數據庫信息。我在向數據庫提交新條目後更新程序時遇到問題。我必須關閉我的程序,然後重新打開它以顯示新的信息。向數據庫提交信息後刷新java程序

點擊提交按鈕後,我怎樣才能讓自己的地址簿更新?

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Insets; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class Frame1 extends JFrame { 

JLabel label1 = new JLabel("Address Book Input"); 
JLabel label2 = new JLabel("MySQL Address Book"); 

JButton submit = new JButton("Submit"); 

JTextField $first_name = new JTextField(20); 
JTextField $last_name = new JTextField(20); 
JTextField $phone = new JTextField(20); 
JTextField $email = new JTextField(20); 
JTextField $street = new JTextField(20); 
JTextField $city = new JTextField(20); 
JTextField $state = new JTextField(20); 
JTextField $zip = new JTextField(20); 

JLabel first_nameLabel = new JLabel("First Name: "); 
JLabel last_nameLabel = new JLabel("Last Name: "); 
JLabel phoneLabel = new JLabel("Phone: "); 
JLabel emailLabel = new JLabel("Email: "); 
JLabel streetLabel = new JLabel("Street: "); 
JLabel cityLabel = new JLabel("City: "); 
JLabel stateLabel = new JLabel("State: "); 
JLabel zipLabel = new JLabel("Zip: "); 

public Frame1() { 
    super("1 Class Template"); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setSize(800, 480); 
    setLocationRelativeTo(null); 
    setVisible(true); 
    initComponents(); 

} 

public void initComponents() { 
    JPanel panel = new JPanel(new GridLayout(0, 2)); 
    JPanel panelLeft = new JPanel(new GridBagLayout()); 
    JPanel panelRight = new JPanel(new BorderLayout()); 
    JScrollPane scrollPane = new JScrollPane(); 
    JPanel addressBook = new JPanel(new GridBagLayout()); 

    add(panel); 
    panel.add(panelLeft); 
    panel.add(panelRight); 
    panelRight.add(scrollPane); 
    scrollPane.setViewportView(addressBook); 

    panelLeft.setBorder(BorderFactory.createLineBorder(Color.black)); 
    panelRight.setBorder(BorderFactory.createLineBorder(Color.black)); 

    GridBagConstraints gbc = new GridBagConstraints(); 

    label1.setFont(new Font(null, Font.PLAIN, 18)); 
    gbc.insets = new Insets(8, 8, 8, 8); 
    gbc.gridwidth = 2; 
    gbc.anchor = GridBagConstraints.CENTER; 
    gbc.gridx = 0; 
    gbc.gridy = 0; 
    panelLeft.add(label1, gbc); 

    gbc.insets = new Insets(4, 4, 4, 4); 
    gbc.gridwidth = 1; 
    gbc.anchor = GridBagConstraints.LINE_END; 
    gbc.gridx = 0; 
    gbc.gridy++; 
    panelLeft.add(first_nameLabel, gbc); 
    gbc.gridy++; 
    panelLeft.add(last_nameLabel, gbc); 
    gbc.gridy++; 
    panelLeft.add(phoneLabel, gbc); 
    gbc.gridy++; 
    panelLeft.add(emailLabel, gbc); 
    gbc.gridy++; 
    panelLeft.add(streetLabel, gbc); 
    gbc.gridy++; 
    panelLeft.add(cityLabel, gbc); 
    gbc.gridy++; 
    panelLeft.add(stateLabel, gbc); 
    gbc.gridy++; 
    panelLeft.add(zipLabel, gbc); 

    gbc.insets = new Insets(4, 4, 4, 4); 
    gbc.gridwidth = 1; 
    gbc.anchor = GridBagConstraints.LINE_START; 
    gbc.gridx = 1; 
    gbc.gridy = 1; 
    panelLeft.add($first_name, gbc); 
    gbc.gridy++; 
    panelLeft.add($last_name, gbc); 
    gbc.gridy++; 
    panelLeft.add($phone, gbc); 
    gbc.gridy++; 
    panelLeft.add($email, gbc); 
    gbc.gridy++; 
    panelLeft.add($street, gbc); 
    gbc.gridy++; 
    panelLeft.add($city, gbc); 
    gbc.gridy++; 
    panelLeft.add($state, gbc); 
    gbc.gridy++; 
    panelLeft.add($zip, gbc); 

    gbc.insets = new Insets(4, 4, 4, 4); 
    gbc.anchor = GridBagConstraints.LINE_END; 
    gbc.gridwidth = 1; 
    gbc.gridx = 1; 
    gbc.gridy++; 
    submit.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      try { 
       java.sql.Connection myConn = DriverManager.getConnection(
         "jdbc:mysql://localhost:3306/database_name", 
         "user_name", "password"); 

       Statement myStmt = myConn.createStatement(); 
       myStmt 
         .executeUpdate("INSERT INTO address_book (first_name, last_name, phone, email, street, city, state, zip) VALUES ('" 
           + $first_name.getText() 
           + "', '" 
           + $last_name.getText() 
           + "', '" 
           + $phone.getText() 
           + "', '" 
           + $email.getText() 
           + "', '" 
           + $street.getText() 
           + "', '" 
           + $city.getText() 
           + "', '" 
           + $state.getText() 
           + "', '" 
           + $zip.getText() + "') "); 

       $first_name.setText(""); 
       $last_name.setText(""); 
       $phone.setText(""); 
       $email.setText(""); 
       $street.setText(""); 
       $city.setText(""); 
       $state.setText(""); 
       $zip.setText(""); 

       JOptionPane.showConfirmDialog(null, 
         "Your Data Has been Inserted", "Result", 
         JOptionPane.DEFAULT_OPTION, 
         JOptionPane.PLAIN_MESSAGE); 

      } 

      catch (Exception exc) { 
       exc.printStackTrace(); 
      } 
     } 
    }); 
    panelLeft.add(submit, gbc); 

    label2.setFont(new Font(null, Font.PLAIN, 18)); 
    gbc.insets = new Insets(8, 8, 8, 8); 
    gbc.gridwidth = 2; 
    gbc.anchor = GridBagConstraints.CENTER; 
    gbc.gridx = 0; 
    gbc.gridy = 0; 
    addressBook.add(label2, gbc); 

    gbc.anchor = GridBagConstraints.LINE_START; 
    gbc.gridwidth = 1; 
    try { 
     java.sql.Connection myConn = DriverManager.getConnection(
       "jdbc:mysql://localhost:3306/database_name", "user_name", 
       "password"); 

     Statement myStmt = myConn.createStatement(); 

     ResultSet myRs = myStmt 
       .executeQuery("SELECT * FROM address_book ORDER BY last_name, first_name"); 

     while (myRs.next()) { 
      JLabel lab1 = new JLabel(myRs.getString("first_name") + " " 
        + myRs.getString("last_name")); 
      JLabel lab2 = new JLabel(myRs.getString("phone")); 
      JLabel lab3 = new JLabel(myRs.getString("email")); 
      JLabel lab4 = new JLabel(myRs.getString("street")); 
      JLabel lab5 = new JLabel(myRs.getString("city") + ", " 
        + myRs.getString("state") + " " + myRs.getString("zip")); 

      gbc.insets = new Insets(4, 4, 4, 4); 
      gbc.gridy++; 
      addressBook.add(lab1, gbc); 
      gbc.gridy++; 
      addressBook.add(lab2, gbc); 
      gbc.gridy++; 
      addressBook.add(lab3, gbc); 
      gbc.gridy++; 
      addressBook.add(lab4, gbc); 
      gbc.insets = new Insets(4, 4, 20, 4); 
      gbc.gridy++; 
      addressBook.add(lab5, gbc); 

     } 
    } 

    catch (Exception exc) { 
     exc.printStackTrace(); 
    } 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Frame1(); 
     } 
    }); 
} 
} 
+0

相信SQL注入先生。就像您閱讀並填寫面板以顯示數據一樣,在插入數據結束時執行相同的操作。如果後端數據庫可以通過數據插入事件(觸發器)執行任何額外操作,則重新加載整個顯示面板可以讓您更好地瞭解更新的數據。 –

+0

分離您的責任區域,使UI與數據和數據管理分離,這意味着當您想要更新數據時,您可以向UI詢問並更新它,並以您想要的方式更新要更新UI,您需要傳遞它所需的數據 – MadProgrammer

+0

@MadProgrammer您會以什麼樣的方式將UI與數據分開?我沒有任何運氣 –

回答

0

我找到了我正在尋找的代碼。這將清除addressBook面板,然後我可以再次從數據庫中拉取我的信息。

addressBook.removeAll(); 
    addressBook.updateUI(); 
3

從左邊的面板中插入數據之後,只需要調用將包含的代碼與像

lab1.setText($first_name); 
.. 
.. 

新文本設置更新的數據,然後把$first_name

null 
功能
+0

這不會清除舊數據,因此當我嘗試此操作時,我收到了重複的數據集。 –

+0

什麼'lab1'的舊數據? 'lab1.setText($ first_name);''將用新的'$ first_name'覆蓋'lab1'數據 –

+0

是的,lab1,lab2,lab3,lab4和lab5舊數據保留,並且我得到舊數據後的新名稱列表。它建立在一個循環中,並從數據庫中提取一長串名稱。使用你的建議,我得到一箇舊名單和一個新的名單。 –