カスタム コンポーネントでスイング ポップアップを表示する必要があります。ポップアップは、自分で非表示にするまで表示されたままにする必要がありますが、フォーカスを得るべきではありません。
次の方法でそれを行う他の開発者によって書かれたコードがあります。
       popupMenu = new JPopupMenu();
       popupMenu.add(myCustomComponent, BorderLayout.CENTER);
       popupMenu.setFocusable(false);
       popupMenu.setVisible(true);
       popupMenu.show(parentComponent, x, y);
これは機能しているように見えますが、バグがあります。ポップアップが表示されている場合、コンポーネントの外側で最初にマウスをクリックすると、ポップアップによって消費されます。したがって、フォーカスを別のコンポーネントに設定するには、2 回クリックする必要があります。
どうすれば修正できますか?または、ポップアップを作成する正しい方法は何ですか?
アップデート
最後に、短いコードフラグメントで問題を再現することができました。出発点を与えてくれた Guillaume Polet に感謝します。
コードは次のとおりです。
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class TestJPopup {
    protected void initUI() {
        JFrame frame = new JFrame(TestJPopup.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JTextField textField = new JTextField("Some text field");
        frame.add(textField, BorderLayout.WEST);
        final JButton buttonToHit = new JButton("Hit me");
        buttonToHit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(buttonToHit, "You hit the button successfully");
            }
        });
        frame.add(buttonToHit);
        frame.setSize(200, 100);
        frame.setVisible(true);
        final JPopupMenu popup = new JPopupMenu();
        popup.add(new JLabel("<html>Hey!<br>I'm the popup window!</html>"),
                BorderLayout.NORTH);
        popup.setFocusable(false);
        popup.setVisible(true);
        popup.show(textField, 60, 60);
        // I want to activate popup when user clicks in the text field
        textField.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (popup != null) {
                    popup.show(textField, 60, 60);
                }
            }
        });
    }
    public static void main(String[] args) throws Exception {
        Class lnfClass = Class.forName("com.sun.java.swing.plaf.windows.WindowsLookAndFeel", true,
                Thread.currentThread().getContextClassLoader());
        LookAndFeel feel = (LookAndFeel) lnfClass.newInstance();
        UIManager.setLookAndFeel(feel);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestJPopup().initUI();
            }
        });
    }
}
2 つの重要な瞬間:
- Windows のルック アンド フィールを使用 (デフォルトでは再現不可能)
- メイン フレームのテキスト フィールドに接続されたマウス リスナー