ドロップダウンスタイルメニューが添付されたJButtonが必要でした。そこで、JPopupMenuを取得し、以下のコードで確認できるようにJButtonにアタッチしました。それがする必要があるのはこれです:
- クリックするとポップアップが表示されます
- もう一度クリックすると非表示になります
- ポップアップでアイテムが選択されている場合は非表示にします
- ユーザーが画面内の別の場所をクリックした場合は非表示にします
これらの4つのことは機能しますが、私が使用しているブールフラグのため、ユーザーが別の場所をクリックしたり、アイテムを選択したりすると、ボタンが再び表示される前にボタンを2回クリックする必要があります。そのため、FocusListener(絶対に応答しない)を追加して修正し、これらの場合にフラグをfalseに設定しようとしました。
編集:回答投稿の最後の試み...
リスナーは次のとおりです(JButtonを拡張するクラスにあるため、2番目のリスナーは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);
}
}