我正在编写一个目前与数据库交互的图书馆系统。 我想要的功能是:每次我点击JButton" lobBut",JTable"表"将显示最新内容。 使用下面的代码,我可以实现这个功能。但是,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类:
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 :(得分:0)
添加
//Your button to get selected list
getChoice = (Button)findViewById(R.id.getchoice);
ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, android.R.layout.simple_list_item_multiple_choice, countries);
myList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
myList.setAdapter(adapter);
getChoice.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
String selected = "";
int cntChoice = myList.getCount();
SparseBooleanArray sparseBooleanArray = myList.getCheckedItemPositions();
for(int i = 0; i < cntChoice; i++){
if(sparseBooleanArray.get(i)) {
selected += myList.getItemAtPosition(i).toString() + "\n";
}
}
Toast.makeText(MainActivity.this, selected, Toast.LENGTH_LONG).show();
}});
后
centerPanel.updateUI();
答案 1 :(得分:0)
除了georgechen的回答,我还想补充一点。 在您的代码中,我注意到,每次单击按钮时都会创建一个新的jtable。
相反,只尝试更新jtable中的项目(模型),并且每次单击按钮时都不要实例化jtable。