2014-11-30 4 views
1

Я добавил текстовое поле и jTable в том же фрейме. После получения значения из текстового поля на jButton1 щелкните, я вставляю значение в базу данных, и те же данные отображаются в jTable. Но проблема в том, что моя таблица не обновляется после добавления данных. Я должен evrytime выполнить программу, чтобы получить обновление таблицы. Я пробовал Frame.invalidate, Frame.validate, Frame.repaint , tbale.repaint, но ничего не получилось, где я ошибаюсь. Спасибо заранее ..!Обновить данные JTable в Swing

public class mainFrame extends javax.swing.JFrame { 

static JTable table; 
static Connection connection; 
static Statement statement; 
static JTable jTable1; 
static int count; 
static String r; 

/** 
* Creates new form mainFrame 
*/ 
public mainFrame() { 
    super(); 

    initComponents(); 
    setLocation(500, 180); 
    try { 
     //----------database 
     Class.forName("org.sqlite.JDBC"); 
     connection = null; 
     connection = DriverManager.getConnection("jdbc:sqlite:excel.db"); 
     statement = connection.createStatement(); 
     statement.executeUpdate("CREATE TABLE IF NOT EXISTS testing (id INTEGER PRIMARY KEY , namexcel string)"); 

     //-------- 
     final String queryCheck = "SELECT count(*) from testing"; 
     final PreparedStatement ps = connection.prepareStatement(queryCheck); 
     // ps.setString(1, name); 
     final ResultSet resultSet = ps.executeQuery(); 
     if (resultSet.next()) { 
      count = resultSet.getInt(1); 
      System.out.println(count); 

     } 

     String read = "select * from testing"; 
     ResultSet rs = statement.executeQuery(read); 
     Object[][] data = new Object[count][2]; 
     int i = 0; 
     while (rs.next()) { 

      for (int c = 0; c < 1; c++) { 
       data[i][c] = rs.getString("namexcel"); 

      } 
      i++; 

     } 

     String[] headers = {"Name"}; 

     table = new JTable(data, headers); 

     jScrollPane2.setViewportView(table); 

     //  pack(); 
    } catch (Exception e) { 

    } 
} 

/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

//..... 
}// </editor-fold>       

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           

    try { 
     String link = jTextField1.getText(); 
     System.out.println("" + link + ""); 
     jTextField1.setText(""); 
     File f = new File("" + link + ""); 
     if (!f.exists()) { 
      JOptionPane.showMessageDialog(null, "File Doesnt Exist....!!"); 

     } else { 
      FileInputStream file = new FileInputStream(f); 
      XSSFWorkbook workbook = new XSSFWorkbook(file); 
      String name = workbook.getSheetName(0); 
      System.out.println(name); 
      final String queryCheck = "SELECT count(*) from testing WHERE namexcel = ?"; 
      final PreparedStatement ps = connection.prepareStatement(queryCheck); 
      ps.setString(1, name); 
      final ResultSet resultSet = ps.executeQuery(); 
      if (resultSet.next()) { 
       final int count = resultSet.getInt(1); 
       if (count == 0) { 
        JOptionPane.showMessageDialog(null, "thank you");       
        statement.executeUpdate("insert into testing (namexcel) values('" + name + "')"); 
       mainFrame frame = new mainFrame(); 
       frame.invalidate(); 
       frame.validate(); 

       table.revalidate(); 

       } else { 
        JOptionPane.showMessageDialog(null, "Name Already exist please select diffrent name of excel"); 
       } 
      } 

     } 

    } catch (Exception r) { 

    } 
}           

/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) throws Exception { 

    /* Set the Nimbus look and feel */ 
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
    * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
    */ 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Windows".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (Exception ex) { 

    } 
    //</editor-fold> 

    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new mainFrame().setVisible(true); 
     } 
    }); 
} 


private javax.swing.JButton jButton1; 
private javax.swing.JLabel jLabel1; 
private javax.swing.JPanel jPanel1; 
public static javax.swing.JScrollPane jScrollPane2; 
private javax.swing.JTextField jTextField1; 

}

Ниже приведен inicomponent метод

private void initComponents() { 

    jPanel1 = new javax.swing.JPanel(); 
    jButton1 = new javax.swing.JButton(); 
    jLabel1 = new javax.swing.JLabel(); 
    jTextField1 = new javax.swing.JTextField(); 
    jScrollPane2 = new javax.swing.JScrollPane(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder()); 

    jButton1.setText("Add"); 
    jButton1.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton1ActionPerformed(evt); 
     } 
    }); 

    jLabel1.setFont(new java.awt.Font("Dialog", 1, 11)); // NOI18N 
    jLabel1.setText("Add Excel Sheet Link"); 

    jTextField1.setText(""); 

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
    jPanel1.setLayout(jPanel1Layout); 
    jPanel1Layout.setHorizontalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel1Layout.createSequentialGroup() 
      .addGap(26, 26, 26) 
      .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(jPanel1Layout.createSequentialGroup() 
        .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addGap(0, 0, Short.MAX_VALUE)) 
       .addGroup(jPanel1Layout.createSequentialGroup() 
        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
         .addComponent(jTextField1) 
         .addGroup(jPanel1Layout.createSequentialGroup() 
          .addComponent(jLabel1) 
          .addGap(0, 0, Short.MAX_VALUE))) 
        .addContainerGap()))) 
    ); 
    jPanel1Layout.setVerticalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel1Layout.createSequentialGroup() 
      .addGap(20, 20, 20) 
      .addComponent(jLabel1) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 13, Short.MAX_VALUE) 
      .addComponent(jButton1) 
      .addContainerGap()) 
    ); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE)) 
      .addContainerGap()) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(18, 18, 18) 
      .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 394, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(20, Short.MAX_VALUE)) 
    ); 

    pack(); 
} 

ответ

2
  1. Не делайте table = new JTable(data, headers); в конструкторе. Вы отменяете начальную таблицу, которую вы перетаскиваете. Конечно, jScrollPane2.setViewportView(table);, возможно, исправил его (установив окно просмотра в новую таблицу), но это не нужно и запахи будущих проблем, если вы не понимаете, что происходит.

  2. Вместо этого работайте с обновленной моделью таблицы. Так, вместо table = new JTable,

    DefaultTableModel model = new DefaultTableModel(data, headers); 
    table.setModel(model); 
    

    Все.

  3. Чтобы обновить таблицу, просто обновите модель после успешного обновления в базе данных.

    if (successfulInsert) { 
        DefaultTableModel model = (DefaultTableModel)table.getModel(); 
        Object[] row = .... // get the data for the row 
        model.addRow(row); 
    } 
    

Смотри на How to Use Tables и Creating a TableModel и DefaultTableModel API

+0

Вместо "таблицы = новые JTable (данные, заголовки)" Я написал «DefaultTableModel модели = новые DefaultTableModel (данные, заголовки); таблицу .setModel (model) "в конструкторе, но после выполнения таблицы не отображается. – nikalldway

+0

Я думаю, что таблица, которую вы перетащили на стол, была 'jtable1', нет? В этом случае используйте 'jtable1', а не' table'. Убедитесь в том, что метод initComponents. В исходном коде должен быть '+', который позволит вам его расширять. –

+0

Да, я попробовал с DefaultTableModel model = new DefaultTableModel (данные, заголовки); jTable1.setModel (модель); , Столбец не отображается – nikalldway

Смежные вопросы