Слишком маленькая область для JPopupMenu?

В последнем вопросе я спрашивал сообщество, почему мой JPopupMenu не появился на экране.
Я не смог придумать простой, выполнимый, компилируемый пример.
Итак, вот что я сделал для вас, ребята:

  • Область слишком мала, чтобы нарисовать всплывающее окно?

  • Я хочу, чтобы мое всплывающее окно было таким:
    поп Код того, что я сделал, виден на первой фотографии.

    Код:

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

    Полный код можно найти здесь

    редактировать 2

    Я скопировал различные JRadioButtonMenuItem и setupJPopup() в новый файл и побежал. Оно работает. Почему это не работает в классе ScreenRecorder? Код пакета демо;

    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);
    }
    

    1 ответ

    Решение

    Нет, размер JFrame не связано с тем, почему PopupMenu не показывает Вот пример, показывающий что-то похожее на то, что вы хотите (и используя похожие методы) работать:

    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);
        }
    }
    
    Другие вопросы по тегам