我需要在“表”的mouseListener中使用对象“ urObjectInCell”到另一个类BtnDelete1。

这是我的鼠标侦听器代码:

    JTable table;
    public FirstSwingApp(){
       super();
       table = new JTable(model);

       table.addMouseListener(new MouseAdapter() {

         public void mouseClicked(final MouseEvent e) {
             if (e.getClickCount() == 1) {
                final JTable target = (JTable)e.getSource();
                final int row = target.getSelectedRow();
                final int column = 1;
                // Cast to ur Object type
                urObjctInCell = target.getValueAt(row, column);

             }
         }
       });
       friendNo = urObjctInCell.toString();


我尝试将对象存储在先前已声明的friendNo字符串中。但是我不认为friendNo正在获取对象的价值。

这是我的BtnDelete1类代码:

public class BtnDelete1 implements ActionListener {

    public void actionPerformed(ActionEvent e) {



        String fnumber = friendNo;

        CallableStatement dstmt = null;
        CallableStatement cstmt = null;

        ResultSet rs;


        try {

            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/Contact_Manager?user=root");


            String SQL = "{call delete_contact (?)}";

            String disQuery = "select * from FRIEND";

            dstmt = conn.prepareCall(disQuery);
            cstmt = conn.prepareCall(SQL);

            cstmt.setString(1, fnumber);

            cstmt.executeQuery();

            rs = dstmt.executeQuery();

            ResultSetMetaData metaData = rs.getMetaData();

            // names of columns
            Vector<String> columnNames = new Vector<String>();
            int columnCount = metaData.getColumnCount();
            for (int column = 1; column <= columnCount; column++) {
                columnNames.add(metaData.getColumnName(column));
            }

            // data of the table
            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);
            }

            // It creates and displays the table


            model.setDataVector(data, columnNames);

            // Closes the Connection

            dstmt.close();
            System.out.println("Success!!");
        } catch (SQLException ex) {

            System.out.println("Error in connection: " + ex.getMessage());
        }


    }
}


从mouseListener获得的urObjectInCell对象的值将用于删除Jtable“表”中的一行。

最佳答案

我认为您可能会认为这是错误的。与其尝试在一些邪恶的婚姻中混合使用MouseListener和ActionListener,还不如在通知ActionListener时从JTable中简单地获取选定的单元格呢?

您可以通过为JTable-holding类提供一种方法来提取对所选JTable单元的引用,为ActionListener提供对该类的引用,并让ActionListener在收到通知后调用此方法并调用其回调方法来实现此目的。

例如,假设您有一个名为NoMouseListenerNeeded的GUI中保存的JTable:

import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

@SuppressWarnings("serial")
public class NoMouseListenerNeeded extends JPanel {
    private static final Integer[][] DATA = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
    private static final String[] COLS = { "A", "B", "C" };
    private DefaultTableModel tblModel = new DefaultTableModel(DATA, COLS);
    private JTable table = new JTable(tblModel);

    public NoMouseListenerNeeded() {
        JPanel btnPanel = new JPanel();
        btnPanel.add(new JButton(new MyButtonListener(this)));

        setLayout(new BorderLayout());
        add(new JScrollPane(table));
        add(btnPanel, BorderLayout.PAGE_END);
    }

    // get data held by selected cell in JTable
    // returns null if no cell selected
    public Object getSelectedCell() {
        int col = table.getSelectedColumn();
        int row = table.getSelectedRow();

        if (col < 0 || row < 0) {
            return null; // no selection made, return null
        } else {
            return table.getValueAt(row, col);
        }
    }

    private static void createAndShowGui() {
        NoMouseListenerNeeded mainPanel = new NoMouseListenerNeeded();

        JFrame frame = new JFrame("NoMouseListenerNeeded");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}


您可以通过将GUI传递到侦听器,然后调用GUI的方法来返回选定的数据,从而使用ActionListener(或AbstractAction)来获取选定的单元格:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;

@SuppressWarnings("serial")
public class MyButtonListener extends AbstractAction {
    private NoMouseListenerNeeded mainGui;

    public MyButtonListener(NoMouseListenerNeeded mainGui) {
        super("Press Me");
        putValue(MNEMONIC_KEY, KeyEvent.VK_P);
        this.mainGui = mainGui;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object cell = mainGui.getSelectedCell();

        if (cell != null) {
            String message = "Selection is: " + cell;
            JOptionPane.showMessageDialog(mainGui, message, "Selection", JOptionPane.PLAIN_MESSAGE);
        }
    }
}

07-25 22:46
查看更多