我怎样才能使用BoxLayout来做到这一点?

时间:2014-01-05 13:55:31

标签: java swing layout-manager boxlayout

我已经完美地设置了菜单(中心框),但我不知道如何定位标签。目前正在发生的事情是标签位于菜单选项下方,菜单选项被推到右侧。

这就是我想要发生的事情: enter image description here

以下是发生的事情: enter image description here

目前我的盒子集中在:

this.setAlignmentX(Component.CENTER_ALIGNMENT);

我试图用我的标签做同样的事情:

this.setAlignmentX(Component.BOTTOM_ALIGNMENT);
this.setAlignmentY(Component.LEFT_ALIGNMENT);

哪个什么都没做。

对不起,图表非常糟糕,我在大约20秒钟内将它绘制在MS Paint中。

这是标签

的重要部分
public Label(String text)
{

    this.setHorizontalTextPosition(JLabel.CENTER);
    this.setVerticalTextPosition(JLabel.CENTER);
    this.setHorizontalAlignment(0);
}

这是我创建boxlayout的地方:

 pnlMain.setLayout(new BoxLayout(pnlMain, BoxLayout.Y_AXIS));

编辑:这是我的JFrame扩展类中的主要功能。功能之上只是创建面板,按钮和标签。

public Window()
{
    //Create the JFrame
    super("Tank Trouble");
    this.pack();
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);

    //Changes the frame size to your screen size
    Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (int) (dimension.getWidth());
    int y = (int) (dimension.getHeight());
    setSize(x,y);
    setResizable(false);
    //GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(this); //Makes the application go fullscreen

    getContentPane().add(pnlMaster);

    pnlMaster.add(pnlMenu, "Main Menu");
    pnlMaster.add(pnlOptions, "Options");
    pnlMaster.add(pnlGame, "Game");
    pnlMaster.add(pnlMenu2);

    switchTo("Main Menu");

    pnlOptions.setLayout(new BoxLayout(pnlOptions, BoxLayout.Y_AXIS));

    Box box = Box.createVerticalBox();
    box.add(Window.playS);
    box.add(Box.createVerticalStrut(20));
    box.add(Window.playM);
    box.add(Box.createVerticalStrut(20));
    box.add(Window.options);
    box.add(Box.createVerticalStrut(20));
    box.add(Window.language);
    box.add(Box.createVerticalStrut(20));
    box.add(Window.exit);
    box.add(Box.createVerticalStrut(20));

    pnlMenu.add(box);
    pnlMenu.add(new JPanel());
    pnlMenu.add(new JPanel());
    pnlMenu.add(new JPanel());
    pnlMenu.add(new JPanel());

    pnlMenu2.add(Window.lblVersion);

    System.out.println("Window class loaded");

}

这就是我的菜单类目前的样子(这是以前处理除了创建之外的按钮和标签所做的一切)。

package menu;

import main.Window;

public class Menu
{   
    public Menu()
    {
    Listener listener = new Listener();

    //Add ActionListeners
    Window.exit.addActionListener(listener);
    Window.playS.addActionListener(listener);
    Window.playM.addActionListener(listener);
    Window.options.addActionListener(listener);
    Window.language.addActionListener(listener);
    Window.btnBack.addActionListener(listener);

    System.out.println("Menu class loaded");
}
}

1 个答案:

答案 0 :(得分:4)

您可以使用LayoutManagers的正确组合获得所需的结果。不要局限于一个人。充分利用功能,而不是组合/嵌套布局。

enter image description here

这是我使用的技术

  • 中心按钮BoxLayout
  • 面板的GridLayout(1, 5)由除了自己的按钮左侧按钮之外的所有内容组成
  • FlowLayout LEADING路线
  • 全部包含在JFrame默认BorderLayout

参见下面的程序

import java.awt.*;
import javax.swing.*;

public class BoxLayoutDemo {

    JButton button1 = new JButton("Button1");
    public BoxLayoutDemo() {
        JPanel pane = new JPanel(new GridLayout(1, 5));

        Box box = Box.createVerticalBox();
        box.add(new JButton("Button 1"));
        box.add(Box.createVerticalStrut(20));
        box.add(new JButton("Button 2"));
        box.add(Box.createVerticalStrut(20));
        box.add(new JButton("Button 3"));
        box.add(Box.createVerticalStrut(20));
        box.add(new JButton("Button 4"));
        box.add(Box.createVerticalStrut(20));
        box.add(new JButton("Button 5"));
        box.add(Box.createVerticalStrut(20));

        pane.add(new JPanel());
        pane.add(new JPanel());
        pane.add(box);
        pane.add(new JPanel());
        pane.add(new JPanel());

        JPanel pane2 = new JPanel(new FlowLayout(FlowLayout.LEADING));
        pane2.add(new JButton("ButtonButton"));

        JFrame frame = new JFrame("GridBag Box");
        frame.add(pane, BorderLayout.CENTER);
        frame.add(pane2, BorderLayout.SOUTH);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                new BoxLayoutDemo();
            }
        });
    }
}

免责声明:原谅框架的标题。我首先考虑将GridBagLayoutBox结合起来,但我这样做的方式要容易得多。我已经注意到它,现在太懒了改变标题。


对于那些说我上面所做的有些 hackish (通过添加空面板)的人,也许是这样,你也可以将顶部面板和底部面板添加到一个包含{{ {1}}和首选尺寸,它会给你类似的结果

BorderLayout