Установка прозрачного фона JFrame, делая PopupMenu пустым

Мой вопрос похож на это, но я думаю, что есть более простой пример.

В основном по телефону AWTUtilities.setWindowOpaque(window, false) чтобы сделать фон JFrame прозрачным, мое JPopupMenu иногда отображается пустым.

public class JavaApplication8 {

    JPopupMenu popup;
    JMenuItem open;
    JLabel bgLabel = new JLabel("testing");

    public static void main(String[] args) {
        // TODO code application logic here

        JFrame window = new JFrame("test");

        URL bgURL = JavaApplication8.class.getResource("images/bg.jpg");
        ImageIcon bg = new ImageIcon(bgURL);

        JavaApplication8 test = new JavaApplication8();
        test.setPopupMenu();
        test.bgLabel.setIcon(bg);

        window.add(test.bgLabel, BorderLayout.CENTER);

        window.setUndecorated(true);
        AWTUtilities.setWindowOpaque(window, false);        
        //window.pack();
        window.setSize(200, 200);
        window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        window.setLocationRelativeTo(null);
        window.setVisible(true);

    }

    public void setPopupMenu(){
        popup = new JPopupMenu();
        open = new JMenuItem("Test");

        popup.add(open);
        this.bgLabel.setComponentPopupMenu(popup);     
    }

}

Вот изображение того, что происходит:

введите описание изображения здесьвведите описание изображения здесь

Интересно то, что это происходит всякий раз, когда я нажимаю на правую сторону JFrame. Не уверен почему. Имейте в виду, я не уверен на 100%, что AWTUtilities.setWindowOpaque(window, false) действительно является причиной этой проблемы, однако всякий раз, когда я удаляю эту строку, все идет нормально.

РЕДАКТИРОВАТЬ: Как указано camickr, looks like this happens when the popup menu is not fully contained in the bounds of the parent window.

2 ответа

Решение

Фон: я не уверен, почему использование прозрачных / полупрозрачных фонов вызывает проблемы с всплывающими окнами с большим весом и как они рисуют, но это происходит - независимо от того, используете ли вы или нет AWTUtilities.setWindowOpaque(window, false) или же frame.setBackground(new Color(0, 0, 0, 0)),

HeavyWeightPopupСоздается, когда всплывающее окно не помещается полностью в целевом окне. Итак, +User2280704, ваша проблема также появится, если вы нажмете в самом низу вашего окна. LightWeightPopupУ них нет этой проблемы - следовательно, меню работает в середине вашего окна.

Кроме того, интересно отметить, что обычно меню отображается нормально в первый раз, но не в следующий раз.

Ответ: я нашел обходной путь, который вызывает перерисовку после любого отображения всплывающих окон. Просто запустите следующий код при запуске приложения.

PopupFactory.setSharedInstance(new PopupFactory() 
{
    @Override
    public Popup getPopup(Component owner, final Component contents, int x, int y) throws IllegalArgumentException
    {
        Popup popup = super.getPopup(owner, contents, x, y);
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                contents.repaint();
            }
        });
        return popup;
    }
});

это происходит всякий раз, когда я нажимаю на правую сторону JFrame

Похоже, это происходит, когда всплывающее меню не полностью содержится в границах родительского окна. Не знаю, как это исправить.

В Java 7 вы можете использовать:

frame.setBackground(new Color(0, 0, 0, 0));

для прозрачности.

Другие вопросы по тегам