jTable右键单击弹出菜单

我有一个SQL数据库,我正在开发一个允许我添加/删除/修改记录的程序。 我已经设法添加我正在编辑/删除它们的记录。

我想在表中显示现有记录,所以我使用jTable。 我在网上发现了一些代码并对其进行了修改以提取记录并将其显示在jtable中,但我不知道如何编写右键并显示弹出菜单。

在该弹出菜单中,我想显示删除记录和修改记录等选项。

这是我使用的代码,使jTable和显示数据:

private void menuDeleteAuthorActionPerformed(java.awt.event.ActionEvent evt) { TableFromDatabase deleteAuthor = new TableFromDatabase(); deleteAuthor.pack(); deleteAuthor.setVisible(true); Vector columnNames = new Vector(); Vector data = new Vector(); try { Connection connection = DriverManager.getConnection( url, user, password ); // Read data from a table String sql = "SELECT * FROM Authors"; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery( sql ); ResultSetMetaData md = rs.getMetaData(); int columns = md.getColumnCount(); // Get column names for (int i = 1; i <= columns; i++) { columnNames.addElement( md.getColumnName(i) ); } // Get row data while (rs.next()) { Vector row = new Vector(columns); for (int i = 1; i <= columns; i++) { row.addElement( rs.getObject(i) ); } data.addElement( row ); } rs.close(); stmt.close(); connection.close(); } catch(Exception e) { System.out.println( e ); } // Create table with database data JTable table = new JTable(data, columnNames) { public Class getColumnClass(int column) { for (int row = 0; row < getRowCount(); row++) { Object o = getValueAt(row, column); if (o != null) { return o.getClass(); } } return Object.class; } }; JScrollPane scrollPane = new JScrollPane( table ); getContentPane().add( scrollPane ); JPanel buttonPanel = new JPanel(); getContentPane().add( buttonPanel, BorderLayout.SOUTH ); } 

我是Java的新手,所以请在回复中表示友好。 提前感谢您的帮助!

这是一个如何做到这一点的例子。 实现这一目标的最简单方法是直接在JTable上设置JPopupMenu

 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 columns = new Vector(Arrays.asList("Name", "Age")); Vector> data = new Vector>(); for (int i = 0; i < 50; i++) { Vector row = new Vector(); 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(); } }); } } 

如果您想自动选择右键单击的行,请添加以下代码段:

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

JTable的一个问题是右键单击不会更改行选择。 因此,如果您有一个适用于特定行的Action,则需要在右键单击该行之前先单击该行以显示弹出菜单。

如果要在右键单击的位置选择行,则可以使用如下代码:

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

另一个问题是上下文菜单是动态的,您的解决方案不会根据单击的行来更改菜单

  popupMenu.addPopupMenuListener(new PopupMenuListener() { @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) // juste pour selectionner la row quant on right click, putain de swing de merde { int rowAtPoint = table.rowAtPoint(SwingUtilities.convertPoint(popupMenu, new Point(0, 0), table)); generateTablePopupMenu(rowAtPoint); <<<<<<<<<<<< here SwingUtilities.invokeLater(new Runnable() ...