Wie JPopupMenu verschwindenden bei der Überprüfung Kontrollkästchen in sie verhindern?
-
04-10-2019 - |
Frage
Ich möchte JCheckBoxMenuItem
s in einem JPopupMenu
verwenden. Es funktioniert, aber das Problem ist, dass das Popup-Menü verschwindet, wenn ein Checkbox Element aktiviert oder deaktiviert wurde. Also, wenn man will / deaktivieren mehrere Einzelteile überprüfen, um die Popup-Bedarf wiederholt gestartet werden, was reizt.
Seltsamerweise, wenn ich einfach nur JCheckBox
Elemente im Menü verwenden (anstelle von JCheckBoxMenuItem
s) ist das Verhalten so wie es sein soll: die Popup-Aufenthalte dort und die Kontrollkästchen können aktiviert / deaktiviert werden. Ist das erledigt, kann das Popup nur geschlossen werden, indem man außerhalb klicken.
Wie mache ich das Popup wie zu verhalten, dass, wenn die Elemente dort JCheckBoxMenuItem
s sind? Ich würde es vorziehen JCheckBoxMenuItem
s wegen ihres Aussehens verwendet wird.
Lösung
Nun, gefunden Antwort Arbeiten von http://forums.sun.com/thread. JSPA? threadID = 5432911 . Grundsätzlich erstellen Sie eine benutzerdefinierte UI:
public class StayOpenCheckBoxMenuItemUI extends BasicCheckBoxMenuItemUI {
@Override
protected void doClick(MenuSelectionManager msm) {
menuItem.doClick(0);
}
public static ComponentUI createUI(JComponent c) {
return new StayOpenCheckBoxMenuItemUI();
}
}
Und legen Sie es in der JCheckBoxMenuItem
:
myJCheckBoxMenuItem.setUI(new StayOpenCheckBoxMenuItemUI());
Sie wissen nicht, ob dies die eleganteste mögliche Lösung ist, aber funktioniert perfekt.
Andere Tipps
Ich lief in ein Problem mit dem schönen Joonas Pulakka Antwort, weil die „UIManager LookAndFeel“ ignoriert wurde.
fand ich eine netten Trick unten auf http: // tips4java. wordpress.com/2010/09/12/keeping-menus-open/
Der Punkt ist, sofort das Menü wieder zu öffnen, nachdem sie geschlossen wurde, es ist unsichtbar und halten Sie die Anwendung Erscheinungsbild und Verhalten.
public class StayOpenCBItem extends JCheckBoxMenuItem {
private static MenuElement[] path;
{
getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
if (getModel().isArmed() && isShowing()) {
path = MenuSelectionManager.defaultManager().getSelectedPath();
}
}
});
}
public StayOpenCBItem(String text) {
super(text);
}
@Override
public void doClick(int pressTime) {
super.doClick(pressTime);
MenuSelectionManager.defaultManager().setSelectedPath(path);
}
}