带图标的布局管理器 (gif)

Layout Managers with icon (gif)

基本上,我正在尝试添加一个主屏幕,其中包含 4 个按钮、3 个难度按钮和一个播放按钮。我将按钮添加到 JPanel,并添加 BoxLayout 为 Center 的 JPanel。为什么按钮仍然一直向右移动?设置 JLabel 的图标并将其添加到主屏幕 JPanel 是否可能会扰乱组件流?我希望难度按钮位于 gif 的顶部,播放按钮位于底部。感谢您的帮助。

 //container
    snake = new JFrame();
    snake.setLayout(new BorderLayout());

    //home screen panel
    homeScreen = new JPanel();
    homeScreen.setLayout(new BoxLayout(homeScreen, BoxLayout.X_AXIS));
    homeScreen.setPreferredSize(new Dimension(320, 320));

    JLabel bg = new JLabel();
    ImageIcon icon = new ImageIcon("HomeBG.gif");
    icon.getImage().flush();
    bg.setIcon(icon);
    homeScreen.add(bg);

    easy = new JButton("Easy");
    medium = new JButton("Medium");
    hard = new JButton("Hard");
    play = new JButton("Play");


   //button listeners code here

    homeScreen.add(easy);
    homeScreen.add(medium);
    homeScreen.add(hard);
    homeScreen.add(play);

    snake.add(homeScreen, BorderLayout.CENTER);
    snake.setTitle("Snake Game");
    snake.pack();
    snake.setVisible(true);
    snake.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

您需要如下所示更改您的代码。

snake = new JFrame();
snake.setLayout(new BorderLayout());

//home screen panel
homeScreen = new JPanel(new BorderLayout());
//homeScreen.setLayout(new BoxLayout(homeScreen, BoxLayout.X_AXIS));
homeScreen.setPreferredSize(new Dimension(320, 320)); // probably you need to remove this line!

JLabel bg = new JLabel();
ImageIcon icon = new ImageIcon("HomeBG.gif");
icon.getImage().flush();
bg.setIcon(icon);
homeScreen.add(bg);

easy = new JButton("Easy");
medium = new JButton("Medium");
hard = new JButton("Hard");
play = new JButton("Play");


//button listeners code here
JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
buttonsPanel.add(easy);
buttonsPanel.add(medium);
buttonsPanel.add(hard);
buttonsPanel.add(play);

homeScreen.add(buttonsPanel, BorderLayout.NORTH);

snake.add(homeScreen, BorderLayout.CENTER);
snake.setTitle("Snake Game");
snake.pack();
snake.setVisible(true);
snake.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

我会为此使用复合布局。将级别按钮放在(a 中的面板)FlowLayout 中。将播放按钮放在第 2 个 FlowLayout 中。将这些面板添加到 BorderLayoutPAGE_STARTPAGE_END。将包含 GIF 的标签添加到相同边框布局的 CENTER

顺便说一句 - 级别按钮应该是单选按钮(在按钮组 - BNI 中)。

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class LayoutManagersWithIcon {

    private JComponent ui = null;

    LayoutManagersWithIcon() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,4,4,4));

        JPanel levelPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5));
        ui.add(levelPanel, BorderLayout.PAGE_START);
        levelPanel.add(new JRadioButton("Easy"));
        levelPanel.add(new JRadioButton("Medium"));
        levelPanel.add(new JRadioButton("Hard"));

        JPanel startPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5));
        ui.add(startPanel, BorderLayout.PAGE_END);
        startPanel.add(new JButton("Play"));

        JLabel label = new JLabel(new ImageIcon(
                new BufferedImage(400, 100, BufferedImage.TYPE_INT_RGB)));
        ui.add(label);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                LayoutManagersWithIcon o = new LayoutManagersWithIcon();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}