2

JavaのGUIコードに問題があるようですが、なぜ機能しないのかわかりません。

発生する必要があるのは、マウスがパネルまたはフレームをクリックしたときです。今のところ、パネルとだけ言いましょう。これは単なるテストであるため、最終的にこのコードは別のGUIコンポーネントに実装されますが、最初にこれを機能させたいと思います。ポップアップメニューを表示し、テキストフィールドにフォーカスを設定する必要があります。次に、ユーザーがEnterキーを押すか、テキストフィールドのフォーカスが失われると、ポップアップメニューが非表示になり、テキストが空白または必要なものにリセットされます。

だからこれは私が書いたものです:

public class Test {
    private final JFrame frame = new JFrame();
    private final JPanel panel = new JPanel();
    private final JPopupMenu menu = new JPopupMenu();
    private final JTextField field = new JTextField();
    private final Obj obj;

    //... constructor goes here

    public void test(){
        frame.setSize(new Dimension(200,200));
        field.setColumns(10);
        field.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                obj.method(field.getText());
                menu.setVisible(false);
                field.setText("");
            }
        });
        field.addFocusListener(new FocusListener() {
             public void focusLost(FocusEvent e) {
                 menu.setVisible(false);
                 field.setText("");
             }

             //... focus gained event goes here
        });
        panel.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {
                menu.setLocation(e.getX(), e.getY());
                menu.setVisible(true);
                field.requestFocusInWindow();
            }

            //... other mouse events go here
        });

        menu.add(field);
        frame.getContentPane().add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

ここに書かれているコードでは、クリックした直後にメニューが自動的に非表示になります。画面上で短時間点滅した後、何もしなくても非表示になります。

の出現を除外するようにコードを変更するとmenu.setVisible(false)、テキストフィールドにフォーカスが移ることはありません。

これはJPopupMenuの誤用によるものですか?どこが間違っているのですか?

また、mainまたはObjを省略したことにも注意してください。それらは別のファイルにあり、おそらくこの問題には重要ではありません。Obj.method()は何もせず、mainはTestのコンストラクターとtest()メソッドのみを呼び出します。

4

4 に答える 4

1

getComponentPopupMenuをオーバーライドしてJPopupMenuを返すことにより、これを実行できるはずです。これはあなたが望むように正確に処理する必要があります。フォーカスなどが可能になります。

編集:これは厳密には必要ではありませんが、継承をより適切に行うことができます。

Public JPopupMenu getComponentPopupMenu() {
    return getMenu();
}

ああ、それをマウスクリックで表示したい場合は、マウスリスナーを追加し、ポップアップメニューでshowを呼び出します。

public void processMouseEvent(MouseEvent e) {
    popup.show(this, e.getX(), e.getY());
}

これにより、マウスをクリックすると表示されます。

または、別のオプションは、マウスリスナー(processMouseEventを呼び出す)があり、右クリックでのみ呼び出す場合です。

public void processMouseEvent(MouseEvent e) {
    if (e.isPopupTrigger()) {
        popup.show(this, e.getX(), e.getY());
    }
}

マウスリスナーは次のようになります。

panel.addMouseListener(new MouseAdapter() {
    mouseClicked(MouseEvent e) {
        processMouseEvent(e);
    }
}
于 2009-07-24T19:19:53.840 に答える
1

setComponentPopupMenu()MouseListener を自動的に追加して特定の PopupMenu を表示し、次に右クリック イベントを消費する提案されたメソッドを使用して発見していることを指摘したいと思います。
イベントが消費されるため、構造内にあるif(e.isPopupTrigger())ものは右クリックで実行されることはありません。

したがって、基本的には、追加するだけで質問で指定された動作を取得できますが、mouseClicked だけpanel.setComponentPopupMenu(getMenu())でなく、すべての右クリック イベントを消費しているという事実は非常に制限的です。

于 2009-07-27T18:36:44.413 に答える
0

ポップアップを表示するときは、フォーカスがあるはずです (そしておそらくそれを取得します) 他のものはあまり意味がありません。

メニューが表示され、フォーカスが取得されます。

次のコマンドで、フォーカスをテキストフィールドにトラバースします。ポップアップにはフォーカスがなく、フォーカスのないポップアップは役に立たないため、再び非表示になります。

于 2009-07-24T19:23:00.980 に答える