Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jTable right-click popup menu

Tags:

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.

I want to display the existing records in a table so I am using jTable. I found some code online and modified it to pull the records and display them in a jtable but i dont know how to code the rightclick and display a popup menu.

In that popup menu I want to display options such as delete record and modify record.

This is the code I am using the make the jTable and display the data:

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

I am new to Java so please be kind in your responses. Thank you all in advance for any assistance!

like image 813
Garrett Innovations Avatar asked May 24 '13 20:05

Garrett Innovations


1 Answers

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              }         }); 
like image 67
Guillaume Polet Avatar answered Nov 18 '22 08:11

Guillaume Polet