在JFrame中使用JPanel不会调整大小或正确移动

Twi*_*002 1 java swing jpanel jframe sizing

感谢您抽出宝贵时间阅读本文.我希望它不会混淆,如果需要任何其他信息,请告诉我!

问题:我正在制作类似Snake的游戏,我创建了一个JFrame,然后添加了JPanel.好吧,如果我没有在JFrame中设置它的大小,它的大小将大约为100 x 20.当我设置它的大小时,它将保持在设置的维度.但是,如果我打包()它,当我在JPanel中定义了大小时,它将缩小回100 x 20左右.我也设定了界限,没有运气.我使用FlowLayout()和BorderLayout()也没有成功.现在我的游戏运行正常并且没有任何问题,除了框架.它会切断两侧,除非我做一些我不想做的体操.

目标:我希望能够将Frame尺寸正确地指定到我指定的宽度和高度,并让面板向下移动一点,为游戏添加文本空间,这样就不会阻挡任何东西.

基本上我很困惑和慌张,我已经花了几天时间,到目前为止我还没有成功.

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);
 }
}
Run Code Online (Sandbox Code Playgroud)

我的董事会课程:

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();
 }
}
Run Code Online (Sandbox Code Playgroud)

我愿意尝试任何有人愿意为我提供的东西.感谢您的时间!

编辑1 :(由于用户的答案.)使用setPerferredSize(),setMinmumSize()和setMaximumSize()不会影响结果.

Mad*_*mer 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();
        }

    }    
}
Run Code Online (Sandbox Code Playgroud)