0

JFrame に含まれる JPanel ごとにバインドを追加したので、Wキーを押したときに少なくとも 1 つの JPanel が起動すると想定していました。私はKeyStroke間違っていますか?

SSCCE:

public class TestTemp extends JFrame {

    public TestTemp() {
        setSize(1000, 800);

        JPanel parentPanel = new JPanel(new MigLayout("", "grow, fill",
                "grow, fill"));
        parentPanel.setBackground(Color.GREEN);
        setContentPane(parentPanel);
        parentPanel.setSize(1000, 800);

        JPanel videoPanel = new JPanel();
        videoPanel.setBackground(Color.CYAN);

        JPanel contentPanel = new JPanel();
        contentPanel.setLayout(new MigLayout("fillx", "[fill]", "[nogrid]"));
        contentPanel.setBackground(Color.YELLOW);

        parentPanel.getInputMap().put(KeyStroke.getKeyStroke("W"), new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("W pressed, parent panel");          
            }                   
        });     

        contentPanel.getInputMap().put(KeyStroke.getKeyStroke("W"), new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("W pressed, content panel");         
            }                   
        });

        videoPanel.getInputMap().put(KeyStroke.getKeyStroke("W"), new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("W pressed, video panel");           
            }                   
        });

        parentPanel.add(videoPanel, "wmin 200");
        parentPanel.add(contentPanel);
    }


    public static void main(String[] args) {
        JFrame frame = new TestTemp();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

parentPanel編集:次を使用してフォーカスを与えようとしました:

parentPanel.setFocusable(true);
parentPanel.requestFocus();

しかし、それは何の効果もないように見えました。

編集2:それが間違ったキーストロークではないことを確認するために、ドキュメントが例で示したキーストロークを使用しました:

KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)

しかし、繰り返しますが、ヒットEnterしても効果はありませんでした。

4

1 に答える 1

0

これを試して:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import net.miginfocom.swing.MigLayout;

public class T extends JFrame {

    public T() {
        setSize(1000, 800);

        JPanel parentPanel = new JPanel(new MigLayout("", "grow, fill",
                "grow, fill"));
        parentPanel.setBackground(Color.GREEN);
        getContentPane().add(parentPanel);
        parentPanel.setSize(1000, 800);

        JPanel videoPanel = new JPanel();
        videoPanel.setBackground(Color.CYAN);

        JPanel contentPanel = new JPanel();
        contentPanel.setLayout(new MigLayout("fillx", "[fill]", "[nogrid]"));
        contentPanel.setBackground(Color.YELLOW);

        parentPanel.getActionMap().put("enter", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Enter pressed, parent panel");
            }
        });

        InputMap inputMap = parentPanel.getInputMap();
        inputMap.put( KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "enter");

        parentPanel.add(videoPanel, "wmin 200");
        parentPanel.add(contentPanel);
    }


    public static void main(String[] args) {
        JFrame frame = new T();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

MigLayout が問題だとは思いません。

  1. アクション イベントを待機するgetActionMap代わりに使用します。getInputMap
  2. InputMapキーストロークをリッスンするために を分離します。

enterキーボード イベントが標準出力に書き込まれるようになりました。

詳細については、次のリンクを参照してください。

一般的に言えば、難しい問題に遭遇したときは、最も単純なケースを機能させるようにしてください。最も単純なケース (たとえば、キーボード入力を受け入れる 1 つのパネル) が動作するようになったら、次に複雑なものを作成します。たとえば、キーボード入力に影響を与えているかどうかを確認するために、MigLayout を削除することもできます。

于 2013-01-25T22:07:19.773 に答える