Search code examples
javaswingpopupjframejpopupmenu

Is the area too small for JPopupMenu?


In the last question I was asking the community why my JPopupMenu did not appear on the screen.
I was unable to come up with a simple , runnable, compilable example.
So, here is what I did for you guys:
enter image description here

  • Is the area too small to draw a popup?

  • I want my popup to be like this:
    pop The code of what I did is visible in the first photo.

    Code:

    /* The old code entered here has been removed */
    

    Complete code can be found here

    edit 2

    I copied the various JRadioButtonMenuItem and the setupJPopup() into a new file and ran. It works. Why doesn't it work in ScreenRecorder class? Code package demo;

    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    import javax.swing.ButtonGroup;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuItem;
    import javax.swing.JPopupMenu;
    import javax.swing.JRadioButtonMenuItem;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    
    public class PopupTrial {
    
    
        public PopupTrial(){
            setupJPopup();
            JFrame frame = new JFrame();
            try{
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            }catch(Exception e){
    
            }
            frame.getContentPane().add(label);
            label.addMouseListener(new MouseAdapter(){
                @Override
                public void mouseClicked(MouseEvent e){
                    popup.show(e.getComponent(), e.getX(), e.getY());
                }
            });
            frame.setVisible(true);
            frame.setSize(300, 300);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                @Override
                public void run(){
                    new PopupTrial();
                }
            });
        }
        public void setupJPopup(){
            encodingGroup.add(avi);
            encodingGroup.add(quicktime);
    
            popup.add(avi);
            popup.add(quicktime);
            popup.addSeparator();
    
            recordingAreaGroup.add(entireScreen);
            recordingAreaGroup.add(custom);
    
            popup.add(entireScreen);
            popup.add(custom);
            popup.addSeparator();
    
            cursorGroup.add(selectBlackCursor);
            cursorGroup.add(selectWhiteCursor);
            cursorGroup.add(selectNoCursor);
    
            selectCursor.add(selectBlackCursor);
            selectCursor.add(selectWhiteCursor);
            selectCursor.add(selectNoCursor);
    
            popup.add(selectCursor);
            popup.pack();
        }
        JLabel label = new JLabel("Click Me");
        ButtonGroup recordingAreaGroup = new ButtonGroup();
        ButtonGroup cursorGroup = new ButtonGroup();
        ButtonGroup encodingGroup = new ButtonGroup();
        JPopupMenu popup = new JPopupMenu();
        JRadioButtonMenuItem avi = new JRadioButtonMenuItem("AVI",true);
        JRadioButtonMenuItem quicktime = new JRadioButtonMenuItem("QuickTime",false);
        JRadioButtonMenuItem entireScreen = new JRadioButtonMenuItem("Entire Screen",true);
        JRadioButtonMenuItem custom = new JRadioButtonMenuItem("Custom...",false);
        JMenuItem selectCursor = new JMenu("Select a cursor");
        JRadioButtonMenuItem selectWhiteCursor = new JRadioButtonMenuItem("White Cursor",true);
        JRadioButtonMenuItem selectBlackCursor = new JRadioButtonMenuItem("Black Cursor",false);
        JRadioButtonMenuItem selectNoCursor = new JRadioButtonMenuItem("No Cursor",false);
    }
    

    enter image description here


    Solution

  • No, the size of the JFrame isn't related to why the PopupMenu isn't showing. Here's an example showing something similar to what you want (and using similar methods) working:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class PopupMenu extends Box{
    
        Dimension preferredSize = new Dimension(400,30);
    
        public PopupMenu(){
            super(BoxLayout.Y_AXIS);
    
            final JPopupMenu menu = new JPopupMenu("Options");
            for(int i = 1; i < 20; i++)
                menu.add(new JMenuItem("Option" + i));
    
            JLabel clickMe = new JLabel("ClickMe");
        clickMe.setAlignmentX(RIGHT_ALIGNMENT);
            clickMe.addMouseListener(new MouseAdapter(){
    
                @Override
                public void mouseClicked(MouseEvent e) {
                    menu.show(e.getComponent(), e.getX(), e.getY());
                }});
    
            add(clickMe);       
        }
    
        public Dimension getPreferredSize(){
            return preferredSize;
        }
    
        public static void main(String[] args) {
    
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setContentPane(new PopupMenu());
            frame.validate();
            frame.pack();
            frame.setVisible(true);
        }
    }