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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.