我有一个带有包含子面板的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);
}
}
如果您执行这个版本,您可以看到按钮都是居中的,尽管设置了对齐方式。为什么会出现这种情况?有什么解决办法吗?在我的例子中,每个子面板都包含几个组件,我不想直接添加到主面板中。
非常感谢。
但他们是对齐的!
首先,setalignmentX
在JComponent级别更改属性,放置这些组件的布局可能使用也可能不使用这些信息。例如,boxlayout
使用它,但flowlayout
和borderlayout
不使用。
在您的情况下,您放置了一些面板与垂直的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更具体即可。