【问题标题】:How to delete a row from JTable while retaining it in the database如何从 JTable 中删除一行,同时将其保留在数据库中
【发布时间】:2014-08-15 10:45:42
【问题描述】:

我试图从我的JTable 中删除一行,而不向绑定的 MySQL 数据库发送更新。澄清一下:删除的行仍应存储在数据库中,但从我的 GUI 中可见的JTable 中删除。

import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

import java.awt.*;
import java.awt.event.*;
import java.sql.*;

import com.mysql.*; 

import java.util.*;
public class Days {
private DefaultTableModel tblModel;
JTable days;
private JTextField ttask;
private JTextField ttime;
private JTextField txtSearch;
private Statement st;
private JButton add=new JButton("Add");
private JButton delete= new JButton("Delete");
private JPanel panelinfo;
private PreparedStatement ps;
JFrame frame;
Connection con;
ResultSet r;
public Days(final String s){
    frame = new JFrame();
    frame.setBounds(100, 100, 598, 470);
    frame.getContentPane().setLayout(null);
    frame.setTitle("NoTimeNoLife");
    panelinfo = new JPanel();
    panelinfo.setBorder(new TitledBorder(null, "Add your Schedule:", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    panelinfo.setBounds(243, 76, 329, 135);

    JLabel a1 = new JLabel("Time :");
    a1.setBounds(10, 30, 46, 14);
    panelinfo.add(a1);
    JLabel a2 = new JLabel("Task :");
    a2.setBounds(10, 85, 46, 14);
    panelinfo.add(a2);
    frame.getContentPane().add(panelinfo);
    panelinfo.setLayout(null);


    add.setBounds(250, 222, 73, 30);
    frame.getContentPane().add(add);

    delete.setBounds(333, 222, 73, 30);
    frame.getContentPane().add(delete);

    ttime = new JTextField();
    ttime.setColumns(10);
    ttime.setBounds(93, 28, 206, 20);
    panelinfo.add(ttime);

    ttask = new JTextField();
    ttask.setColumns(10);
    ttask.setBounds(93, 84, 206, 20);
    panelinfo.add(ttask);

    JPanel panel = new JPanel();
    panel.setBorder(new TitledBorder(null, "DisplayId", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    panel.setBounds(10, 76, 230, 86);
    frame.getContentPane().add(panel);
    panel.setLayout(null);

    txtSearch = new JTextField();
    txtSearch.setBounds(10, 26, 210, 20);
    panel.add(txtSearch);
    txtSearch.setColumns(10);

    String [] columnNames = {"id", "Time", "Task"};
    days = new JTable(new DefaultTableModel(null, new Object[]{"id", "Time","Task"}));
    tblModel = (DefaultTableModel) days.getModel();
    days = new JTable(tblModel){
          public boolean isCellEditable(int rowIndex, int colIndex) {
          return false; //Disallow the editing of any cell
          }
          };
            days.setBorder(new LineBorder(new Color(0, 0, 0)));
            days.setBounds(55, 314, 496, 116);
            JScrollPane scrollPane = new JScrollPane(days);
            scrollPane.setPreferredSize(new Dimension(452, 150));
            JPanel p1 = new JPanel();
            p1.setBounds(49, 263, 523, 159);
            p1.add(scrollPane);
            frame.getContentPane().add(p1);

顺便说一句 - 谁能向我解释以下 sn-p 的含义:(Component[] com)?我复制了这段代码,除非获得许可,否则表格将不可编辑,但我不明白它是如何整体工作的。

    Component[] com = panelinfo.getComponents();  
            //Inside you action event where you want to disable everything  
            //Do the following  
            for (int a = 0; a < com.length; a++) {  
                 com[a].setEnabled(false);  
            }  

            frame.getContentPane().add(p1);
            try {
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testing1","root", "password");


            } catch (SQLException e) {
                System.out.println("Connection Failed! Check output console");
                e.printStackTrace();
            }
            displaydays(s); 
           add.addMouseListener(new MouseAdapter() {



                public void mouseClicked(MouseEvent arg0) {

                    if(add.getText().equalsIgnoreCase("Add")){              //equalsIgnoreCase ignores case sensitive

                    add.setText("Save");
                    delete.setText("Cancel");
                    days.setEnabled(false);
                    Component[] com = panelinfo.getComponents();  
                    //Inside you action event where you want to disable everything  
                    //Do the following  
                    for (int a = 0; a < com.length; a++) {  
                         com[a].setEnabled(true);  
                    }  
                    clear();
                    ttime.requestFocus();
                    }else{

                    int a = JOptionPane.showConfirmDialog(null, "Do you want to save this record?", "Message",  JOptionPane.YES_NO_OPTION);

                    if(a==0){

                        //try{
                            try {
                                st=con.createStatement();
                                if (arg0.getSource() == add){
                                    ps=con.prepareStatement("INSERT INTO "+s+" (Time, Task) values('" + ttime.getText() + "','" + ttask.getText() + "')");
                                }else{
                                ps=con.prepareStatement("UPDATE "+s+" set Time='" + ttime.getText() + "',Task ='" + ttask.getText() + "'where id ='" + ttime.getText() + "'" ); 

                                }
                                ps.executeUpdate();

                        defautview();
                        displaydays(s);


                            } catch (SQLException e) {
                                e.printStackTrace();
                            }
                    }


                    }


                }
                });

这是我的“删除”按钮,它应该从JTable 中删除数据,而不是从数据库中删除(目前我的“删除”按钮正在从JTable 和数据库中删除)。

 delete.addMouseListener(new MouseAdapter() {

                    public void mouseClicked(MouseEvent e) {
                        int a = JOptionPane.showConfirmDialog(null, "Do you want to delete this record?", "Message",  JOptionPane.YES_NO_OPTION);

                        if(a==0){

                        try {
                            st = con.createStatement();

                            ps = con.prepareStatement("delete from "+s+" where id ='" + txtSearch.getText() + "'");
                            System.out.println(ps);
                            ps.executeUpdate();
                            displaydays(s);
                            clear();

                        } catch (SQLException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                        }

                    }
                });

         days.addMouseListener(new MouseAdapter() {

                public void mouseClicked(MouseEvent arg0) {
                    int selectedRowIndex = days.getSelectedRow();
                    //int selectedColumnIndex = tblList.getSelectedColumn();
                    String selectedObject = (String) days.getModel().getValueAt(selectedRowIndex, 0);

                txtSearch.setText(selectedObject);
                search(s);

                }
             });
}











    void defautview() {
        // TODO Auto-generated method stub
        add.setText("Add");
        delete.setText("Delete");
        days.setEnabled(true);
        Component[] com = panelinfo.getComponents();  
        //Inside you action event where you want to disable everything  
        //Do the following  
        for (int a = 0; a < com.length; a++) {  
             com[a].setEnabled(false);  
        }  
        clear();
    }
    void clear() {
        // TODO Auto-generated method stub
        ttime.setText("");
        ttask.setText("");// set time and task clear.
    }

     void displaydays(String s) {
            // TODO Auto-generated method stub
            try {
                 st = con.createStatement();

                r = st.executeQuery("select * from "+s);
                tblModel.getDataVector().removeAllElements();
                while(r.next()){

                    tblModel.addRow(new Object[]{r.getString("id"),r.getString("Time"),r.getString("Task")});// Display the Table into tblModel using ResultSet

                }

            } catch (SQLException e2) {
                // TODO Auto-generated catch block
                System.out.println("error");
                e2.printStackTrace();
            }
     }
    void search(String s){
        try {
            st = con.createStatement();

         ResultSet rs=st.executeQuery("SELECT * FROM "+s+" WHERE id='"+ txtSearch.getText() + "'");
         if(rs.next()){
             ttime.setText(rs.getString("Time").toString());
             ttask.setText(rs.getString("Task").toString());
         }

        }catch (SQLException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
        }

     }

     }

【问题讨论】:

  • 如果可能,请尽快提供帮助。 ---> 不适用于公共论坛,
  • 为了获得更好的帮助,请尽快发布 MCVE/SSCCE 简短、可运行、可编译的 JTable/XxxTableModel 硬编码值
  • 对 JButton 使用 Swing Action/ActionListener 而不是 MouseListener

标签: java mysql swing jtable


【解决方案1】:

如果您不想从数据库中删除它,请不要调用数据库代码(鼠标点击):

  st = con.createStatement();
  ps = con.prepareStatement("delete from "+s+" where id ='" + txtSearch.getText() + "'");
  System.out.println(ps);
  ps.executeUpdate();
  displaydays(s);

并添加代码以删除类似这样的行:

DefaultTableModel dtm = new DefaultTableModel(rowName, colName);
table = new JTable(dtm);
dtm.removeRow(0); //remove first row

dtm.removeRow(index);

【讨论】:

  • 好的,我注释掉了数据库代码,但删除按钮变成了一个没有任何功能形式的附件。我该怎么办?我只想从 jtable 中删除。
  • @user3868279 不要删除按钮..只需注释掉数据库代码..并在您使用的数据模型中添加我在下面给出的代码
  • 我有一个现有的 Defaulttablemodel 如果我要使用你的,它会覆盖我现有的吗?抱歉,桌子有点新
  • 是 tblModel 吗?绝对使用现有的,只需替换名称并尝试 Like : tblModel.removeRow(0);看看第一行是否被删除
  • 您好,谢谢您能够删除第一行。我想再问一件事,是否有显示编辑的 jtable 代替,因为在我删除行并刷新表后,删除的行再次出现在那里(我知道它是因为数据没有从数据库中删除)但无论如何刷新后仍显示编辑过的数据。
猜你喜欢
  • 2019-03-17
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2018-10-13
  • 2014-08-28
相关资源
最近更新 更多