gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:11:40 26 4
gpt4 key购买 nike

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

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

这是正在发生的事情: enter image description here

目前我的盒子居中:

this.setAlignmentX(Component.CENTER_ALIGNMENT);

并且我尝试使用以下方式对我的标签执行相同的操作:

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

什么都不做。

抱歉,图表太糟糕了,我在 MS Paint 中用了大约 20 秒就画好了。

这里是标签的重要部分

public Label(String text)
{

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

这里是我创建盒子布局的地方:

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

最佳答案

您可以使用 LayoutManager 的正确组合获得所需的结果。不要将自己局限于一个。充分利用组合/嵌套布局带来的强大功能。

enter image description here

这是我使用的技巧

  • 中心按钮的 BoxLayout
  • 面板的 GridLayout(1, 5) 包含除左下角按钮之外的所有内容
  • FlowLayoutLEADING 对齐
  • 全部包裹在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(通过添加空面板)的人,也许是这样,您还可以将顶部面板和底部面板添加到包含 BorderLayout 的面板和首选尺寸,它会给你类似的结果

    public BoxLayoutDemo() {
JPanel pane = new JPanel();

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

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

JPanel panel = new JPanel(new BorderLayout()){
public Dimension getPreferredSize() {
return new Dimension(400, 260);
}
};
panel.add(pane, BorderLayout.CENTER);
panel.add(pane2, BorderLayout.SOUTH);

JFrame frame = new JFrame("Slitting using different layouts");
frame.add(panel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

关于java - 我怎样才能使用 BoxLayout 来做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20934382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com