【问题标题】:Setting frame size when using GridLayout in Swing在 Swing 中使用 GridLayout 时设置帧大小
【发布时间】:2013-10-15 20:34:38
【问题描述】:

在下面的代码中,我使用 gridbaglayout 在 600 X 400 的帧大小上以两行显示所有按钮。在下面的代码中注释掉 setSize() 或 pack() 没有帮助。我的问题是如何获得尺寸为 600 X 400 的框架,框架底部有一个带有字母按钮的面板。感谢您的帮助。

import javax.swing.*;

import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.event.*;

public class HangmanGUI {


        public static void main(String[] args){

            new HangmanGUI();

        }
        //constructor for Hangman
        /**
         * Instantiates a new hangman gui.
         */
        public HangmanGUI() {

            JFrame myframe= new JFrame();
            JPanel myPanel = new JPanel();
            myPanel.setLayout(new GridLayout());
            GridBagConstraints gbc = new GridBagConstraints();


            myframe.setSize(600,400);
            int x =0; int y=5;

            for (char alphabet = 'A';alphabet<='Z';alphabet++){

                gbc.gridx=x;
                gbc.gridy=y;
                myPanel.add(new JButton(alphabet+""),gbc);
                x++;
                if (x>15){
                    y =6;x=0;
                }
            }

            myframe.add(myPanel);
            myframe.pack();
            myframe.setTitle("Hangman Game");
            myframe.setVisible(true);
            myframe.setLocationRelativeTo(null);

            myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        }

}

【问题讨论】:

  • Pack 根据其子容器的首选大小计算窗口大小。你需要想办法让主容器的大小符合你的期望......
  • 你为什么痴迷于设置框架的大小???这不是您构建 GUI 的方式。你倒着想。框架的大小应由添加到框架的组件的首选大小决定。

标签: java swing jframe layout-manager gridbaglayout


【解决方案1】:

打包后,框架大小是根据其内容窗格的首选大小计算的。

就我个人而言,我不太关心程序的窗口大小和功能,而是让底层框架解决所有问题......但是,如果它对你很重要......

JPanel 之类的东西开始,然后覆盖它的 getPreferredSize 方法...

public class BigPane extends JPanel {
    public Dimension getPreferredSize() {
        return new Dimension(600, 400);
    }
}

将此面板设置为框架的内容窗格...

JFrame myframe= new JFrame();
myFrame.setContentPane(new BigPane());
// This is important as the panels default layout is FlowLayout...
myFrame.setLayout(new BorderLayout());

如果您希望按钮窗格位于南边位置,那么您只需为布局提供正确的布局约束,在这种情况下,BorderLayout...

myFrame.add(myPanel, BorderLayout.SOUTH);

这将允许您将“主要”组件添加到CENTER 位置。

正如已经建议的那样,对按钮使用GridLayout 可能会更好,但这取决于您想要实现的目标。

查看Laying out components within a container了解更多详情

【讨论】:

    【解决方案2】:

    在上一次问答中,建议您使用 GridLayout 而不是 GridBagLayoutGridBagConstraints 只用于后者。

    这可能不是您想要的 GUI 外观,而是将其作为GridLayout 实际用途的基本指南。

    import javax.swing.*;
    import java.awt.*;
    import java.awt.image.*;
    
    public class HangmanGUI {
    
            /**
             * Instantiates a new hangman gui.
             */
            public HangmanGUI() {
    
                JPanel gui = new JPanel(new BorderLayout(2,2));
                BufferedImage bi = new BufferedImage(
                    600,200,BufferedImage.TYPE_INT_RGB);
                gui.add(new JLabel(new ImageIcon(bi)));
    
                JFrame myframe= new JFrame();
                JPanel myPanel = new JPanel();
                gui.add(myPanel,BorderLayout.PAGE_END);
                myPanel.setLayout(new GridLayout(2,0,0,0));
    
                int x =0; int y=5;
    
                for (char alphabet = 'A';alphabet<='Z';alphabet++){
                    myPanel.add(new JButton(alphabet+""));
                    x++;
                    if (x>15){
                        y =6;x=0;
                    }
                }
    
                myframe.add(gui);
                myframe.pack();
                myframe.setTitle("Hangman Game");
                myframe.setVisible(true);
                myframe.setLocationRelativeTo(null);
    
                myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
    
            public static void main(String[] args){
                new HangmanGUI();
            }
    }
    

    【讨论】:

    • 请注意,我将“绞刑区”设置为 600 像素 x 200 像素,因此它占用的垂直屏幕空间更少。调整数字以适应游戏。
    【解决方案3】:
        JFrame myframe= new JFrame();
        myframe.getContentPane().setLayout(new BorderLayout());
        JPanel myPanel = new JPanel();
        myPanel.setLayout(new GridLayout(2,13));
        GridBagConstraints gbc = new GridBagConstraints();
    
    
        myframe.setSize(600,400);
        int x =0; int y=5;
    
        for (char alphabet = 'A';alphabet<='Z';alphabet++){
    
            gbc.gridx=x;
            gbc.gridy=y;
            myPanel.add(new JButton(alphabet+""),gbc);
            x++;
            if (x>15){
                y =6;x=0;
            }
        }
    
        myframe.getContentPane().add(myPanel, BorderLayout.SOUTH);
        myframe.setTitle("Hangman Game");
        myframe.setVisible(true);
        myframe.setLocationRelativeTo(null);
    
        myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    

    我将 BorderLayout 添加到 ContentPane,然后将 Panel 添加到 ContentPane 的底部。

    还删除了包。

    并在新的 GridLayout 中添加约束以指定 2 行 13 列

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 2011-08-20
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      相关资源
      最近更新 更多