2016-01-05 3 views
1

Я написал следующий код, чтобы иметь JPopupMenu, который позволяет несколько вариантов выбора разных элементов. Проблема заключается в том, что, как только мышь входит в одну из отображаемых JCheckboxMenuItems, JPopupMenu закрывается. Эта проблема не возникает, если я заменил JCheckboxMenuItem, например, JLabel, но, конечно же, JLabel не работает для моей цели. Любая идея, что может вызвать эту проблему? Любая идея о том, как можно решить эту проблему лучше? Я прошу прощения за вопрос новичков, но я не разработчик Java. Заранее благодарю за любую помощь.JPopupMenu закрывается, как только мышь входит во встроенный JCheckboxMenuItem

JPanel panel = new JPanel(); 
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedborder(),"Select Layers"); 
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 
for (MyAction layer : layers) { 
    JCheckBoxMenuItem box = new JCheckBoxMenuItem(layer); 
    box.setIcon(new SquareIcon(myColor)); 
    panel.add(box); 
} 

JPopup popup = new JidePopup(); 
popup.add(panel) 

JButton button = new JButton("Layers"); 
button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     popup.show(button,0,button.getHeight()) 
    } 
}); 
+0

Что делает MyAction? – Berger

+0

Идея без вашего SSCCE/MCVE, короткая, runnable, компилируемая – mKorbel

+0

есть причина использовать JPanel, потому что BasicsPopup ... имеет BoxLayout в API по умолчанию, в противном случае использовать JWindow (использовать только одно, HIDE_ON_CLOSE, играя с setVisible (true/false), завернутый в invokeLater) – mKorbel

ответ

1

Thats in the nature of JPopupMenus. Они исчезают, когда компонент invoker теряет фокус. Но я нашел небольшой трюк here.
Создайте свой собственный класс и увеличьте его с JPopupMenu. Затем переопределите метод setVisible, который будет перенаправлять только true на суперкласс и создать собственный метод, который будет setVisible суперкласса в false.

public class StayOpenPopup extends JPopupMenu{ 
    public void setVisible(boolean visible){ 
     if(visible == true) 
      super.setVisible(visible); 
    } 

    public void disappear() { 
     super.setVisible(false); 
    } 
} 

Затем использовать его, как это в вашем коде

[...] 
StayOpenPopup popup = new StayOpenPopup(); 
popup.add(panel); 
[...] 
button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     if(popup.isVisible()) 
      popup.disappear(); 
     else popup.show(button,0,button.getHeight()); 
    } 
}); 

Теперь один щелчок по кнопке покажет. И он останется видимым до следующего щелчка на кнопке.