0

在下面的代码中,我使用 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);

        }

}
4

3 回答 3

1

在您上次的问答中,建议您使用GridLayout而不是GridBagLayout. GridBagConstraints仅用于后者。

这可能不是您希望 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();
        }
}
于 2013-10-15T20:58:53.177 回答
1

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

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

从 a 之类的东西开始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位置添加“主要”组件。

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

查看在容器中布局组件以获取更多详细信息

于 2013-10-15T21:14:05.790 回答
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 列

于 2013-10-15T20:39:21.357 回答