java - 在 JFrame 中使用 JPanel 无法正确调整大小或移动

标签 java swing jframe jpanel sizing

感谢您花时间阅读本文。我希望这不会造成混淆,如果需要任何其他信息,请告诉我!

问题: 我正在制作一个贪吃蛇游戏,我创建了一个 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);
 }
}

我的董事会类(class):

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() 不会影响结果。

最佳答案

您需要结合使用 getPreferred/Minimum/MaximumSize 和真正尊重它的布局。

在这里,我使用了一个 GridBagLayout 设置,这样面板将始终保持相同的大小,但单元格将使用相同的最大数量。

如果您想将文本保留在板的底部(而不是框架),请同时删除 weighty 约束(可能还有 weightx)

enter image description here enter image description here

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();
        }

    }    
}

关于java - 在 JFrame 中使用 JPanel 无法正确调整大小或移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13386508/

相关文章:

java - 学习 C/C++ 的最佳资源

java - 如何创建一个从 ArrayList 的一行到另一行拆分每一行的循环?

java - 安卓 KeyPairGenerator + php openssl_public_encrypt

java - 使用面板类中的按钮调用框架类中的ActionListener

java - 在 Java swing 中切换屏幕

java - 是否可以在 JFrame 的两种背景颜色之间进行选择,而无需创建变量并为其分配随机数 0 或 1?

java - ActiveMQ Blob 消息的持久化

java - 如何从 gui(jframe) 调用此代码

java - 突出显示过期日期提醒的 jtable 行

Java - 自定义形状的可拖动 JFrame