jTable right-click popup menu

前端 未结 3 1643
温柔的废话
温柔的废话 2021-02-05 07:04

I have a SQL database and I am working on a program that will allow me to add/delete/modify records. I already managed to add records I am working on editing/deleting them.

相关标签:
3条回答
  • 2021-02-05 07:21

    A problem with a JTable is that the right click does not change the row selection. So you if have an Action that works on a specific row you need to left click the row first before right clicking to have the popup menu displayed.

    If you want the row to be selected where your right click then you can use code like the following:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class TableRightClick extends JFrame implements ActionListener
    {
        JPopupMenu popup;
    
        public TableRightClick()
        {
            popup = new JPopupMenu();
            popup.add( new JMenuItem("Do Something1") );
            popup.add( new JMenuItem("Do Something2") );
            popup.add( new JMenuItem("Do Something3") );
            JMenuItem menuItem = new JMenuItem("ActionPerformed");
            menuItem.addActionListener( this );
            popup.add( menuItem );
    
            JTable table = new JTable(50, 5);
            table.addMouseListener( new MouseAdapter()
            {
                public void mousePressed(MouseEvent e)
                {
                    System.out.println("pressed");
                }
    
                public void mouseReleased(MouseEvent e)
                {
                    if (e.isPopupTrigger())
                    {
                        JTable source = (JTable)e.getSource();
                        int row = source.rowAtPoint( e.getPoint() );
                        int column = source.columnAtPoint( e.getPoint() );
    
                        if (! source.isRowSelected(row))
                            source.changeSelection(row, column, false, false);
    
                        popup.show(e.getComponent(), e.getX(), e.getY());
                    }
                }
            });
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            getContentPane().add( new JScrollPane(table) );
        }
    
        public void actionPerformed(ActionEvent e)
        {
            Component c = (Component)e.getSource();
            JPopupMenu popup = (JPopupMenu)c.getParent();
            JTable table = (JTable)popup.getInvoker();
            System.out.println(table.getSelectedRow() + " : " + table.getSelectedColumn());
        }
    
        public static void main(String[] args)
        {
            TableRightClick frame = new TableRightClick();
            frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
            frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible( true );
        }
    }
    
    0 讨论(0)
  • 2021-02-05 07:33

    Here is an example on how to do that. The easiest way to achieve this, is to set a JPopupMenu on the JTable directly.

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Arrays;
    import java.util.Vector;
    
    import javax.swing.JFrame;
    import javax.swing.JMenuItem;
    import javax.swing.JOptionPane;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    
    public class TestTableRightClick {
    
        protected void initUI() {
            final JFrame frame = new JFrame(TestTableRightClick.class.getSimpleName());
            Vector<String> columns = new Vector<String>(Arrays.asList("Name", "Age"));
            Vector<Vector<String>> data = new Vector<Vector<String>>();
            for (int i = 0; i < 50; i++) {
                Vector<String> row = new Vector<String>();
                for (int j = 0; j < columns.size(); j++) {
                    row.add("Cell " + (i + 1) + "," + (j + 1));
                }
                data.add(row);
            }
            final JTable table = new JTable(data, columns);
            final JPopupMenu popupMenu = new JPopupMenu();
            JMenuItem deleteItem = new JMenuItem("Delete");
            deleteItem.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(frame, "Right-click performed on table and choose DELETE");
                }
            });
            popupMenu.add(deleteItem);
            table.setComponentPopupMenu(popupMenu);
            frame.add(new JScrollPane(table), BorderLayout.CENTER);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new TestTableRightClick().initUI();
                }
            });
        }
    }
    

    In case you want to automatically select the row where the right-click was made, add the following snippet:

    popupMenu.addPopupMenuListener(new PopupMenuListener() {
    
                @Override
                public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            int rowAtPoint = table.rowAtPoint(SwingUtilities.convertPoint(popupMenu, new Point(0, 0), table));
                            if (rowAtPoint > -1) {
                                table.setRowSelectionInterval(rowAtPoint, rowAtPoint);
                            }
                        }
                    });
                }
    
                @Override
                public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void popupMenuCanceled(PopupMenuEvent e) {
                    // TODO Auto-generated method stub
    
                }
            });
    
    0 讨论(0)
  • 2021-02-05 07:39

    Another issue is that context menus are dynamic, your solution does not deal with changing the menu depending on the clicked row

    popupMenu.addPopupMenuListener(new PopupMenuListener() 
    {
       @Override
       public void popupMenuWillBecomeVisible(PopupMenuEvent e) 
       { 
           int rowAtPoint = table.rowAtPoint(SwingUtilities.convertPoint(popupMenu, new Point(0, 0), table));
           generateTablePopupMenu(rowAtPoint); // here
           SwingUtilities.invokeLater(new Runnable() 
               ...
    
    0 讨论(0)
提交回复
热议问题