javaswingpopupjbuttonpopupmenu

JButtons disappear after the popup menu shows


I added listeners to my JButtons for the popup menu but when the popup menu appears the JButtons disappear and I would need to hover my cursor on the buttons to make them appear again. Why is it like this?

(all the methods here are in the same class)

public Inventory() {
    setLayout(null);
    setBounds(0, 0, 175, 210);
    
    initPopupMenu(); // this just sets what is inside the popup menu
    int x;
            // 30 buttons
    for(x = 0; x < 30; x++) {
        button[x] = new JButton();
        add(button[x]);
        button[x].addMouseListener(this);
    }

    x = 0;
            // it's a grid of buttons
    for(int i = 0; i < 5; i++) 
        for(int j = 0; j < 6; j++) {
            button[x].setBounds(i*35+1,j*35+1, 33,33);  
            x++;
        }
    
    
}

public void mouseClicked(MouseEvent e) {
    for(int j = 0; j < 30; j++) // i tried this one but it still disappears
        button[j].repaint();
    
    for(int i = 0; i < 30; i++) {
        if(e.getSource() == button[i]) {
            System.out.println("You pressed Button "+i);
            popup.show(e.getComponent(), e.getX(), e.getY());
        }
        
    }
    
}

This is what happens, jbuttons
(source: uploadir.com)

popup
(source: uploadir.com)


Solution

  • Stop using null Layout, seems like that can be one of the issues regarding this. Your JFrame appears sort of BLACK to me, is this some THEME or a new LOOK AND FEEL you are using, that can be the cause of this thing too. Here check this out, it's working flawlessly here with this code :

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ButtonPopUp
    {
        private static final int SIZE = 30;
        private JButton[] button = new JButton[SIZE];
        private JPopupMenu popup = new JPopupMenu("Hello World");
    
        private void createAndDisplayGUI()
        {
            JFrame frame = new JFrame("Button POP UP Example");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.setLocationByPlatform(true);
    
            final JPanel contentPane = new JPanel();
            contentPane.setLayout(new GridLayout(0, 5));
    
            JMenuItem menuItem1 = new JMenuItem("Menu Item 1");
            JMenuItem menuItem2 = new JMenuItem("Menu Item 2");
            //popup.add(greetings);
            popup.insert(menuItem1, 0);
            popup.insert(menuItem2, 1);
    
            for (int i = 0; i < SIZE; i++)
            {
                button[i] = new JButton();
                button[i].setBorder(BorderFactory.createEtchedBorder());
                button[i].addMouseListener(new MouseAdapter()
                {
                    public void mouseClicked(MouseEvent me)
                    {
                        System.out.println("I am WORKING!!");
                        popup.show((JComponent)me.getSource(), me.getX(), me.getY());
                    }
                });
                contentPane.add(button[i]);
            }
    
            frame.getContentPane().add(contentPane);
            frame.setSize(175, 250);
            frame.setVisible(true);
        }
    
        public static void main(String... args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    new ButtonPopUp().createAndDisplayGUI();
                }
            });
        }
    }
    

    Here is the output :

    Before Event After Event