2013-11-09 4 views
0

정말 도움이 필요 할 수 있습니다.이 문제를 1 주일 이상 해결했지만 아직 해결 방법을 찾지 못했습니다.데이터베이스 삽입 후 JTable이 새로 고침되지 않습니다.

내 목표 : 데이터베이스에서 데이터를 읽을 수있는 테이블을 만들고 싶습니다. 내 프로그램에 삽입하여 DB에 데이터를 추가 할 수도 있습니다.

내 문제 : 데이터를 삽입 한 후 데이터베이스를 새로 고치면 데이터베이스에 새 레코드 세트가 표시됩니다. 그러나 내가 시도한 것에 관계없이 작동하지 않았습니다.

내 코드

: 여기
public class Gui_Test extends JFrame { 

JButton addMovieButton; 
JFrame frame = new JFrame("Movie Database"); 

JPanel panel; 
JMenuBar menubar; 
JMenu fileMenu; 
JLabel label; 
JTable table = new JTable(); 
MovieTableModel mtm; 

public static void main(String[] args) { 
    Gui_Test test = new Gui_Test(); 
    test.run(); 

} 

public void run() { 

    // Gui /// 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(300, 300); 
    frame.setVisible(true); 

    panel = new JPanel(); 
    panel.setVisible(true); 
    panel.setBackground(Color.black); 

    // Add - Movie Button /// 

    addMovieButton = new JButton("Add Movie"); 
    addMovieButton.addActionListener(new addMovieButtonListener()); 
    panel.add(addMovieButton); 

    // Table select /// 

    mtm = new MovieTableModel(); 
    table.setModel(mtm); 

    JScrollPane pane = new JScrollPane(table); 
    frame.getContentPane().add(pane); 
    frame.getContentPane().add(BorderLayout.WEST, panel); 

} 

class addMovieButtonListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     AddMoviePanel addmoviepanel = new AddMoviePanel(); 
     addmoviepanel.moviepanel(mtm); 

    } 
}} 

내 TableModel에 있습니다 : :

public class MovieTableModel extends AbstractTableModel { 

Connection con = null; 
Vector columnNames = new Vector(); 
Vector data = new Vector(); 
ResultSet rs; 
ResultSetMetaData meta; 

public MovieTableModel() { 

    showResult(); 
} 

void showResult() { 

    Connection con; 

    try { 
     con = DriverManager.getConnection(
       "jdbc:hsqldb:file:C:/Users/...", "sa", 
       ""); 

     java.sql.Statement stmt = con.createStatement(); 
     String query = "SELECT * FROM movies ORDER BY id DESC"; 
     ResultSet rs = stmt.executeQuery(query); 
     meta = rs.getMetaData(); 

     int columns = meta.getColumnCount(); 

     // get column names 
     for (int i = 1; i <= columns; i++) { 
      columnNames.addElement(meta.getColumnName(i)); 
     } 

     // get row data 

     while (rs.next()) { 
      Vector row = new Vector(columns); 
      for (int i = 1; i <= columns; i++) { 
       row.addElement(rs.getObject(i)); 
      } 
      data.addElement(row); 
     } 

     if (con != null) 
      try { 
       rs.close(); 
       con.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
    } catch (SQLException e1) { 
     e1.printStackTrace(); 
    } 
} 

@Override 
public String getColumnName(int column) { 

    return columnNames.get(column).toString(); 

} 

@Override 
public int getColumnCount() { 

    try { 
     return meta.getColumnCount(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return 0; 
} 

@Override 
public Class getColumnClass(int column) { 
    // TODO Auto-generated method stub 
    return getValueAt(0, column).getClass(); 
} 

@Override 
public int getRowCount() { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public Object getValueAt(int row, int column) { 

    return ((Vector) data.get(row)).get(column); 

} 

@Override 
public boolean isCellEditable(int rowIndex, int columnIndex) { 

    return false; 
} 

void addRow(final String value1, final String value2, final String value3, 
     final String value4, final String value5, final String value6, 
     final String value7) { 

    try { 

     Connection con = DriverManager.getConnection(
       "jdbc:hsqldb:file:C:/Users/Jonas/workspace/movieDB", "sa", 
       ""); 

     try { 

      final java.sql.Statement state = con.createStatement(); 

      try { 
       state.addBatch("INSERT INTO movies VALUES (DEFAULT, '" 
         + value1 + "', '" + value2 + "'," + value3 + ", '" 
         + value4 + "', " + value5 + ", '" + value6 + "', '" 
         + value7 + "')"); 

       state.executeBatch(); 

      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } catch (SQLException ex) { 
     // handle any errors 
     System.out.println("SQLException: " + ex.getMessage()); 
     System.out.println("SQLState: " + ex.getSQLState()); 
     System.out.println("VendorError: " + ex.getErrorCode()); 
    } finally { 
     if (con != null) 
      try { 
       con.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
    } 

}} 

그리고 여기에 새로운 동영상을 추가 열립니다 내 addMovieFrame입니다 :

여기
내 메인 프레임 급이다
public class AddMoviePanel { 

MovieTableModel mtm; 

JPanel addMoviePanel; 
JFrame addMovieFrame; 

JTextField value1Input; 
JTextField value2Input; 
// ... value3 - value7 

Connection con = null; 

public void moviepanel(MovieTableModel mtm) { 

    this.mtm = mtm; 
    addMovieFrame = new JFrame("Add Movie"); 
    addMovieFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    addMovieFrame.setVisible(true); 
    addMovieFrame.setSize(550, 300); 

    addMoviePanel = new JPanel(); 

    GroupLayout layout = new GroupLayout(addMoviePanel); 
    addMoviePanel.setLayout(layout); 

    JLabel label1 = new JLabel("label1:"); 
    JLabel label2 = new JLabel("label2"); 
    // ...JLabel 3-7 same as Label 1&2 

    addMoviePanel.add(label1); 
    addMoviePanel.add(label2); 
    // ...add Label 3-7 

    value1Input = new JTextField(); 
    value2Input = new JTextField(); 
    // ... value3- value7 Input 

    addMoviePanel.add(value1Input); 
    addMoviePanel.add(value2Input); 
    // ... add value3Input - value7Input 

    JButton ok = new JButton("Ok"); 

    ok.addActionListener(new okActionListener()); 
    addMovieFrame.add(ok); 

    addMovieFrame.getContentPane().add(addMoviePanel); 

    // here was just Layout Stuff // 
} 

class okActionListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     mtm.addRow(value1Input.getText(), value2Input.getText() 
       // ... value3Input.getText() - value7Input.getText() 
       ); 

     mtm.fireTableDataChanged(); 

     addMovieFrame.dispose(); 
    } 

}} 

나는 이미 여러 유형과 전나무의 위치를 ​​시도했다. eXXX-Methods ...

아마도 내 addtree-frame에서 OK-Button을 칠 때 내 jtable을 새로 고치는 방법을 알게 된 사람이있을 것입니다. :)

답변

1

herehere으로 표시된 것과 같이 TableModel 만 테이블 모델 이벤트를 발생시켜야합니다. 일반적으로 setValueAt()에서 수행되지만, 전체 행을 삽입하고 here과 같이 단일 이벤트를 발생시킬 수 있습니다.

관련 문제