我如何使用 BoxLayout 来做到这一点?

2023-12-11

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

Here is what I want to happen: enter image description here

And here is what is happening: 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));

Edit:这是我的 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

这是我使用的技术

  • A BoxLayout对于中心按钮
  • A GridLayout(1, 5)对于面板来说,它由除左下角按钮之外的所有内容组成,该按钮是独立的
  • FlowLayout with a 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(通过添加空面板),也许是这样,您还可以将顶部面板和底部面板添加到包含面板中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);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何使用 BoxLayout 来做到这一点? 的相关文章

随机推荐

  • Dateformatter 从字符串获取日期

    我的绳子是这样的2012 12 08 17 00 00 0 现在我尝试使用 NSDate 格式化程序从此字符串中检索日期 我的代码是 NSDateFormatter df NSDateFormatter alloc init df setD
  • “javac”不被识别为内部或外部命令

    我必须将 Matlab 算法转换为 Java 为此 我使用 matlab builder ja 工具箱 在执行所有必要的步骤后 构建失败并显示此错误 javac 不被识别为内部或外部命令 可操作程序或批处理文件 错误 调用 javac 时发
  • 编写一个满足以下测试的函数 f

    我有一个问题一直困扰着我 需要帮助解决 下面是一个需要解决的测试 我已经成功地整合了一个解决方案 该解决方案适用于 85 的覆盖范围 但它是我坚持的最后 15 describe f function it should work funct
  • 如何在每次迭代时仅从一个类中对批次进行采样

    我想在一个 ImageNet 数据集 每个类有 1000 个类 每个类大约有 1300 张图像 上训练一个分类器 由于某种原因 我需要每个批次包含来自同一类别的 64 个图像 以及来自不同类别的连续批次 使用最新的 TensorFlow 是
  • 为什么 Angular 2+ innerHTML 在一条语句中多次调用方法,如何解决这个问题

    我有这样的模板视图 p p 并且 ts 文件就像 import Component from angular core Component selector my app templateUrl app component html sty
  • 如何以正确的格式将抓取的数据导出到 csv 文件?

    I made an improvement to my code according to this suggestion from paultrmbrth what i need is to scrape data from pages
  • 我想知道为什么用向量可以成功而用数组却不行?

    这成功了 include
  • 从 Visual Studio 2019 中替换 WiX 变量

    我正在努力本地化我在 WiX 工具集中制作的安装程序 并尝试根据生成的 msi 更改我的许可协议 如果 msi 来自调试中的 en us 文件夹 那么它应该是英语 如果位于 fr fr 文件夹中 则应该是法语 我目前分别有英语和法语的两个许
  • 获取 RTI DDS 上 DataWriter/Publisher 的 IP 地址?

    我在用RTI DDS 5 2 3 17并想获取该设备的 IP 地址DataWriter Publisher添加到一些日志消息 我该如何去做呢 我在形成做什么的逻辑时遇到了一些困难 无法以标准化方式访问 DataWriter 的 IP 地址
  • 不使用多部分httppost方法在android中发布图像文件

    这个问题借用自同样的问题 因为我遇到了一些问题 在服务器端发布图像期间 图像详细信息无法进入服务器端 像这样 无法发布图像文件信息php服务器 用户ID正常但图像文件信息无法发布 在这种情况下 图像在服务器上保存成功 我无法获取图像的php
  • 如何保护ajaxRequest.open php脚本

    我是使用 AJAX 的新手 我只是按照教程使用 AJAX 从数据库中检索一些信息并将其输出到页面上 有一行我调用了一个 php 脚本 这是进行数据库查询的地方 并且结果被回显 我有点担心 由于文件名在前端可见 并且它的唯一目的是直接输出数据
  • 使用 EnumDisplayDevices 获取显示器的名称

    我碰到this帖子中有人想使用 EnumDisplayDevices 找出他们的显示器的名称 这正是我想要的 我尝试在 C 中做类似的事情 但对 EnumDisplayDevices 的第二次调用似乎永远不会返回任何内容 我只获取有关显卡的
  • Genie 中嵌套泛型类型的语法是什么?

    我想声明一个哈希表string因为它是关键并且array of int因为它的价值 indent 4 init var h new HashTable of string array of int str hash str equal h
  • CSS 样式表未加载

    这是最愚蠢的问题 但我不知道为什么我找不到问题 下面是代码 但 css 文件未加载 section a href class btn btn primary Hello a section
  • Tensorflow,如何访问 RNN 的所有中间状态,而不仅仅是最后一个状态

    我的理解是tf nn dynamic rnn返回 RNN 单元 例如 LSTM 在每个时间步的输出以及最终状态 如何访问所有时间步骤中的细胞状态 而不仅仅是最后一个时间步骤 例如 我希望能够对所有隐藏状态进行平均 然后在后续层中使用它 以下
  • 使用 DataFrame 按组计算 Python Spark 累积和

    如何专门使用以下方法计算每组的累积总和DataFrame abstraction 并在PySpark 示例数据集如下 df sqlContext createDataFrame 1 2 a 3 2 a 1 3 b 2 2 a 2 3 b t
  • 在 Windows 中获取鼠标光标下的单词

    大家好 我和一个朋友正在讨论一个新项目的可能性 一个翻译程序 只要你将鼠标悬停在任何控件中的任何单词上 甚至是静态的 不可编辑的单词上 就会弹出翻译 我知道有很多浏览器插件可以在网页上执行此类操作 我们正在考虑如何在系统范围内 在 Wind
  • Q3DScatter --> 如何将不同颜色的点添加到点云中

    我在 Qt 中编写了一个程序 它使用 Q3DScatter 可视化处理后的点云 3D 点 现在我想添加具有不同颜色的计算关键点 那可能吗 有哪位男孩有这方面的经验吗 下面您可以看到代码部分 其中点云被添加到数据数组中 QScatterDat
  • 禁用元素的 NumericUpDown 背景颜色更改

    在我的 winform 应用程序上 我尝试对所需字段进行颜色编码 在用户编辑时 当必填字段被填写时 背景变为浅绿色 如果必填字段为空 则背景为红色 某些字段的启用和禁用取决于其他字段中的输入 因此有时我需要禁用字段 并且应该完全禁用该字段
  • 我如何使用 BoxLayout 来做到这一点?

    我已经完美地设置了菜单 中心框 但我不知道如何放置标签 目前发生的情况是标签位于菜单选项下方 并且菜单选项被推到右侧 Here is what I want to happen And here is what is happening 目