有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

感谢您花时间阅读本文。我希望它不会令人困惑,如果需要任何其他信息,请告诉我

问题: 我正在制作一个蛇形游戏,我创建了一个JFrame,然后添加了JPanel。如果我不在JFrame中设置它的大小,它的大小将为100x20。当我设置它的大小时,它保持在设置的尺寸上。但是,如果我打包()它,当我在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) 个答案

  1. # 1 楼答案

    我知道你说使用setPreferredSize()不会影响结果,但另外两个人和我自己似乎认为应该解决这个问题。你能试试下面的方法吗

    主要改变如下:

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

    致:

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

    然后添加pack(),看看结果是否发生了变化。理论上,这应该可以解决这个问题,除非发生了我们看不到的其他事情

  2. # 2 楼答案

    假设Board主要用于绘图,可以重写getPreferredSize()以返回合适的Dimension。当你pack()包围Window时,它将采用所选的大小。更多信息请参见此Q&A,避免使用此pitfall

  3. # 3 楼答案

    你需要结合使用getPreferred/Minimum/MaximumSize和一个真正尊重它的布局

    在这里,我使用了GridBagLayout设置,以便电路板始终保持相同大小,但单元将使用相同大小的最大数量

    如果希望将文本保留在电路板的底部(而不是框架),请删除weighty约束(可能还有weightx

    enter image description hereenter 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();
            }
    
        }    
    }
    
  4. # 4 楼答案

    我使用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));
        }
    
    }