簡體   English   中英

為什么在使用組合框actionListerner之后沒有取消tableModelListener代碼

[英]why is tableModelListener code is not being excquted after use of a combo box actionListerner

我有一個簡單的程序,可以使用JTable顯示數據庫的表。 我有一個列出所有可用表的組合框,還有一個actionListener,它每次更改模型時都會將模型設置為表。 這可以按需工作。 我得到的問題是,當選擇一個表時,程序在未更新數據庫之前從未到達tableModelListener的代碼。

如果程序輸入了某些代碼塊並且一旦組合框actionListener被激活,則程序從不進入表模型偵聽器,我通過放置彈出消息進行了一些調試。

下面是大部分代碼。

classes.addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent ev) {
            JComboBox cb = (JComboBox)ev.getSource();
            classname =(String)cb.getSelectedItem();

            String genQuery="select * from "+classname;
            String query = genQuery ;


            //adding info from databae to table/
            ResultSet rs=null;
            try {
                rs = stmt.executeQuery(query);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            table.setModel(DbUtils.resultSetToTableModel(rs));


        }               

    });

//

//update database
    table.getModel().addTableModelListener(new TableModelListener() {

        @Override
        public void tableChanged(TableModelEvent e) {
            //catch events
            JOptionPane.showMessageDialog(null,"inside table listener");
            int row = e.getFirstRow();  
            int column = e.getColumn();  
            TableModel model = (TableModel)e.getSource();  
            Object data = model.getValueAt(row, column); 
            JOptionPane.showMessageDialog(null, "row: "+ row+" column: "+column+" data "+data);

            String dt = (String)data;
            int val=(Integer) null;
            if(dt.equals("true"))
                val=1;
            if(dt.equals("false"))
                val=0;


            Object student = model.getValueAt(row, 1);
            String stud = (String)student;
            String colname =table.getColumnName(column);



            String edit="update "+classname+" set "+colname+" = ? where studentName= ?";

            try {
                conn.setAutoCommit(false);
                PreparedStatement updateinfo = conn.prepareStatement(edit);


                updateinfo.setInt(1, val);
                updateinfo.setString(2, stud);
                updateinfo.executeUpdate();
                conn.commit();
                JOptionPane.showMessageDialog(null, stud+" has been updated.");
            } catch (SQLException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }

        }



    });

您的動作偵聽器將創建一個新的表模型,並用此新表模型替換JTable的模型。 因此,您之前添加的TableModelListener仍會偵聽不再使用的舊表模型。

不要替換表模型,而要更改其內容。 或替換表模型,但將TableModelListener添加到新模型中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM