У меня есть эта странная ошибка с моим всплывающим меню. Это случается редко и, казалось бы, случайно. Проблема в том, что у меня есть подменю в JPopupMenu - когда я выбираю подменю, главное меню исчезает и подменю отображается неправильно (это похоже на то, как буфер главного меню закрашивается над подменю). Я все еще могу перемещаться по нему с помощью клавиатуры.
Вот несколько скриншотов:
Вот так это должно выглядеть
![alt text](https://i.stack.imgur.com/9dkhr.png)
А вот так выглядит ошибка при появлении ошибки:
![alt text](https://i.stack.imgur.com/t5VWX.png)
Итак, этот глюк на втором изображении - это то место, где должно быть подменю.
Что могло вызвать это? Нет никаких исключений, это не похоже на платформу, поэтому я не знаю, как это сузить. Пожалуйста, помогите.
РЕДАКТИРОВАТЬ Ниже приводится сцена, которая воспроизводит проблему:
import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class Test {
private static Popup popup;
public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
showMenu(e);
}
@Override
public void mouseReleased(MouseEvent e) {
showMenu(e);
}
private void showMenu(final MouseEvent e) {
if (e.isPopupTrigger()) {
JPopupMenu menu = new JPopupMenu();
JMenu subMenu = new JMenu("SubMenu");
menu.add(subMenu);
subMenu.add("Item 1");
subMenu.add("Item 2").addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
hidePopup();
// this is where I call the hide twice, in my case it was
// caused by some action or mouse listener calling it twice
hidePopup();
showPopup(e, frame);
}
});
subMenu.add("Item 3");
menu.show(frame.getContentPane(), e.getX(), e.getY());
}
}
private void showPopup(MouseEvent e, JFrame frame) {
PopupFactory popupFactory = PopupFactory.getSharedInstance();
JToolTip toolTip = new JToolTip();
toolTip.setTipText("wfkwdlpfhd ");
popup = popupFactory.getPopup(frame, toolTip, e.getXOnScreen(), e.getYOnScreen());
popup.show();
}
private void hidePopup() {
if (popup != null)
popup.hide();
}
});
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}