Мне нужен JButton с приложением выпадающего меню. Поэтому я взял JPopupMenu и привязал его к JButton так, как вы можете видеть в коде ниже. Что нужно сделать, это:Отображение/скрытие JPopupMenu из JButton; FocusListener не работает?
- показать всплывающее окно при нажатии
- скрыть его, если нажата второй раз
- скрыть это, если элемент выбран во всплывающем окне
- скрыть его, если пользователь клики в другом месте на экране
Эти 4 вещи работают, но из-за булевого флага, который я использую, если пользователь щелкает в другом месте или выбирает элемент, я должен дважды щелкнуть по кнопке, прежде чем она покажет снова. Вот почему я попытался добавить FocusListener (который абсолютно не отвечает), чтобы исправить это и установить флаг false в этих случаях.
EDIT: Последняя попытка в ответ сообщение ...
Вот слушатели: (. Это в классе, простирающейся JButton, поэтому второй слушатель находится на JButton)
// Show popup on left click.
menu.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
System.out.println("LOST FOCUS");
isShowingPopup = false;
}
@Override
public void focusGained(FocusEvent e) {
System.out.println("GAINED FOCUS");
}
});
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("isShowingPopup: " + isShowingPopup);
if (isShowingPopup) {
isShowingPopup = false;
} else {
Component c = (Component) e.getSource();
menu.show(c, -1, c.getHeight());
isShowingPopup = true;
}
}
});
Я уже давно сражаюсь с этим. Если кто-то может дать мне понять, что с этим не так, было бы здорово!
Спасибо!
Код:
public class Button extends JButton {
// Icon.
private static final ImageIcon ARROW_SOUTH = new ImageIcon("ArrowSouth.png");
// Unit popup menu.
private final JPopupMenu menu;
// Is the popup showing or not?
private boolean isShowingPopup = false;
public Button(int height) {
super(ARROW_SOUTH);
menu = new JPopupMenu(); // menu is populated somewhere else
// FocusListener on the JPopupMenu
menu.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
System.out.println("LOST FOCUS");
isShowingPopup = false;
}
@Override
public void focusGained(FocusEvent e) {
System.out.println("GAINED FOCUS");
}
});
// ComponentListener on the JPopupMenu
menu.addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {
System.out.println("SHOWN");
}
@Override
public void componentResized(ComponentEvent e) {
System.out.println("RESIZED");
}
@Override
public void componentMoved(ComponentEvent e) {
System.out.println("MOVED");
}
@Override
public void componentHidden(ComponentEvent e) {
System.out.println("HIDDEN");
}
});
// ActionListener on the JButton
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("isShowingPopup: " + isShowingPopup);
if (isShowingPopup) {
menu.requestFocus();
isShowingPopup = false;
} else {
Component c = (Component) e.getSource();
menu.show(c, -1, c.getHeight());
isShowingPopup = true;
}
}
});
// Skip when navigating with TAB.
setFocusable(true); // Was false first and should be false in the end.
menu.setFocusable(true);
}
}
Итак, главная проблема, с которой я сталкиваюсь, заключается в том, что focusGained() и focusLost() никогда не запускаются, хотя я продолжаю создавать всплывающее окно и исчезать. – Joanis