当前位置: 首页 > 知识库问答 >
问题:

BoxLayout忽略子面板对齐

汪成仁
2023-03-14

我有一个带有包含子面板的BoxLayout管理器的JPanel。我希望这些子面板内部的组件有一个左对齐,但它们总是出现居中。看起来BoxLayout正确地对齐了直接插入的组件,但当它们在子面板中时就不能做到这一点。

我修改了http://www.java2s.com/tutorial/java/0240__swing/yaxisalignaly.htm中的示例,以便将每个按钮放置在子面板中,然后将子面板放置在带有BoxLayout管理器的主面板中:

public class YAxisAlignX {
  private static Container makeIt(String title, float alignment) {
    String labels[] = { "--", "----", "--------", "------------" };

    JPanel container = new JPanel();
    container.setBorder(BorderFactory.createTitledBorder(title));
    BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
    container.setLayout(layout);

    // modified loop. the original version does not create JPanel pan.
    // adds the buttons directly the the JPanel container with the
    // BoxLayout
    for (int i = 0, n = labels.length; i < n; i++) {
      JPanel pan = new JPanel();
      JButton button = new JButton(labels[i]);
      pan.add(button);
      button.setAlignmentX(alignment);
      pan.setAlignmentX(alignment);
      container.add(pan);
    }
    return container;
  }

  public static void main(String args[]) {
    JFrame frame = new JFrame("Alignment Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Container panel1 = makeIt("Left", Component.LEFT_ALIGNMENT);
    Container panel2 = makeIt("Center", Component.CENTER_ALIGNMENT);
    Container panel3 = makeIt("Right", Component.RIGHT_ALIGNMENT);

    Container contentPane = frame.getContentPane();
    contentPane.setLayout(new FlowLayout());
    contentPane.add(panel1);
    contentPane.add(panel2);
    contentPane.add(panel3);

    frame.pack();
    frame.setVisible(true);
  }
}

如果您执行这个版本,您可以看到按钮都是居中的,尽管设置了对齐方式。为什么会出现这种情况?有什么解决办法吗?在我的例子中,每个子面板都包含几个组件,我不想直接添加到主面板中。

非常感谢。

共有1个答案

林正平
2023-03-14

但他们是对齐的!

首先,setalignmentX在JComponent级别更改属性,放置这些组件的布局可能使用也可能不使用这些信息。例如,boxlayout使用它,但flowlayoutborderlayout不使用。

在您的情况下,您放置了一些面板与垂直的BoxLayout和您是对齐他们的各种方式,它的工作!只是碰巧,这些面板会伸长来适应整个列,所以实际上对齐并不会改变它们的外观。您可以通过在面板周围设置边框来看到这一点:

pan.setBorder(BorderFactory.createLineBorder(Color.red));
button.setAlignmentX(alignment);

一事无成。要在FlowLayout中对齐,您需要通过FlowLayout.setAligment(int)(docs)更改其Aligning字段,您也可以在构造函数中这样做,因此如果我们将PAN声明更改为:

JPanel pan = new JPanel(new FlowLayout(FlowLayout.LEFT));

您还将使按钮在其面板中向左对齐:

当然,所有列都是向左对齐的,因为makeit的参数float alignment并不影响FlowLayout的对齐方式,只影响boxLayout的对齐方式(这也不重要)。您可能希望将该参数更改为int并使用不同的flowlayout常量html" target="_blank">调用函数。

总而言之,在最初的版本中,行按钮.SetAlignmentX(对齐);是有意义的,因为按钮直接添加到容器面板中,并且BoxLayout将它们正确对齐:

但是,一旦您将按钮放入其他面板中,BoxLayout将开始对齐面板(由于面板在BoxLayout中的工作方式,它们将被拉伸以填充整个宽度),而不是按钮,按钮的对齐取决于面板布局。这就是它的工作方式,这样我们就可以做出一致的嵌套布局。

我希望那是清楚的。

 类似资料:
  • 问题内容: 我四处浏览,但找不到适合我情况的解决方案。我有一个在对话框中显示的面板: 最后两个面板(类型5和类型6)的大小相等,因此看起来不错。但是,页眉和前4个面板的大小不同,我希望它们都对齐。到目前为止,我还没有找到解决此问题的好方法。 问题是,我如何左对齐前5个面板,而不对齐最后两个?如果没有,我该如何将它们全部对齐?setalignmentx()不适用于面板。我尝试使用GridLayout

  • 问题内容: 您好,我正在阅读hibernate文档。 http://docs.jboss.org/hibernate/annotations/3.5/reference/zh/html/entity.html 使用@ManyToMany批注在逻辑上定义了多对多关联。您还必须使用@JoinTable批注描述关联表和联接条件。如果关联是双向的,则一侧必须是所有者,而一侧必须是反向端(即,在更新关联表中

  • 我写了一个模板函数,它使用了另外两个模板函数(添加 在math_functions.cpp中,我对add有不同的专门化 我还编写了一个简单的测试程序: 这段代码编译时没有任何错误,但奇怪的是,当我调用mulvadd时,调用的函数是h文件中定义的默认模板,而不是cpp文件中的专用版本。发生这种情况的原因是什么?

  • 问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc

  • 问题内容: 嗨,我使用a 来使彼此堆叠(),例如,如果我的父母的身高为500像素,并且我向其添加了两个子面板,两者的高度均为100像素。在绵延他们,让他们一起占据了500px的空间。有谁知道如何禁用此功能? 问题答案: 请改用GridBagLayout。您对UI的控制更多。 但是,如果您仍要使用BoxLayout且不希望它们拉伸,则可以使用不可见的组件填充物(如刚性区域,胶水和填充物)进行签出。

  • 问题内容: 我正在某个网站上插入一些标题中的换行符。假设我无法编辑源HTML,是否有CSS可以忽略这些中断的方法? 我正在移动网站的优化,所以我真的不想使用JavaScript。 问题答案: 使用css,您可以“隐藏” br标签,它们不会起作用: 如果只想在特定的标题类型中隐藏某些内容,只需使CSS更具体即可。