【问题标题】:How to force JPanels using GridBagLayout to resize with JFrame如何使用 GridBagLayout 强制 JPanel 使用 JFrame 调整大小
【发布时间】:2016-11-24 21:14:46
【问题描述】:

当框架展开时,我需要展开 menuPanel 的组件。 MenuPanel 正在使用 GridBayLayout,我已经修改了面板的填充和权重值,但似乎没有什么真正导致组件随框架调整大小。

我怀疑我在显示类中添加 menuPanel 的方式有问题。此外,我还尝试为 TanksApplication 设置布局,但也没有用。我认为我没有理解一些基本的东西。

主应用

    public class TanksApplication extends JFrame{ 

       public TanksApplication(){
           super("Tanks");
       }

       public static void main (String args[]){
          Display display = new Display();
          TanksApplication frame = new TanksApplication();
          frame.add(display);
          frame.setSize(600,425);
          frame.setVisible(true);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setLocationRelativeTo(null);
       }
   }

显示类

public class Display extends JPanel{    
   public Display(){
       menuPanel = new JPanel(new GridBagLayout());
       GridBagConstraints con = new GridBagConstraints();

       mainMenuImageP = new JPanel();
       mainMenuImageP.setBackground(Color.BLACK);
       con.fill = GridBagConstraints.BOTH;
       con.gridy = 0;
       con.gridx = 0;
       con.gridwidth = 2;
       con.weightx = 0.5;
       con.weighty = 0.5;
       con.anchor = GridBagConstraints.CENTER;
       con.ipadx = 400;
       con.ipady = 300;
       con.insets = new Insets(0,20,0,20);
       menuPanel.add(mainMenuImageP, con);

       newGameB = new JButton("New Game");
       con.fill = GridBagConstraints.HORIZONTAL;
       con.gridy = 1;
       con.gridx = 0;
       con.gridwidth = 1;
       con.weightx = 0.5;
       con.weighty = 0.5;
       con.anchor = GridBagConstraints.CENTER;
       con.ipadx = 0;
       con.ipady = 0;
       con.insets = new Insets(10,10,10,10);
       menuPanel.add(newGameB, con);

       loadGameB = new JButton("Load Game");
       con.fill = GridBagConstraints.HORIZONTAL;
       con.gridy = 1;
       con.gridx = 1;
       con.gridwidth = 1;
       con.weightx = 0.5;
       con.weighty = 0.5;
       con.anchor = GridBagConstraints.CENTER;
       con.ipadx = 0;
       con.ipady = 0;
       con.insets = new Insets(10,10,10,10);
       menuPanel.add(loadGameB, con);

       add(menuPanel);
   }

【问题讨论】:

    标签: java swing


    【解决方案1】:

    您的问题是您使用 menuPanel 将 GridBagLayout 添加到 Display JPanel 中,后者使用 JPanel 的默认 FlowLayout。 FlowLayout 不会调整添加到其中的组件的大小。解决方案:摆脱 menuPanel,只使用Display JPanel。给它一个 GridBagLayout 并向其中添加组件。

    在 Display 的构造函数中也是如此

    setLayout(new GridBagLayout());
    

    删除JPanel menuPanel = new JPanel();和任何你有menuPane.add(...);的地方,把它改成简单的add(...)

    例如,

    public class Display extends JPanel{    
        public Display(){
            // !! menuPanel = new JPanel(new GridBagLayout());
            GridBagConstraints con = new GridBagConstraints();
    
            mainMenuImageP = new JPanel();
            mainMenuImageP.setBackground(Color.BLACK);
            con.fill = GridBagConstraints.BOTH;
            con.gridy = 0;
            con.gridx = 0;
            con.gridwidth = 2;
            con.weightx = 0.5;
            con.weighty = 0.5;
            con.anchor = GridBagConstraints.CENTER;
            con.ipadx = 400;
            con.ipady = 300;
            con.insets = new Insets(0,20,0,20);
            // !! menuPanel.add(mainMenuImageP, con);
            add(mainMenuImageP, con); // !!
    
            newGameB = new JButton("New Game");
            con.fill = GridBagConstraints.HORIZONTAL;
            con.gridy = 1;
            con.gridx = 0;
            con.gridwidth = 1;
            con.weightx = 0.5;
            con.weighty = 0.5;
            con.anchor = GridBagConstraints.CENTER;
            con.ipadx = 0;
            con.ipady = 0;
            con.insets = new Insets(10,10,10,10);
            // !! menuPanel.add(newGameB, con);
            add(newGameB, con); // !!
    
            loadGameB = new JButton("Load Game");
            con.fill = GridBagConstraints.HORIZONTAL;
            con.gridy = 1;
            con.gridx = 1;
            con.gridwidth = 1;
            con.weightx = 0.5;
            con.weighty = 0.5;
            con.anchor = GridBagConstraints.CENTER;
            con.ipadx = 0;
            con.ipady = 0;
            con.insets = new Insets(10,10,10,10);
            // !! menuPanel.add(loadGameB, con);
            add(loadGameB, con); // !!
    
            // !! add(menuPanel);
        }
    
    }
    

    请注意,如果这没有帮助,请考虑创建并发布 minimal example programSSCCE

    【讨论】:

    • 这是个好主意,谢谢。我会试一试。我没有意识到 Display 是一个面板,我不知道为什么我没有想到它。
    • 就是这样。再次感谢。
    • @ulw1:不客气。如果您绝对需要使用内部 JPanel,例如 menuPanel,那么您可能希望让您的 DisplayPanel 使用更改其组件 PreferredSizes 的布局,例如 BorderLayout。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2013-10-11
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    相关资源
    最近更新 更多