2
import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

public class Game extends JPanel{
private static JFrame primary= new JFrame("Game");
private JButton x1;

public Game(){
    x1= new JButton("YES");
    x1.addActionListener(new LevelChoice(1));
    add(x1);
}

public static void setScreen(JPanel jp){


    //primary.removeAll();
    //System.out.println("hi");
    //primary.revalidate();
    //primary.repaint();

}

public static void main(String[] args){

    primary.setPreferredSize(new Dimension(1000, 700));
    /*primary.add(new LevelHUD("xxxxxxxxxxxxxxxxxxxx" +
            "xoooooooooooooooooox" +
            "xoooooooooooooooooox" +
            "xooomoooooooooooooox" +
            "xoooooooooxoooooooox" +
            "xoooooooooxooooomoox" +
            "xoooommoooxxxxooooox" +
            "xoooomooooooooooooox" +
            "xoooomooomooooooooox" +
            "xooomooooolooomoooox" +
            "xoooomcoooooooooooox" +
            "xooomococoooooooooox" +
            "xooomocoooloooooooox" +
            "xgoomocoooooooooooox" +
            "xcooooogooooooooooox" +
            "xocooooocoooooooooox" +
            "xoococooolooogooooox" +
            "xoooooooooooooooooox" +
            "xxxxxxxxxxxxxxxxxxxx"));*/

    primary.add(new Game());



    primary.setResizable(false);
    primary.setVisible(true);
    primary.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    primary.pack();
}

private class LevelChoice implements ActionListener{

    private int level;

    public LevelChoice(int i){
        level=i;
    }

    public void actionPerformed(ActionEvent e) {
        //Game.setScreen(new LevelHUD(gamelevel1));
        primary.add(new LevelHUD("xxxxxxxxxxxxxxxxxxxx" +
                "xoooooooooooooooooox" +
                "xoooooooooooooooooox" +
                "xooomoooooooooooooox" +
                "xoooooooooxoooooooox" +
                "xoooooooooxooooomoox" +
                "xoooommoooxxxxooooox" +
                "xoooomooooooooooooox" +
                "xoooomooomooooooooox" +
                "xooomooooolooomoooox" +
                "xoooomcoooooooooooox" +
                "xooomococoooooooooox" +
                "xooomocoooloooooooox" +
                "xgoomocoooooooooooox" +
                "xcooooogooooooooooox" +
                "xocooooocoooooooooox" +
                "xoococooolooogooooox" +
                "xoooooooooooooooooox" +
                "xxxxxxxxxxxxxxxxxxxx"));
        revalidate();

    }

}


}

わかりましたので、約 12 のクラス atm を持つゲームがありますが、詳細には触れません。私のゲームには、キー リスナーを介して矢印キーを使用したプレーヤーの移動が含まれます。これが私のメイン クラスです。私は、人がレベル A またはレベル B でプレイしたいレベルを選択できるようにしようとしています。次に、ユーザーがプレイするゲームレベルを含む JPanel を追加します。ゲームレベルを追加するとメインメソッド、すべて正常に動作します!

ボタンをクリックして JPanel を追加すると、プレイヤーは動けなくなります。レベル内のすべてのモンスターは完全に機能します。

何かご意見は?ButtonListener は KeyListener などをオーバーライドしますか? ところで、setFocusable はすでにゲーム レベル パネル クラスで true に設定されているため、それが問題になるとは思えません。

4

1 に答える 1

0

KeyListenersボタンをクリックすると、フォーカスが変更され、キーがコンポーネントに「送信」されなくなります。

選択肢は 2 つあります。コードを変更してキー バインドを使用するか (推奨)、requestFocusInWindowキー イベントを受信するパネルで呼び出します。

例で更新

コアの問題を示す簡単な例。でコンポーネントにフォーカスを戻す必要がありKeyListenerます。子コンポーネントまたは親コンポーネントにフォーカスするだけでは十分ではありません。

フォーカス リクエストが EDT 内で行われていることを確認する必要があります。そうしないと、盗まれる可能性があります。

public class TestKeyListener {

    public static void main(String[] args) {
        new TestKeyListener();
    }

    public TestKeyListener() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                KeyPane keyPane = new KeyPane();
                frame.add(keyPane);
                frame.add(new ButtonPane(keyPane), BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class KeyPane extends JPanel {

        private JLabel keyed;
        public KeyPane() {

            setLayout(new GridBagLayout());
            keyed = new JLabel("...");
            add(keyed);
            setFocusable(true);
            requestFocusInWindow();

            addKeyListener(new KeyAdapter() {

                @Override
                public void keyPressed(KeyEvent e) {
                    keyed.setText(KeyStroke.getKeyStroke(e.getKeyCode(), e.getModifiers()).toString());
                }

            });

            addFocusListener(new FocusListener() {

                @Override
                public void focusGained(FocusEvent e) {
                    keyed.setText("Focus gained");
                }

                @Override
                public void focusLost(FocusEvent e) {
                    keyed.setText("Focus lost");
                }

            });

        }

    }

    public class ButtonPane extends JPanel {

        public ButtonPane(final Component focus) {
            setLayout(new GridBagLayout());
            JButton bad = new JButton("Steal Focus");
            JButton good = new JButton("Return Focus");
            good.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    focus.requestFocusInWindow();
                }
            });

            add(good);
            add(bad);
        }

    }

}
于 2012-11-21T04:33:30.907 に答える