1

これを読んでくれてありがとう。紛らわしくないことを願っています。他の情報が必要な場合はお知らせください。

問題: Snake のようなゲームを作成しており、JFrame を作成してから JPanel を追加しました。JFrame でサイズを設定しないと、サイズは約 100 x 20 になります。サイズを設定すると、設定された寸法のままになります。ただし、pack() すると、JPanel でサイズを定義すると、100 x 20 程度に縮小されます。私も境界を設定しましたが、運がありません。私は FlowLayout() と BorderLayout() を使用しましたが、どちらも成功しませんでした。現在、私のゲームは正しく動作し、フレームを除いて問題はありません。私がやりたくない体操をしない限り、それは側面を切り落とします.

目的: 指定した幅と高さに合わせてフレーム サイズを正しく設定し、パネルを少し下に移動してゲームのテキスト用のスペースを追加し、何もブロックしないようにしたいと考えています。

基本的に、私はこれに数日を費やしたことに混乱し、慌てており、これまでのところ何も成功していません.

JFrame クラス:

public class main extends JFrame {

 /**
  * @param args the command line arguments
  */

 public main(){
     Board game = new Board();

     setLayout(new BorderLayout(0, 50));
     setSize(game.getGameWidth(), game.getGameHeight());
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     setLocationRelativeTo(null);
     setTitle("BlockRunner");
     getContentPane().add(game);

     setResizable(false);
     setVisible(true);
 }
}

私のボードクラス:

public class Board extends JPanel implements ActionListener, KeyListener{
 private int width = 600;
 private int height = 400;
 Board(){
     addKeyListener(this);
     setFocusable(true);
     setBackground(Color.LIGHT_GRAY);
     setSize(width, height);
     InitGame();
 }
}

私は、誰かが私のために喜んで出してくれるものなら何でも試してみたいと思っています. お時間をいただきありがとうございます!

編集 1: (ユーザーの回答による) setPerferredSize()、setMinmumSize()、および setMaximumSize() を使用しても、この結果には影響しません。

4

4 に答える 4

5

getPreferred/Minimum/MaximumSizeと実際にそれを尊重するレイアウトの組み合わせを使用する必要があります。

ここではGridBagLayout、ボードが常に同じサイズのままになるように設定しましたが、セルは同じサイズを最大限に使用します。

(フレームではなく)ボードの下部にテキストを保持する場合は、weighty制約(および場合によってはweightx)も削除します。

ここに画像の説明を入力してくださいここに画像の説明を入力してください

public class TestBoardGame {

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

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

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.weightx = 1;
                gbc.weighty = 1;
                frame.add(new BoardGamePane(), gbc);

                gbc.gridx = 0;
                gbc.gridy = 1;
                gbc.weightx = 1;
                gbc.fill= GridBagConstraints.HORIZONTAL;
                JLabel text = new JLabel("Area for text");
                text.setHorizontalAlignment(JLabel.CENTER);
                frame.add(text, gbc);

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class BoardGamePane extends JPanel {

        public BoardGamePane() {

            setBorder(new LineBorder(Color.RED));
            setBackground(Color.ORANGE);

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 300);
        }

        @Override
        public Dimension getMinimumSize() {
            return getPreferredSize();
        }

        @Override
        public Dimension getMaximumSize() {
            return getPreferredSize();
        }

    }    
}
于 2012-11-14T21:12:46.560 に答える
4

Boardが主に描画に使用されると仮定すると、オーバーライドgetPreferredSize()して適切な を返すことができますDimensionpack()同梱の場合Windowは、選択されたサイズを採用します。詳細については、このQ&Aを参照して、この落とし穴を回避してください。

于 2012-11-14T20:46:36.830 に答える
0

私がSwingを使用する方法としては、内部コンポーネントに適切なサイズを設定し、JFrameパックを使用することをお勧めします。

したがって、合計で次のことを行う必要があります。

  • JFrameでsetSizeを削除します(またはsetPreferredSizeに変更します)
  • JPanelのsetSizeをsetPreferredSizeに変更します。
  • すべてが完了したら、JFrameでpackを呼び出します。

以下のコードがあなたが望むことをするかどうか見てください。

public class Main extends JFrame {

    public Main() {
        Board game = new Board();

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        {
            Container contentPane = getContentPane();
            contentPane.setLayout(new BorderLayout(0, 50));
            JLabel label = new JLabel("hello world!");
            contentPane.add(label, BorderLayout.NORTH);
            contentPane.add(game, BorderLayout.CENTER);
        }
        pack();

        setResizable(false);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Main();
            }
        });
    }
}

public class Board extends JPanel {
    private int width = 600;
    private int height = 400;

    Board() {
        setFocusable(true);
        setBackground(Color.LIGHT_GRAY);
        setPreferredSize(new Dimension(width, height));
    }

}
于 2012-11-14T20:55:50.813 に答える
0

使用しても結果には影響しないとおっしゃっていることは承知していますがsetPreferredSize()、他の 2 人と私は、それを修正する必要があると考えているようです。次のことを試してみてください:

主な変更点は次のとおりです。

setSize(game.getGameWidth(), game.getGameHeight());

に:

setPreferredSize(new Dimension(game.getGameWidth(), game.getGameHeight()));

次に追加pack()して、結果が変わったかどうかを確認します。理論的には、私たちが見ることができない何かが起こっていない限り、これで問題が解決するはずです。

于 2012-11-14T20:43:59.193 に答える