2014-04-27 2 views
0

데이터베이스에 뭔가를 보낸 텍스트 상자가 있고 jtable은 데이터베이스에서 값을 나열합니다. 그러나 나는 데이터베이스에 무언가를 추가 할 때. Jtable 같은 시간에 그것을 표시하지 마십시오. 내가 프로그램을 닫고 다시 디버깅 할 때, 그 시간을 보여준다. 저장 버튼을 클릭하면 Jtabel이 텍스트 상자 값을 표시합니다. 어떻게 동적 인 jtable을 만들 수 있습니까?동적으로 JTable에 값 추가

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Vector; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableColumn; 

public class Topic extends JFrame { 

    private static final long serialVersionUID = 1L; 
    JFrame frmTopic; 
    JPanel pnl, pnl_generaltopic; 
    static JTextField txt_topic; 
    JLabel lbl_topicNme, lbl_topicpage; 
    JButton btn_close, btn_update, btn_save; 
    public static Connection con = null; 
    public static ResultSet rs = null; 
    public static Statement st = null; 
    static Vector<Vector<String>> data = new Vector<Vector<String>>(); 
    private JScrollPane scrollPane; 
    private static JTable table; 

    public Topic() { 
     pnl_generaltopic = new JPanel(); 
     pnl_generaltopic.setBackground(Color.lightGray); 
     pnl_generaltopic.setLayout(null); 

     frmTopic = new JFrame("Topic"); 
     frmTopic.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowOpened(WindowEvent arg0) { 

       con = Dbconnect.conect(); 
      } 
     }); 
     frmTopic.setTitle("E-TEST"); 
     frmTopic.setBounds(100, 100, 500, 500); 
     frmTopic.setVisible(true); 
     frmTopic.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frmTopic.getContentPane().setLayout(new BorderLayout(0, 0)); 
     frmTopic.getContentPane().add(pnl_generaltopic); 

     topicPanel(); 
     topicTable(); 
    } 

    public void topicPanel() { 

     JPanel panel_addingNewTopic = new JPanel(); 
     panel_addingNewTopic.setBounds(10, 0, 464, 203); 
     pnl_generaltopic.add(panel_addingNewTopic); 
     panel_addingNewTopic.setLayout(null); 
     btn_save = new JButton("Save"); 
     btn_save.setBounds(65, 166, 67, 23); 
     panel_addingNewTopic.add(btn_save); 
     btn_update = new JButton("Update"); 
     btn_update.setBounds(142, 162, 90, 30); 
     panel_addingNewTopic.add(btn_update); 
     btn_close = new JButton("Close"); 
     btn_close.setBounds(240, 162, 90, 30); 
     panel_addingNewTopic.add(btn_close); 
     txt_topic = new JTextField(); 
     txt_topic.setBounds(65, 59, 270, 71); 
     panel_addingNewTopic.add(txt_topic); 


     lbl_topicNme = new JLabel("Topic Name"); 
     lbl_topicNme.setBounds(10, 65, 150, 59); 
     panel_addingNewTopic.add(lbl_topicNme); 
     lbl_topicpage = new JLabel("Topic Page"); 
     lbl_topicpage.setBounds(10, 11, 300, 20); 
     panel_addingNewTopic.add(lbl_topicpage); 
     lbl_topicpage.setFont(new Font("arial", Font.BOLD, 15)); 


     btn_close.addActionListener(new ActionListener() { 
             public void actionPerformed(ActionEvent e) { 
              frmTopic.dispose(); 
             } 
            } 
     ); 

     btn_save.addActionListener(new ActionListener() { 
             public void actionPerformed(ActionEvent e) { 
              try { 

               st = con.createStatement(); 
               String sorgu = "insert into topic " + "(topicname)" 
                 + "VALUES ('" + txt_topic.getText() + "')"; 
               st.executeUpdate(sorgu); 
               JOptionPane.showMessageDialog(Topic.this, "Topic was added"); 
              } catch (Exception s) { 
               System.out.print(s.getMessage()); 
              } 
             } 
            } 
     ); 
    } 


    public void topicTable() { 

     scrollPane = new JScrollPane(); 
     scrollPane.setBounds(10, 226, 464, 190); 
     pnl_generaltopic.add(scrollPane); 

     Vector<String> headers = new Vector<String>(); 
     headers.add("Topic Name"); 


     getData(); 

     //this is the model which contain actual body of JTable 
     DefaultTableModel model = new DefaultTableModel(data, headers); 
     table = new JTable(model); 
     scrollPane.setColumnHeaderView(table); 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     //table=new JTable(model); 
     //table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

     header_size(); 

     //JScrollPane scroll = new JScrollPane(table); 

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

     pack(); 
     setResizable(false); 
     setVisible(true); 
    } 


    /** 
    * 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(0); 
     column.setPreferredWidth(350); 
    } 


    /** 
    * Fetching Data From MySql Database 
    * and storing in a Vector of a Vector 
    * to Display in JTable 
    */ 
    private static void getData() { 
     // Enter Your MySQL Database Table name in below Select Query. 
     String str = "select * from topics"; 
     Connection con; 
     ResultSet rs; 
     Statement st; 

     try { 
      con = DriverManager.getConnection("jdbc:mysql://" + "localhost:3306/database", "root", "1234"); 
      st = con.createStatement(); 
      rs = st.executeQuery(str); 

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

       d.add(rs.getString("topicname")); 

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

     } catch (SQLException e) { 

      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 

     Topic topic = new Topic(); 
     topic.setVisible(false); 
    } 


} 

답변

1

동적 모델에 데이터 행을 추가 할 수 DefaultTableModeladdRow(...) 방법을 사용할 수 있습니다.

데이터베이스에 대한 업데이트가 성공적이면 addRow() 메소드가 호출됩니다.

또한 SQL을 사용할 때는 PreparedStatement를 사용해야합니다. 분리 문자를 걱정할 필요가 없으므로 SQL 작성이 더 쉬워집니다. 간단한 아이디어 예 :

String sql = "INSERT INTO Page (Name, Title) VALUES (?, ?)"; 
PreparedStatement stmt = connection.prepareStatement(sql); 
stmt.setString(1, "Name1"); 
stmt.setString(2, textField.getText()); 
stmt.executeUpdate(); 
+0

행을 다시 추가 한 후 테이블에서 Update()를 호출하여 다시 그릴 수 있는지 확인할 수 있습니다. DefaultTableModel이이 작업을 수행하는지 여부는 잊어 버립니다. – user430788

+0

@ user430788 아니요, 행을 추가 한 후 Update()를 호출 할 필요가 없습니다. JTable에 통지 해, 테이블이 그 자체로 재 페인트 할 수 있도록 (듯이), 데이터가 변경되었을 경우는 TableModel의 책임입니다. 실제로 Swing 구성 요소에서 update()를 호출하면 안됩니다. – camickr

+0

나는 addRow를 시도했지만 해결책이 없다. 작동하는 몇 가지 코드를 제공 할 수 있습니까? – user3536626