Ich versuche gerade eine JPopupMenu
anzuzeigen, wenn Sie mit der rechten Maustaste auf eine JTable
klicken. Ich habe dies bereits auf verschiedene Arten erreicht, aber keiner von ihnen erlaubt mir zu tun, worum es in dieser Frage geht: Code ausführen, nachdem ich mit der rechten Maustaste auf den Tisch geklickt habe, aber das Popup-Menü erscheint auf dem Bildschirm.etwas tun, wenn Sie mit der rechten Maustaste außerhalb von JPopupMenu (UIManager-Problem) klicken
Wenn das Popup-Menü angezeigt wird und ich mit der rechten Maustaste darauf klicke, wird es an anderer Stelle wieder geöffnet. Es muss also ein Zuhörer in ihm sein, der ihm sagt, dass er das tun soll, aber ich kann es nicht finden. Im Idealfall würde ich @Override
es und führen Sie den gleichen Code, den ich ausführe, wenn ich mit der rechten Maustaste auf die JTable.
Also, um die Frage zusammenzufassen, wie trigger ich etwas Code, wenn ich mit der rechten Maustaste außerhalb des Menüs (oder auf einer Tabellenzelle zum Beispiel), wenn das Menü immer noch Fokus hat (oder angezeigt wird)?
EDIT: Nach genauerem Hinsehen erkannte ich das Problem, aber nicht die Lösung. Die JPopupMenu
ist nicht das Problem, aber die UIManager
. Hier ist der Code meiner Testform, die das Problem zeigt ich beschreibe:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.UnsupportedLookAndFeelException;
public class PopupTesting extends javax.swing.JFrame {
public PopupTesting() {
initComponents();
}
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mousePressed(java.awt.event.MouseEvent evt) {
jTable1MousePressed(evt);
}
});
jScrollPane1.setViewportView(jTable1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(61, 61, 61)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(83, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(69, 69, 69)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 267, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(121, Short.MAX_VALUE))
);
pack();
}
private void jTable1MousePressed(java.awt.event.MouseEvent evt) {
if (SwingUtilities.isRightMouseButton(evt)) {
jTable1.setRowSelectionInterval(jTable1.rowAtPoint(evt.getPoint()), jTable1.rowAtPoint(evt.getPoint()));
getPopup().show(jTable1, evt.getX(), evt.getY());
}
}
public static void main(String args[]) {
try {
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
Logger.getLogger(PopupTesting.class.getName()).log(Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(() -> {
new PopupTesting().setVisible(true);
});
}
private JPopupMenu getPopup() {
if (jTable1.getSelectedRow() > -1) {
JPopupMenu popup = new JPopupMenu();
MouseListener listener = (new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
System.out.println("I'm a menu Item.");
}
});
JMenuItem m = new JMenuItem("Regular Menu Item");
m.addMouseListener(listener);
popup.add(m);
return popup;
} return null;
}
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
}
Wenn Sie die Zeile entfernen:
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
und die umliegende try
und catch
, es einwandfrei funktioniert.
Der "normale" Weg, um ein Popup anzuzeigen, ist durch ['JComponent # setComponentPopupMenu'] (https://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#setComponentPopupMenu (javax.swing.JPopupMenu)), können Sie einen 'PopupMenuListener' verwenden, um den Status des Popups zu überwachen, aber ich bin mir nicht ganz sicher, ob Ihnen das helfen kann. Sie möchten etwas unternehmen, wenn der Benutzer versucht, irgendwo anders mit der rechten Maustaste zu klicken, während das Popup noch sichtbar ist? – MadProgrammer
@MadProgrammer Wenn Sie mit den von Windows verwendeten Popup-Menüs herumspielen, wenn Sie irgendwo anders klicken und das Menü auf dem Bildschirm angezeigt wird, wird sowohl das Click-Ereignis als auch das Click-Ereignis, auf das Sie klicken wollten, ausgelöst. JPopupMenu macht das nicht, es schließt nur und löst nicht aus. Ich möchte, dass es sich wie das Windows-Popup-Fenster verhält. – RaKXeR