Java:如何使用一个 mouseListener 中的对象到另一个类?

标签 java swing jtable mouselistener

我需要将“table”的 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 持有类提供一个方法来提取对所选 JTable 单元格的引用,为 ActionListener 提供对该类的引用,并让 ActionListener 在收到通知及其回调时调用此方法来实现此目的调用的方法。

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

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());
    }
}

您可以使用 ActionListener(或 AbstractAction)通过将 GUI 传递到监听器并调用返回所选数据的 GUI 方法来获取所选单元格:

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);
        }
    }
}

关于Java:如何使用一个 mouseListener 中的对象到另一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40252221/

相关文章:

Java - 引用 HashMap 中的对象时出现 NullPointerException

java - 枚举正在尝试通过不存在的公共(public)初始化程序来初始化自身

java - 在 libgdx 中碰撞时出现主体的空错误(虽然不是)

java - JPopupMenu 上的 JComboBox

java - 使 Swing 组件垂直对齐

java - 在 JTabbedPane 中更改选项卡时如何停止编辑 JTable 中的 JCombobox

java - 处理自己滚动的 JTabel 替代方案

java - 如何将大型依赖树从 Maven Central 推送到本地 Archiva 服务器?

java - jButton 仅响应第二次单击

java - JTable 无法获取主列内容的问题