JButton 调用的 JTable 延迟显示
JButton invoked JTable show up in delay
我目前正在编写一个与数据库交互的图书馆系统。
我想要的功能是:每次点击JButton"lobBut",JTable"table"会显示最新的内容。
使用下面的代码,我可以实现这个功能。但是,JTable 的显示有延迟。更奇怪的是,如果我单击其他应用程序(例如 Chrome 或任何其他应用程序),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 class:
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;
}
}
}
添加
centerPanel.updateUI();
之后
centerPanel.add(pane);
除了georgechen的回答,我还想补充一点。
在您的代码中,我注意到,每次单击按钮时都会创建一个新的 jtable。
相反,尝试只更新 jtable 中的项目(模型),不要在每次单击按钮时都实例化 jtable。
我目前正在编写一个与数据库交互的图书馆系统。 我想要的功能是:每次点击JButton"lobBut",JTable"table"会显示最新的内容。 使用下面的代码,我可以实现这个功能。但是,JTable 的显示有延迟。更奇怪的是,如果我单击其他应用程序(例如 Chrome 或任何其他应用程序),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 class:
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;
}
}
}
添加
centerPanel.updateUI();
之后
centerPanel.add(pane);
除了georgechen的回答,我还想补充一点。 在您的代码中,我注意到,每次单击按钮时都会创建一个新的 jtable。
相反,尝试只更新 jtable 中的项目(模型),不要在每次单击按钮时都实例化 jtable。