2

初心者なので、我慢してください。Java で倉庫番ゲームを作成しています。ゲームを起動して実行しましたが、pack() に問題があります。レベルのサイズに応じてフレームのサイズを変更したいのですが、レベルごとにサイズが異なります。パネルはさまざまなサイズで正しくペイントされているため、フレームを最大化するだけで問題ありませんが、pack() を呼び出してフレームのサイズを自動的に変更するにはどうすればよいでしょうか? メイン メソッドに pack() を入れようとしましたが、解決策はそれほど単純ではないと思います (おそらく、プログラムを構成した方法も役に立たないでしょう)。Main メソッドに pack() を配置すると、添付された画像が生成されます。これは、基本的に最小、最大、閉じるボタンだけの非常に小さな四角形です。フレーム

実装したい推奨ソリューションは次のとおりです。

オブジェクトがフィールドに記憶する参照パラメーターとして周囲の JFrame を受け取るように倉庫番コンストラクターを記述します。次に、倉庫番コンポーネントの適切なサイズを変更した後、この格納された周囲の JFrame のメソッド パックを呼び出します。

コンストラクターと Main メソッドのコードを添付しました。

public class Sokoban extends JPanel {

LevelReader lReader = new LevelReader();      
private static final int SQUARESIZE = 50;  // square size in pixels
int currentLevel = 0;
int height = 0;
int width = 0;
int x = 0;
int y = 0;
Contents [][] mapArray;

public Sokoban(String fileName) {
    lReader.readLevels(fileName);
    initLevel(currentLevel);
    KeyListener listener = new MyKeyListener();
    addKeyListener(listener);
    this.setPreferredSize(new Dimension(500,500));
    setFocusable(true);

}

public static void main(String[] args) {
    JFrame frame = new JFrame("Sokoban");
    Sokoban sokoban = new Sokoban("m1.txt");
    frame.add(sokoban);
    frame.setVisible(true);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
4

1 に答える 1

2

オブジェクトがフィールドに記憶する参照パラメーターとして周囲の JFrame を受け取るように倉庫番コンストラクターを記述します。次に、倉庫番コンポーネントの優先サイズを変更した後、この格納された周囲の JFrame のメソッド パックを呼び出します。

@mKorbel によって提案されたように、キー バインドを使用するように回答が更新されました (ヒントをありがとう、コードはよりきれいに見えます)

あなたの揚げ物が伝えようとしていたのは、このようなものを作成することです(この例では不要なコードを削除しました)

class Sokoban extends JPanel {

    private JFrame frame;

    private class MyAction extends AbstractAction {
        private Dimension dimension;

        public MyAction(Dimension dimension) {
            this.dimension = dimension;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            //we will pack only when dimensions will need to change
            if (!getPreferredSize().equals(dimension)) {
                setPreferredSize(dimension);
                frame.pack();
            }
        }
    }

    public Sokoban(String fileName, JFrame tframe) {
        this.frame = tframe;
        setFocusable(true);
        setPreferredSize(new Dimension(100, 100));
        setBackground(Color.red);
        add(new JLabel("press A, S, D"));

        getInputMap().put(KeyStroke.getKeyStroke('a'), "typed a");
        getInputMap().put(KeyStroke.getKeyStroke('s'), "typed s");
        getInputMap().put(KeyStroke.getKeyStroke('d'), "typed d");

        getActionMap().put("typed a", new MyAction(new Dimension(100, 100)));
        getActionMap().put("typed s", new MyAction(new Dimension(200, 100)));
        getActionMap().put("typed d", new MyAction(new Dimension(100, 200)));
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Sokoban");
        Sokoban sokoban = new Sokoban("m1.txt", frame);

        frame.setContentPane(sokoban);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

コンストラクターpublic Sokoban(String fileName, JFrame tframe)では、倉庫番パネルを含むフレームへの参照を渡す必要があります。class field のように、その参照からオブジェクトをクラスのどこかに保存する必要がありますprivate JFrame frame;

パネルのサイズを変更するたびに、その参照のおかげで、呼び出してそのパネルを含むフレームのサイズを変更frame.pack()し、新しいサイズに適応させることができます。

于 2013-04-14T15:17:53.213 に答える