【问题标题】:How to properly delete row in JTable with double click?如何通过双击正确删除 JTable 中的行?
【发布时间】:2017-05-21 08:03:37
【问题描述】:

大家下午好,我正在尝试学习 java 编程,然后在学习 JTable 时遇到了一些我不知道为什么我的代码出现的问题。

所以,我要做的是,当我双击 JTable 中名为 TableGejala 的行时,我双击的行将转移到另一个名为 TableAturan 的 JTable 中,之后我在 TableGejala 中双击的行将被移除。对于将行从 TableGejala 传输到 TableAturan 的部分,当我双击该行时成功传输,但它不会删除 TableGejala 中的正确行。它没有删除我单击的行,而是删除了它下面的行。

更多详情,这是我创建 TableGejala 的代码:

private void getTableGejala() {
        while(tabel2.getRowCount() > 0){
            for(int i=0;i < tabel2.getRowCount();i++){
                tabel2.removeRow(i);
            }
        }

        tabel2.addColumn("ID Gejala");
        tabel2.addColumn("Nama Gejala");

        TabelGejala.setModel(tabel2);
        TabelGejala.setAutoResizeMode(TabelGejala.AUTO_RESIZE_ALL_COLUMNS);
    }

然后这是我从 MySQL 获取表数据的代码:

    private void loadDataGejala(Boolean baru){
    tabel2.getDataVector().removeAllElements();

    try {
        java.sql.Connection konek = (Connection) Koneksi.KoneksiDB.getConnection();
        java.sql.Statement konek_statement = konek.createStatement();
        String query_bukaTabel = "";
        if(baru){
            query_bukaTabel = "select id_gejala,nama_gejala from gejala";
        }
        else{
            String idPkt = FieldID.getText();
            query_bukaTabel = "select gejala.id_gejala,gejala.nama_gejala from gejala where gejala.id_gejala not in(select id_gejala from aturan2 where id_penyakit='"+idPkt+"')";
        }

        java.sql.ResultSet line_result = konek_statement.executeQuery(query_bukaTabel);
        while (line_result.next()) {
            Object[] getO = new Object[2];
            getO[0] = line_result.getString("id_gejala");
            getO[1] = line_result.getString("nama_gejala");
            tabel2.addRow(getO);
        }
        line_result.close();
        konek_statement.close();
    }catch (Exception e) {} 
}

这是我转移行和删除行的代码:

    private void TabelGejalaMousePressed(java.awt.event.MouseEvent evt) {                                         

    if (evt.getClickCount()>=2){
        int col = 0;
        int row = 0;
        row = TabelGejala.rowAtPoint(evt.getPoint());
        col = TabelGejala.columnAtPoint(evt.getPoint());
        String col1 = (String)TabelGejala.getValueAt(row, 0);
        String col2 = (String)TabelGejala.getValueAt(row, 1);
        DefaultTableModel model = (DefaultTableModel) TabelAturan.getModel(); 
        DefaultTableModel old = (DefaultTableModel) TabelGejala.getModel();
        old.removeRow(row);
        model.addRow(new Object[]{col1, col2, 0});
        TabelAturan.requestFocus();
        TabelAturan.setRowSelectionInterval(TabelAturan.getRowCount()-1,TabelAturan.getRowCount()-1);        
        TabelAturan.editCellAt(TabelAturan.getRowCount()-1,2);
    }
}

这是我的问题的截图:

Before Double Clicked

After Double Clicked

哪个部分导致我的输出错误的行被删除?请帮助我,并提前感谢您的任何帮助,即使是阅读我的问题 :)

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    首先禁用第一个表(TabelGejala)中的单元格可编辑属性,以确保正确删除行。我使用以下代码实现了这一点:-

    //instance table model
        DefaultTableModel tableModel = new DefaultTableModel(new Object[][]{},
                new String[]{
                    "ID Gejala", "Nama Gejala"
                }) {
    
            @Override
            public boolean isCellEditable(int row, int column) {
                //all cells false
                return false;
            }
        };
    
        TabelGejala.setModel(tableModel);
    

    然后使用 jtable.getselectedrow() 和 jtable.getselectedcolumn() 从表中获取值。将所需值添加到第二个表后,只需删除所选行。这是代码,源自您的代码:-

    private void TabelGejalaMousePressed(java.awt.event.MouseEvent evt) {                                         
        // TODO add your handling code here:
        if (evt.getClickCount() >= 2) {
    
            DefaultTableModel model = (DefaultTableModel) TabelAturan.getModel();
            DefaultTableModel old = (DefaultTableModel) TabelGejala.getModel();
            model.addRow(new Object[]{TabelGejala.getValueAt(TabelGejala.getSelectedRow(), 0), TabelGejala.getValueAt(TabelGejala.getSelectedRow(), 1), 0});
            old.removeRow(TabelGejala.getSelectedRow());
    
            TabelAturan.requestFocus();
            TabelAturan.setRowSelectionInterval(TabelAturan.getRowCount() - 1, TabelAturan.getRowCount() - 1);
            TabelAturan.editCellAt(TabelAturan.getRowCount() - 1, 2);
        }
    }       
    

    【讨论】:

    • 啊,我明白了!非常感谢您的帮助:)
    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2015-06-30
    相关资源
    最近更新 更多