J'ai créé JFrame, définissez une couleur transparente (new Color (0, 0, 0, 0)) en arrière-plan et placez-y JPanel. J'ai surchargé la méthode paintComponent de JPanel et dessine une image avec un canal alpha dessus. Aussi, je montre le menu contextuel lorsque l'utilisateur clique droit sur mon JPanel.Problèmes avec JFrame transparent
Et j'ai été confronté au fait que l'image du menu pop-up reste sur le JFrame après qu'il devrait disparaître (juste maintenant l'image d'un JPanel le couvre). Si je comprends bien, JFrame n'est pas effacé avant de dessiner un nouveau cadre.
Exemple
public class MainWindow extends JFrame {
private MyPanel widget = new MyPanel();
private Action quitAction = new AbstractAction("Quit") {
@Override
public void actionPerformed(ActionEvent actionEvent) {
setVisible(false);
dispose();
}
};
private MainWindow() {
super();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setUndecorated(true);
setBackground(new Color(0, 0, 0, 0));
widget.loadImage("image.png");
setContentPane(widget);
pack();
setAlwaysOnTop(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(() -> {
MainWindow window = new MainWindow();
window.setVisible(true);
});
}
class MyPanel extends JPanel implements MouseListener {
BufferedImage image;
MyPanel() {
super();
addMouseListener(this);
}
@Override
protected void paintComponent(Graphics g) {
super.paintCompontent(g);
if (characterImage != null) {
g.drawImage(characterImage, 0, 0, this);
}
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
clickPos = e.getLocationOnScreen();
if (SwingUtilities.isRightMouseButton(e)) {
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(quitAction);
popupMenu.show(this, e.getX(), e.getY());
}
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
boolean loadImage(String name) {
BufferedImage backupImage = image;
try {
image = ImageIO.read(MainWindow.class.getResourceAsStream("/images/" + name));
setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
} catch (IOException ex) {
image = backupImage;
return false;
}
return true;
}
}
}
Vous avez également oublié de fournir un [exemple exécutable] (https://stackoverflow.com/help/mcve) qui illustre votre problème. Ce n'est pas un vidage de code, mais un exemple de ce que vous faites qui met en évidence le problème que vous rencontrez. Cela entraînera moins de confusion et de meilleures réponses – MadProgrammer
Je "devine" que soit vous n'appelez pas 'super.paintComponent' et/ou vous utilisez une couleur alpha pour définir l'arrière-plan du panneau – MadProgrammer
*" Si je comprends bien, JFrame n'est pas effacé avant de dessiner un nouveau cadre. "* - Seulement si vous honorez la chaîne de peinture et assurez-vous que lorsque vous substituez des méthodes de peinture, vous appelez leurs super méthodes (et vous n'essayez pas d'appliquer une couleur alpha à un panneau opaque) – MadProgrammer