JButton调用JTable显示延迟

时间:2016-11-15 21:15:00

标签: java jtable jbutton actionlistener

我正在编写一个目前与数据库交互的图书馆系统。 我想要的功能是:每次我点击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;
    }
}

}

2 个答案:

答案 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。