我已经完美地设置了菜单(中心框),但我不知道如何定位标签。目前正在发生的事情是标签位于菜单选项下方,菜单选项被推到右侧。
这就是我想要发生的事情:
以下是发生的事情:
目前我的盒子集中在:
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");
}
}
答案 0 :(得分:4)
您可以使用LayoutManagers的正确组合获得所需的结果。不要局限于一个人。充分利用功能,而不是组合/嵌套布局。
这是我使用的技术
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();
}
});
}
}
免责声明:原谅框架的标题。我首先考虑将GridBagLayout
与Box
结合起来,但我这样做的方式要容易得多。我已经注意到它,现在太懒了改变标题。
对于那些说我上面所做的有些 hackish (通过添加空面板)的人,也许是这样,你也可以将顶部面板和底部面板添加到一个包含{{ {1}}和首选尺寸,它会给你类似的结果
BorderLayout