Установка прозрачного фона 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));
для прозрачности.