JTable avec JPopupMenu
comment puis-je éviter le déclenchement et montrant JPopupMenu
seulement si est Mouse Cursor
sélectionnées JTable'Row
ma question: si est-il un autre moyen que getBounds
de la ligne sélectionnée et de déterminer la/les comparer avec Mouse
position...
mon simple sscce démontré tout à l'onu voulait à l'opposé, les ligne pourrait être sélectionné et JPopupMenu
est déclenchée à partir de l'ensemble JTable
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableCheckBox extends JFrame {
private static final long serialVersionUID = 1L;
private JTable table;
public TableCheckBox() {
Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
Object[][] data = {
{"Buy", "IBM", new Integer(1000), new Double(80.50), false},
{"Sell", "MicroSoft", new Integer(2000), new Double(6.25), true},
{"Sell", "Apple", new Integer(3000), new Double(7.35), true},
{"Buy", "Nortel", new Integer(4000), new Double(20.00), false}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
createPopupMenu();
}
private void createPopupMenu() {
JPopupMenu popup = new JPopupMenu();
JMenuItem myMenuItem1 = new JMenuItem("cccccccccccccccccccccc");
JMenuItem myMenuItem2 = new JMenuItem("bbbbbbbbbbbbbbbbbbbbbb");
popup.add(myMenuItem1);
popup.add(myMenuItem2);
MouseListener popupListener = new PopupListener(popup);
table.addMouseListener(popupListener);
}
private class PopupListener extends MouseAdapter {
private JPopupMenu popup;
PopupListener(JPopupMenu popupMenu) {
popup = popupMenu;
}
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
if (table.getSelectedRow() != -1) {
maybeShowPopup(e);
}
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TableCheckBox frame = new TableCheckBox();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
});
}
}
source d'informationauteur mKorbel
Vous devez vous connecter pour publier un commentaire.
C'est une question intéressante, car elle met en lumière manquante de l'api sur JComponent 🙂
Comme nous le savons tous, il est recommandé d'enregistrer popupMenus est d'utiliser le componentPopupMenu de la propriété. Liées api est
ce qui manque (et effectivement nécessaires pour répondre à cette exigence) est
ce manque est d'autant plus ennuyeux, comme le getPopupLocation est appelé (par AWTEventHelper profond dans le LAF) après getComponentPopup(). Donc il n'y a pas de marge de manœuvre pour un hack comme le stockage, le dernier événement de souris qui pourrait avoir déclenché la popup et de décider ensuite qui/si le retour popup. Et de retourner la valeur null pour l'emplacement n'aura qu'à montrer à la position de la souris
Le seul (sale) hack (autour de ma grande réticence à me salir les mains avec un MouseListener 😉 est à remplacer getComponentPopup et décider si ou de ne pas le retourner basé sur la position actuelle de la souris
l'effet secondaire est que pop-up indiquant n'est pas déclenchée par le clavier aussi longtemps que la souris n'importe où au-dessus de la table, qui peut être ou ne pas être un problème.
Vous êtes à la recherche de quelque chose comme ceci peut-être?
Pour afficher popup sur la ligne sélectionnée(s) seulement
Ou, à l'inverse, pour éviter popup d'afficher plus de lignes sélectionnées uniquement: