在Swing中对齐垂直和水平顺序组

时间:2016-02-07 09:54:48

标签: java swing layout-manager grouplayout

我写了这段代码

<ul ng-repeat = "values in data">
<li>{{values.employeeCode}}</li>
<li>{{values.employeeFirstName}}</li>
<li>{{values.employeeLastName}}</li>
</ul>

,结果是

enter image description here

我想要的是将最后两个标签(totalLevels和levelDispaly)居中,并使它们取三列。我做了很多试验和游行。 请注意,窗格的左侧是空的,因为我已经删除了代码中不必要的部分,只是为了集中精力解决问题。

1 个答案:

答案 0 :(得分:4)

你很亲密 - 你陷入一个叫做的警告仍在为GroupLayout 开发直觉。有些人永远不会离开这个边界:)

enter image description here

除了笑话,这是你的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。)
    • p(par。)
      • s(Seq。)
        • P1
        • P2
        • P3
      • label1的
      • LABEL2

(未显示p1-p3下的组件。)

但是,由于hGroup现在只有1个孩子,因此您可以删除此多余的顶级序列组,并使hGroup成为该单个并行组。请记住,水平和垂直组都可以是顺序组或并行组之一。不要限制自己使两个方向顺序,因为这只会添加多余的组(它仍然可以工作):

  • hGroup(par。)
    • s(Seq。)
      • P1
      • P2
      • P3
    • label1的
    • LABEL2

以下是可以帮助您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;后,开始向该方向前进并按该明确顺序添加组件。如果订单中有多个具有相同位置的组件,则表示您需要在另一个方向添加组。

观察垂直(红色箭头)顺序组的以下原理图:

enter image description here

从上到下,订单的第一个位置有三个组件(红色矩形)。这意味着我们需要一个并行组来划分(分离)子层次结构中的每个组件(绿线)。这个过程一直持续到我们到达第一个标签,此时没有&#34;竞争&#34;组件,所以我们只添加该组件(红色矩形)。第二个标签也是如此。这是垂直组的代码的1对1。

观察水平(蓝色箭头)平行组的类似示意图:

enter image description here

从上到下,第一个位置有3个组件。这意味着我们需要添加一个顺序组。但是,这3个组件中的每一个都与其水平的其他组件共享其顺序位置。这意味着我们需要添加3个并行组(蓝色矩形)以便对组件进行分区。这3个并行组被添加到顺序组(绿色矩形)。然后我们到达第一个标签,然后添加该组件(绿色矩形)。第二个标签也是如此。这是水平组的代码的1对1。

<强>对齐

在你按照自己想要的方式获得组层次结构之前,我建议不要担心对齐。在链接组件的情况下(例如你的),对齐并不起作用,因为组件已经填满整个空间(自己检查)。完成所有设置后,设置对齐快速简便。

与布局相关的说明:

  • 在显示框架之前无需致电revalidaterepaint
  • 致电setSize(...)是多余的,因为您稍后致电pack(正如您所说)。
  • 您正在调用* setVisible(true)twice: once in main`和构造函数中的一个。其中一个没什么,只选一个。
  • 请勿在{{1​​}}上致电setPrefferedSize(...)。我甚至不确定你传递给它的东西(一些textShowLevel的东西)。您可以通过指定其包含的列数或覆盖其ImageObserver来设置其宽度。
  • 不要使用原始类型getPreferredSize(),您可能需要JComboBox
  • 我没有将面板添加到<String>,因为在我的上下文中没有任何意义。