[JTable] Affichage d'un popup sur un JTable vide.
Bonjour,
J'ai besoin d'afficher un JPopupMenu sur une JTable même lorsque celle-ci est vide. Pour y arriver, j'ai surchargé la méthode configureEnclosingScrollPane() de ma JTable :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| @Override
protected void configureEnclosingScrollPane() {
super.configureEnclosingScrollPane();
Container container = getParent();
if ( container instanceof JViewport ) {
JViewport viewport = (JViewport) container;
viewport.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
Component source = (Component) e.getSource();
MouseEvent evt = SwingUtilities
.convertMouseEvent(source, e, JTableClickable.this);
for (MouseListener l : getListeners(MouseListener.class) ) {
l.mouseClicked(evt);
}
}
@Override
public void mousePressed(MouseEvent e) {
Component source = (Component) e.getSource();
MouseEvent evt = SwingUtilities
.convertMouseEvent(source, e, JTableClickable.this);
for (MouseListener l : getListeners(MouseListener.class) ) {
l.mousePressed(evt);
}
}
@Override
public void mouseReleased(MouseEvent e) {
Component source = (Component) e.getSource();
MouseEvent evt = SwingUtilities
.convertMouseEvent(source, e, JTableClickable.this);
for (MouseListener l : getListeners(MouseListener.class) ) {
l.mouseReleased(evt);
}
}
});
}
} |
J'ai ensuite placé le listener suivant sur ma JTable :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| private class InternalTablePopupListener extends MouseAdapter {
private JPopupMenu popup;
public InternalTablePopupListener() {
popup = new JPopupMenu();
popup.add(new AbstractAction("Say plop"){
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("PLOP");
}
});
}
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
protected void maybeShowPopup(MouseEvent e) {
System.out.println("maybeShowPopup : "+e.isPopupTrigger());
if ( e.isPopupTrigger() ) {
popup.setLocation(e.getLocationOnScreen());
popup.setVisible(true);
}
}
} |
Je récupère bien mon évènement lors du click approprié, mon JPopupMenu s'affiche mais pas correctement; Il ne disparait jamais et l'effet de "rollover" est absent. Pourtant les actions sont bien effectuées lorsque je clique dessus.
L'un d'entre vous à t'il une idée ? Pour ma part je suis assez perdu.
Je pensais que la cause venait du MouseEvent qui était produit par le JScrollPane et non pas la JTable mais après avoir convertit l'évènement avec SwingUtilities je constate que celà ne change rien.
Merci de votre aide.