我写了这段代码
<ul ng-repeat = "values in data">
<li>{{values.employeeCode}}</li>
<li>{{values.employeeFirstName}}</li>
<li>{{values.employeeLastName}}</li>
</ul>
,结果是
我想要的是将最后两个标签(totalLevels和levelDispaly)居中,并使它们取三列。我做了很多试验和游行。 请注意,窗格的左侧是空的,因为我已经删除了代码中不必要的部分,只是为了集中精力解决问题。
答案 0 :(得分:4)
你很亲密 - 你陷入一个叫做的警告仍在为GroupLayout
开发直觉。有些人永远不会离开这个边界:)
除了笑话,这是你的MCVE有一些变化:
public class MainFrame extends JFrame {
private int levels;
private int slots;
private JLabel labelShowLevel;
private JFormattedTextField textShowLevel;
private JButton buttonShowLevel;
private JLabel labelAddEntity;
private JFormattedTextField textAddEntity;
private JButton buttonAddEntity;
private JComboBox cb;
private JLabel labelRemoveEntity;
private JFormattedTextField textRemoveEntity;
private JButton buttonRemoveEntity;
private JLabel labelSearchEntity;
private JFormattedTextField textSearchEntity;
private JButton buttonSearchEntity;
private JLabel labelEmptySlots;
private JButton buttonEmptySlots;
private JLabel levelDispaly;
private JLabel totalLevels;
public MainFrame(int levels, int slots) {
this.levels = levels;
this.slots = slots;
getContentPane().add(CreatPanel());
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
}
JPanel CreatPanel() {
JPanel panel = new JPanel();
labelShowLevel = new JLabel("Display Level");
labelAddEntity = new JLabel("Enter new car/motorbike");
labelRemoveEntity = new JLabel("Exit car/motorbike");
labelSearchEntity = new JLabel("Find car/motorbike");
labelEmptySlots = new JLabel("Get total empty slots");
textShowLevel = new JFormattedTextField();
textAddEntity = new JFormattedTextField();
textRemoveEntity = new JFormattedTextField();
textSearchEntity = new JFormattedTextField();
textShowLevel.setPreferredSize(new Dimension(100, HEIGHT));
buttonShowLevel = new JButton("Show");
buttonAddEntity = new JButton("Enter");
buttonRemoveEntity = new JButton("Exit");
buttonSearchEntity = new JButton("Search");
buttonEmptySlots = new JButton("Find");
Font font = new Font("sans comic", Font.ITALIC, 18);
levelDispaly = new JLabel("Now Displaying Level 0");
levelDispaly.setFont(font);
totalLevels = new JLabel("Total Levels:"+ this.levels + " Total slots per level:"
+ this.slots);
String[] items = {"Car", "Motorbike"};
cb = new JComboBox(items);
cb.setSelectedItem(items[0]);
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
layout.linkSize(SwingConstants.HORIZONTAL, buttonShowLevel, buttonAddEntity, buttonRemoveEntity, buttonSearchEntity, buttonEmptySlots);
//@formatter:off
// Horizontal
GroupLayout.ParallelGroup hGroup = layout.createParallelGroup(Alignment.CENTER); // Will align the labels the way you wanted
hGroup.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup()
.addComponent(labelShowLevel)
.addComponent(labelAddEntity)
.addComponent(labelRemoveEntity)
.addComponent(labelSearchEntity)
.addComponent(labelEmptySlots))
.addGroup(layout.createParallelGroup()
.addComponent(textShowLevel)
.addComponent(textAddEntity)
.addComponent(cb)
.addComponent(textRemoveEntity)
.addComponent(textSearchEntity))
.addGroup(layout.createParallelGroup()
.addComponent(buttonShowLevel)
.addComponent(buttonAddEntity)
.addComponent(buttonRemoveEntity)
.addComponent(buttonSearchEntity)
.addComponent(buttonEmptySlots)));
hGroup.addComponent(levelDispaly);
hGroup.addComponent(totalLevels);
layout.setHorizontalGroup(hGroup);
// Vertical
GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
vGroup.addGroup(layout.createParallelGroup()
.addComponent(labelShowLevel)
.addComponent(textShowLevel)
.addComponent(buttonShowLevel));
vGroup.addGroup(layout.createParallelGroup()
.addComponent(labelAddEntity)
.addComponent(textAddEntity));
vGroup.addGroup(layout.createParallelGroup()
.addComponent(cb)
.addComponent(buttonAddEntity));
vGroup.addGroup(layout.createParallelGroup()
.addComponent(labelRemoveEntity)
.addComponent(textRemoveEntity)
.addComponent(buttonRemoveEntity));
vGroup.addGroup(layout.createParallelGroup()
.addComponent(labelSearchEntity)
.addComponent(textSearchEntity)
.addComponent(buttonSearchEntity));
vGroup.addGroup(layout.createParallelGroup()
.addComponent(labelEmptySlots)
.addComponent(buttonEmptySlots));
vGroup.addGroup(layout.createParallelGroup()
.addComponent(levelDispaly));
vGroup.addGroup(layout.createParallelGroup()
.addComponent(totalLevels));
layout.setVerticalGroup(vGroup);
//@formatter:on
return panel;
}
public static void main(String args[]) {
EventQueue.invokeLater(() -> new MainFrame(5, 5));
}
}
您的问题出在水平组中。您限制标签与左列对齐。作为一般经验法则,如果您想要在某个方向上不受限制(可以自由对齐)的组件,那么您需要添加另一个&#34;级别&#34;在那个方向的等级中的群体。
具体来说,从水平代码中删除2个标签后,您将得到一个顺序组(在您的情况下为hGroup
),其中包含并行组。由于2个标签不与这些组对齐,因此必须将它们添加到非hGroup
的连续组中。这意味着如果hGroup
是连续的,那么它将有一个&#34; child&#34;并行组,其下面将包含新的顺序组(替换hGroup
)以及2个标签:
hGroup
(seq。)
(未显示p1-p3下的组件。)
但是,由于hGroup
现在只有1个孩子,因此您可以删除此多余的顶级序列组,并使hGroup
成为该单个并行组。请记住,水平和垂直组都可以是顺序组或并行组之一。不要限制自己使两个方向顺序,因为这只会添加多余的组(它仍然可以工作):
hGroup
(par。)
以下是可以帮助您GroupLayout
的一般思维模式。请注意,有很多方法可以考虑这些并提出其他解释。使用Grouplayout
一段时间后,这将变得非常直观。
选择正确类型的父组
如果您想知道您的垂直/水平组是顺序还是平行,只需查看&#34;管理方向&#34;。 &#34;管理方向&#34;是你可以明确地告诉最高级别组件顺序的方向。
在您的情况下,让我们看一下垂直组。从上到下查看时,您可以明确地从上到下分析组件(或其组)的顺序,但不能从左到右分辨,因为最后2个标签不具有明确的从左到右的顺序对于其他组件 - 这两个标签由对齐确定。然后
Vertical group && Vertical governing direction == Sequential group
对于水平组,您只能告诉从上到下的顺序:
Horizontal group && Vertical governing direction == Parallel group
如果没有单一的管理方向&#34;,您可以选择其中之一。想象一个2x2网格,有4个布局层次结构,它们将获得相同的结果。
如果您犯了错误并以错误类型的组结束,您将拥有一个仅包含另一种类型的1个子组的组。然后你可以削减那个顶级组。
创建群组层次结构
选择&#34;管理方向&#34;后,开始向该方向前进并按该明确顺序添加组件。如果订单中有多个具有相同位置的组件,则表示您需要在另一个方向添加组。
观察垂直(红色箭头)顺序组的以下原理图:
从上到下,订单的第一个位置有三个组件(红色矩形)。这意味着我们需要一个并行组来划分(分离)子层次结构中的每个组件(绿线)。这个过程一直持续到我们到达第一个标签,此时没有&#34;竞争&#34;组件,所以我们只添加该组件(红色矩形)。第二个标签也是如此。这是垂直组的代码的1对1。
观察水平(蓝色箭头)平行组的类似示意图:
从上到下,第一个位置有3个组件。这意味着我们需要添加一个顺序组。但是,这3个组件中的每一个都与其水平的其他组件共享其顺序位置。这意味着我们需要添加3个并行组(蓝色矩形)以便对组件进行分区。这3个并行组被添加到顺序组(绿色矩形)。然后我们到达第一个标签,然后添加该组件(绿色矩形)。第二个标签也是如此。这是水平组的代码的1对1。
<强>对齐强>
在你按照自己想要的方式获得组层次结构之前,我建议不要担心对齐。在链接组件的情况下(例如你的),对齐并不起作用,因为组件已经填满整个空间(自己检查)。完成所有设置后,设置对齐快速简便。
与布局相关的说明:
revalidate
和repaint
。setSize(...)
是多余的,因为您稍后致电pack
(正如您所说)。twice: once in
main`和构造函数中的一个。其中一个没什么,只选一个。setPrefferedSize(...)
。我甚至不确定你传递给它的东西(一些textShowLevel
的东西)。您可以通过指定其包含的列数或覆盖其ImageObserver
来设置其宽度。getPreferredSize()
,您可能需要JComboBox
。<String>
,因为在我的上下文中没有任何意义。