Java JTable+;jpopmpmenu+;ActionListener=噩梦

Java JTable+;jpopmpmenu+;ActionListener=噩梦,java,swing,awt,actionlistener,actionevent,Java,Swing,Awt,Actionlistener,Actionevent,我的主类是一个包含图形组件的窗口,包括JTable 我创建了一个公共类ContextMenu,它是jpopmenu的自定义实现,包含多个JMenuItem 我已在我的JTable上注册了一个鼠标侦听器,以便在检测到右键单击时显示ContextMenu的实例 问题如下:“如何根据所选的JMenuItem,将所选行传递给不同的函数?” 显而易见的答案是在我的JMenuItem上设置ActionListener,但请记住JTable与jpopMenu位于不同的类/对象中 有些密码狙击手胜过千言万语 p

我的主类是一个包含图形组件的窗口,包括
JTable

我创建了一个公共类
ContextMenu
,它是
jpopmenu
的自定义实现,包含多个
JMenuItem

我已在我的
JTable
上注册了一个鼠标侦听器,以便在检测到右键单击时显示
ContextMenu
的实例

问题如下:“如何根据所选的
JMenuItem
,将所选行传递给不同的函数?”

显而易见的答案是在我的
JMenuItem
上设置ActionListener,但请记住
JTable
jpopMenu
位于不同的类/对象中

有些密码狙击手胜过千言万语

public class Tab implements ITab {
private ContextMenu contextMenu;
private JTable table;
private List<SomeObject> toProcess;
--- code --
private JScrollPane drawScrollTable() {
        Object columns[] = {
            "something",
            "somethingElse"
        };
        Object rows[][] = {};
        table = new JTable(new DefaultTableModel(rows, columns));
        JScrollPane scrollPane = new JScrollPane(table);

        table.setSelectionForeground(Color.BLACK);
        table.addMouseListener(new MouseAdapter() {         
            @Override
            public void mouseReleased(MouseEvent e) { 
                int selectedRow = table.rowAtPoint(e.getPoint());

                if (selectedRow >= 0 && selectedRow < table.getRowCount()) {
                    if (!table.getSelectionModel().isSelectedIndex(selectedRow)) {
                        table.setRowSelectionInterval(selectedRow, selectedRow);
                    }
                }

                if (e.isPopupTrigger() && e.getComponent() instanceof JTable) {  
                    this.show(e);
                }
            }

            private void show(MouseEvent e){
                contextMenu.show(e.getComponent(), e.getX(), e.getY());
            }
        });

        return scrollPane;
    }
-- code --
}

public class ContextMenu extends JPopupMenu {
    JMenuItem item;

    public ContextMenu(IBurpExtenderCallbacks callbacks){
        this.item= new JMenuItem("item");

        this.item(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {     
                 // Do action involving the selected row, even better if possible action involving the value hold in the column 0 of the selected row and the toProcess private field 
            }
        });

        add(item);
    }
}
公共类选项卡实现ITab{
私有上下文菜单上下文菜单;
专用JTable表;
私有列表处理;
---代码--
私有JScrollPane drawScrollTable(){
对象列[]={
“某物”,
“有些东西”
};
对象行[][]={};
table=新的JTable(新的DefaultTableModel(行、列));
JScrollPane scrollPane=新的JScrollPane(表);
table.setSelectionForeground(黑色);
table.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效MouseEvent(MouseEvent e){
int-selectedRow=table.rowAtPoint(例如getPoint());
if(selectedRow>=0&&selectedRow

我不知道我的要求是否可行。

肮脏的方式:传递参考资料。
更简洁的方式:通过M-C-V构建您的程序

我最讨厌的方式是:

import java.awt.BorderLayout;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TableTest extends JPanel {
    private TableClass tableClass = new TableClass();

    public TableTest() {
        setLayout(new BorderLayout());
        add(tableClass);
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("TableTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new TableTest());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

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

class ContextMenu extends JPopupMenu {
    private JMenuItem item;
    private TableClass tableClass;  // dirty direct reference *****

    public ContextMenu(TableClass tableClass){
        this.tableClass = tableClass;
        this.item= new JMenuItem("item");

        this.item.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {     
                int row = tableClass.getSelectedRow();
                JTable table = tableClass.getTable();
                System.out.println("row: " + row);
                StringBuilder sb = new StringBuilder("Data: ");
                for (int i = 0; i < table.getColumnCount(); i++) {
                    sb.append(table.getValueAt(row, i));
                    if (i != table.getColumnCount() - 1) {
                        sb.append(", ");
                    }
                }
                System.out.println(sb);
            }
        });

        add(item);
    }
}

class TableClass extends JPanel {
    // ***** passing **this** into the ContextMenu class
    private ContextMenu contextMenu = new ContextMenu(this); 
    private static final Integer[][] DATA = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    private static final String[] COLUMN_NAMES = {"A", "B", "C"};
    private DefaultTableModel model = new DefaultTableModel(DATA, COLUMN_NAMES);
    private JTable table = new JTable(model);

    public TableClass() {
        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent e) {
                int selectedRow = table.rowAtPoint(e.getPoint());
                if (selectedRow >= 0 && selectedRow < table.getRowCount()) {
                    if (!table.getSelectionModel().isSelectedIndex(selectedRow)) {
                        table.setRowSelectionInterval(selectedRow, selectedRow);
                    }
                }
                if (e.isPopupTrigger() && e.getComponent() instanceof JTable) {
                    showPopUp(e);
                }
            }

            private void showPopUp(MouseEvent e) {
                contextMenu.show(e.getComponent(), e.getX(), e.getY());                
            }
        });

        setLayout(new BorderLayout());
        add(new JScrollPane(table));
    }

    public int getSelectedRow() {
        return table.getSelectedRow();
    }

    public int getSelectedColumn() {
        return table.getSelectedColumn();
    }

    public JTable getTable() {
        return table;
    }
}
导入java.awt.BorderLayout;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.table.DefaultTableModel;
公共类TableTest扩展了JPanel{
private TableClass TableClass=新TableClass();
公共表格测试(){
setLayout(新的BorderLayout());
添加(表格类);
}
私有静态void createAndShowGui(){
JFrame=新JFrame(“表格测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(newTableTest());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
调用器(()->createAndShowGui());
}
}
类上下文菜单扩展了JPOppMenu{
私人物品;
私有TableClass TableClass;//直接引用脏*****
公共上下文菜单(TableClass TableClass){
this.tableClass=tableClass;
本项目=新项目(“项目”);
this.item.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
int row=tableClass.getSelectedRow();
JTable table=tableClass.getTable();
System.out.println(“行:”+行);
StringBuilder sb=新的StringBuilder(“数据:”);
对于(int i=0;i=0&&selectedRow    table.addMouseListener(new MouseAdapter() {         
        @Override
        public void mouseReleased(MouseEvent e) { 
            int selectedRow = table.rowAtPoint(e.getPoint());

            if (selectedRow >= 0 && selectedRow < table.getRowCount()) {
                if (!table.getSelectionModel().isSelectedIndex(selectedRow)) {
                    table.setRowSelectionInterval(selectedRow, selectedRow);
                }
            }

            if (e.isPopupTrigger() && e.getComponent() instanceof JTable) {  
                this.show(e);
            }
        }

        private void show(MouseEvent e){
            int clickedRow=table.rowAtPoint(e.getPoint());
            int clickedCol=table.columnAtPoint(e.getPoint());
            Object data=table.getValueAt(row, i);

            DataClickedOnTable transportMeThere=new DataClickedOnTable(
              table, data, clickedRow, clickedColumn
            );
            contextMenu.setDataFromTable(transportMeThere);
            contextMenu.show(e.getComponent(), e.getX(), e.getY());
        }
    });
   ///....
   ///...


// Just an example of structure transporting the data
// Add whatever data members are relevant
private /* inner */ class DataClickedOnTable {
   public TestTable source;
   public Object data;
   public int row;
   public int column;

   public DataClickedOnTable(
     TestTable source, Object data, int row, int col
   ) {
     this.source=source;
     this.data=data;
     this.col=col;
     this.row=row;
   }
}
public class ContextMenu extends JPopupMenu {
    JMenuItem item1;
    JMenuItem item2; 

    Object dataFromTable; // make it an Integer 

    public ContextMenu(IBurpExtenderCallbacks callbacks){
        this.item1 = new JMenuItem("item");
        this.item2 = new JMenuItem("item");

        this.item1(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {     
                // You already have the relevant data in the dataFromTable
                // Do want you need in this context
            }
        });
        this.item2(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {     
                // You already have the relevant data in the dataFromTable
                // Do want you need to do in this context
            }
        });

        add(item1);
        add(item2);
    }

    void setDataFromTable(DataClickedOnTable data) {
      this.dataFromTable=data;
      // filter possible actions based on the received data - some
      // actions are possible, some won't.
      // Example:
      this.item1.setEnabled(null!=data && (data.row % 2)==0);
      this.item2.setEnabled(
            null!=data 
         && ((data.row % 2)==1 || data.data instanceof Number)
      );

    }
}