在Swing中使用GridLayout时设置帧大小

时间:2013-10-15 20:34:39

标签: java swing jframe layout-manager gridbaglayout

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

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

        }

}

3 个答案:

答案 0 :(得分:1)

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

这可能不是您希望GUI看起来的样子,而是将其作为GridLayout实际上有用的基本指南。

enter image description here

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

答案 1 :(得分: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 :(得分:0)

    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列