bonsoir,

Je cherche a afficher un menu que j'ai créé moi même à l'aide du PopUpFactory. je n'est pas de problème pour faire ce que je veux, à savoir l'utilisation des classes Popup et PopupFactory avec transparence.

Le problème est que le remplacement du popUpFactory par un nouveau que je crée moi même, ben tout modifie le PopupFactory du SDK java. c'est à dire que tous les menus popup de mon appli Bug, même les composants de base de java comme JComboBox (impossible de sélectionner un autre Item que celui sélectionné par défaut).

Voici le code des deux classes du popup:

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
40
41
42
 
import com.sun.awt.AWTUtilities;
import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.JToolTip;
import javax.swing.JWindow;
import javax.swing.Popup;
 
class TranslucentPopup extends Popup {
 
    private final JWindow popupWindow;
 
    public TranslucentPopup(Component owner, Component contents, int x, int y) {
        // create a new heavyweight window
        this.popupWindow = new JWindow();
        // mark the popup with partial opacity
        AWTUtilities.setWindowOpacity(popupWindow,
                (contents instanceof JToolTip) ? 0.0f : 1.0f);
        // determine the popup location
        popupWindow.setLocation(x, y);
        // add the contents to the popup
        popupWindow.getContentPane().add(contents, BorderLayout.CENTER);
        contents.invalidate();
    }
 
    @Override
    public void show() {
        this.popupWindow.setVisible(true);
        this.popupWindow.pack();
        // mark the window as non-opaque, so that the
        // shadow border pixels take on the per-pixel
        // translucency
        AWTUtilities.setWindowOpaque(this.popupWindow, false);
    }
 
    @Override
    public void hide() {
        this.popupWindow.setVisible(false);
        this.popupWindow.removeAll();
        this.popupWindow.dispose();
    }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
import java.awt.Component;
import javax.swing.Popup;
import javax.swing.PopupFactory;
 
public class TranslucentPopupFactory extends PopupFactory {
 
    @Override
    public Popup getPopup(Component owner, Component contents, int x, int y) throws IllegalArgumentException {
        return new TranslucentPopup(owner, contents, x, y);
    }
}
Dans le constructeur de mon composant du menu, j'ai fait ça:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
        PopupFactory.setSharedInstance(new TranslucentPopupFactory());
Ensuite pour afficher mon Popup j'utilise:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
newPopup = PopupFactory.getSharedInstance().getPopup(this.getRootPane(), this, this.getX(), this.getY());
newPopup.show();
et pour le cacher:

Mon menu fonctionne parfaitement avec ce que j'ai montré là dessus..
Si vous avais une explication, merci d'avance