2016-11-15 3 views
0

Я пишу библиотечную систему, которая в настоящее время взаимодействует с базой данных. Функция, которую я хочу: каждый раз, когда я нажимаю JButton «lobBut», JTable «table» будет показывать новейший контент. Используя следующий код, я могу реализовать эту функцию. ОДНАКО, есть задержка в показе JTable. Чтобы сделать вещи более странными, если я нажимаю на другие приложения (например, Chrome или любой другой), JTable будет отображаться незамедлительно. Может ли кто-нибудь помочь мне преодолеть эту проблему? Спасибо!JButton invused JTable появляется в задержке

JButton lobBut = new JButton("List of Books"); 
lobBut.addActionListener(new ActionListener(){ 

     public void actionPerformed(ActionEvent event){ 
      centerPanel.removeAll(); 
      JTable bookTable = new JTable(BookTableModel.getTableModel("SELECT * FROM books")); 
      JScrollPane pane = new JScrollPane(bookTable); 
      bookTable.setPreferredScrollableViewportSize(new Dimension(600, 70)); 
      bookTable.setFillsViewportHeight(true); 
      DefaultTableCellRenderer renderer = (DefaultTableCellRenderer) bookTable.getTableHeader().getDefaultRenderer(); 
      renderer.setHorizontalAlignment(JLabel.CENTER); 
      bookTable.setShowGrid(true); 
      bookTable.setGridColor(Color.GREEN); 
      bookTable.setVisible(true); 
      centerPanel.add(pane); 
     } 
    }); 

Вот класс BookTableModel:

public class BookTableModel extends AbstractTableModel{ 
private String[] columnNames = {}; 
private Object[][] data = {}; 

public int getColumnCount(){ 
    return columnNames.length; 
} 

public int getRowCount(){ 
    return data.length; 
} 

public Object getValueAt(int row, int col){ 
    return data[row][col]; 
} 

public String getColumnName(int col){ 
    return columnNames[col]; 
} 

public Class getColumnClass(int c){ 
    return getValueAt(0, c).getClass(); 
} 

public static DefaultTableModel getTableModel(String sql){ 
    try(
      Statement stmt = ConnectionManager.getInstance().getConnection().createStatement(); 
      ResultSet rs = stmt.executeQuery(sql); 
      ){ 
     ResultSetMetaData metaData = rs.getMetaData(); 
     Vector<String> columnNames = new Vector<String>(); 
     int columnCount = metaData.getColumnCount(); 
     for(int column = 1; column <= columnCount; column++){ 
      columnNames.add(metaData.getColumnName(column)); 
     } 

     Vector<Vector<Object>> data = new Vector<Vector<Object>>(); 
     while(rs.next()){ 
      Vector<Object> vector = new Vector<Object>(); 
      for(int columnIndex = 1; columnIndex <= columnCount; columnIndex++){ 
       vector.add(rs.getObject(columnIndex)); 
      } 
      data.add(vector); 
     } 
     return new DefaultTableModel(data, columnNames); 


    }catch(SQLException e){ 
     System.err.print(e); 
     return null; 
    } 
} 

}

ответ

0

добавить

centerPanel.updateUI(); 

после

centerPanel.add(pane); 
+0

Спасибо! Я хочу жениться на тебе! –

+0

Это не соответствующее использование 'updateUI()'; вместо этого реализуйте 'validate()' охватывающий контейнер. – trashgod

0

Я хотел бы добавить еще один пункт в дополнение к ответу georgechen. В вашем коде я заметил, что новый jtable создается каждый раз, когда вы нажимаете кнопку.

Вместо этого попробуйте обновить только элементы (модели) в jtable и не создавать экземпляр jtable каждый раз, когда вы нажимаете кнопку.

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