2013-05-24 18 views
16

Ich habe eine SQL-Datenbank und ich arbeite an einem Programm, mit dem ich Datensätze hinzufügen/löschen/ändern kann. Ich habe es bereits geschafft, Datensätze hinzuzufügen, die ich gerade bearbeite/lösche.jTable Rechtsklick-Popup-Menü

Ich möchte die vorhandenen Datensätze in einer Tabelle anzeigen, also verwende ich jTable. Ich habe einen Code online gefunden und modifiziert, um die Datensätze zu ziehen und sie in einer Jtable anzuzeigen, aber ich weiß nicht, wie man den Rechtsklick programmiert und ein Popup-Menü anzeigt.

In diesem Popup-Menü möchte ich Optionen wie Datensatz löschen und Datensatz ändern anzeigen.

Dies ist der Code, den ich die die jTable machen verwenden und die Daten anzeigen:

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

Ich bin neu in Java bitte in Ihrer Antwort Art so sein. Vielen Dank im Voraus für jede Hilfe!

+0

Werfen Sie einen Blick auf die geklickt Zeile je an [JComponent # setComponentPopup] (http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#setComponentPopupMenu (javax .swing.JPopupMenu)) – MadProgrammer

+0

Diese Lösung (ähnliche Frage, die hier noch nicht verknüpft ist) hat am besten funktioniert Ich: http://StackOverflow.com/a/17316876/411282 –

Antwort

28

Hier ist ein Beispiel, wie man das macht. Der einfachste Weg, dies zu erreichen, ist ein JPopupMenu auf der JTable direkt zu setzen.

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

Falls Sie wurde die Zeile automatisch auszuwählen, in dem die Rechtsklick gemacht, fügen Sie den folgenden Ausschnitt:

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 

      } 
     }); 
+1

+1, für die Verwendung von setComponentPopupMenu(), so dass Sie sich keine Gedanken über das Schreiben eines MouseListener machen müssen. – camickr

+0

Diese Implementierung löst das Problem in der Frage nicht, da die Informationen verloren gegangen sind, auf welchen Datensatz das Benutzerrecht geklickt hat. (Welchen würden Sie löschen/ändern? Wo in der Tabelle würden Sie hinzufügen?) –

+0

@JoshuaGoldberg Das liegt an Ihnen zu entscheiden, was Sie damit tun wollen. Gewöhnlich würde ich vermuten, dass das Löschen in der ausgewählten Zeile (den ausgewählten Zeilen) stattfinden würde und die Einfügung würde wahrscheinlich hinter der aktuell ausgewählten Zeile liegen. Die Tatsache, dass der Rechtsklick nicht unbedingt die Zeile der JTable selektiert, ist L & F-abhängig. Falls gewünscht, können Sie dies auch erzwingen, indem Sie einen MouseListener hinzufügen, der die Zeilenauswahl mit der rechten Maustaste ändert. Diese Implementierung wird das Problem in der Frage lösen. –

14

Ein Problem mit einem JTable ist, dass das Rechtsklick das nicht ändert Zeilenauswahl Wenn Sie also eine Aktion haben, die für eine bestimmte Zeile funktioniert, klicken Sie mit der linken Maustaste zuerst auf die Zeile, bevor Sie mit der rechten Maustaste klicken, um das Popup-Menü anzuzeigen.

Wenn Sie die Zeile werden sollen, ausgewählt, wo die rechte Seite klicken, dann können Sie Code wie die folgenden verwenden:

ist
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

ein weiteres Problem, dass Kontextmenüs Dynamik, wird Ihre Lösung nicht mit dem Ändern das Menüs beschäftigen

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() 
      ...