为什么GroupLayout没有按要求得到结果

时间:2015-01-06 14:48:19

标签: java layout frame grouplayout

在这里我想按照足球中的4-3-3阵型添加按钮,但我得到3-3-3。我怎么能把4个按钮放在一排? 我已被推荐到此网站:https://weblogs.java.net/blog/tpavek/archive/2006/02/getting_to_know_2.html

代码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import static javax.swing.GroupLayout.Alignment.*;

class Abc extends JFrame
{
JButton b[];

Abc()
{
b=new JButton[11];
JPanel jp=new JPanel();
for(int i=0;i<b.length;i++)
{
b[i]=new JButton();
}
GroupLayout layout=new GroupLayout(jp);
jp.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);

layout.setHorizontalGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(LEADING)
.addComponent(b[0])
.addComponent(b[1])
    .addGroup(layout.createSequentialGroup())
    .addComponent(b[2])
    .addComponent(b[3]))
.addGroup(layout.createParallelGroup(LEADING)
.addComponent(b[4])
.addComponent(b[5])
    .addGroup(layout.createSequentialGroup())
    .addComponent(b[6]))
.addComponent(b[7])
.addGroup(layout.createParallelGroup(LEADING)
.addComponent(b[8])
.addComponent(b[9])
    .addGroup(layout.createSequentialGroup())
    .addComponent(b[10]))
);
layout.setVerticalGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(BASELINE)
.addComponent(b[0])
.addComponent(b[4])
.addComponent(b[8]))

.addGroup(layout.createParallelGroup(BASELINE)
.addComponent(b[1])
.addComponent(b[5])
.addComponent(b[9]))
.addGroup(layout.createParallelGroup(BASELINE)
.addComponent(b[2])
.addComponent(b[3])
.addComponent(b[6])
.addComponent(b[10]))

.addComponent(b[7])
);
setTitle("kuvh b");
setSize(1000,1000);
for(int i=0;i<11;i++)
{
add(b[i]);
}
add(jp);
pack();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel(
                                  "javax.swing.plaf.metal.MetalLookAndFeel");
                                //  "com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                                //UIManager.getCrossPlatformLookAndFeelClassName());
                } catch (Exception ex) {
                    ex.printStackTrace();

           }
                new Abc().setVisible(true);
            }
        });
    }
}

我想用这个形成4-3-3阵型的结构。请帮我 代码导致3-3-3形成。第三排有3个按钮但是我想要4我该怎么办请帮助

查看输出: [1]:

  1. http://imgur.com/jxADf2t
  2. 我希望我能尽可能找到我的解决方案

1 个答案:

答案 0 :(得分:0)

我找到了两种方法来做你想做的事情;使按钮居中是Swing不能轻易做到的事情,但是中心组件可能不像其他对齐那样常见。

您可以将组件置于FlowLayout中心; FlowLayout的缺点是,如果用户将窗口缩小到组件不再适合的点,则布局将包装组件。这对某些事情非常有用,但不适合你的足球运动员。我把我的例子包裹在一个滚动条中,所以这不会发生。

中心组件的另一种方法是使用GroupLayout,但GroupLayout不适合您尝试实现的整体布局。 GroupLayout适用于你有整体行和列的地方,你的四行足球运动员没有垂直排列,只是横向排列。但是你可以使用GroupLayout的居中特性来进行水平居中,并为每一行创建一个单独的GroupLayout。

我的示例使用FlowLayout作为第一行,GroupLayout作为第二行,只是为了展示它是如何完成的。我没有解决球员之间出现差距的问题。窗口做得足够大时的线条。特别是对于示例,我不使用将方法调用添加到其他方法调用和构造函数的样式;我认为这种风格的深层嵌套括号和非直截了当的逻辑使得更难以弄清楚(或跟踪)正在发生的事情。

你也可以使用GridBagLayout来集中内容,但如果其他任何东西能满足我的需求,我根本不会使用它。

我希望这能回答你的问题。

package grouplayout;

import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Main2 extends JFrame
{
    public static void main(String ... arguments)
    {
        Main2 main2 = new Main2();
        main2.createUI();
        main2.setVisible(true);
    }

    public void createUI()
    {
        JPanel wingPanel = new JPanel();
        FlowLayout flowLayout = new FlowLayout();
        flowLayout.setHgap(35);
        wingPanel.setLayout(flowLayout);

        JButton btnone = new JButton("Lwing");
        JButton btntwo = new JButton("center");
        JButton btnthr = new JButton("Rwing");
        wingPanel.add(btnone);
        wingPanel.add(btntwo);
        wingPanel.add(btnthr);

        // -------------------------------------------

        JButton mid1 = new JButton("mid1");
        JButton mid2 = new JButton("mid2");
        JButton mid3 = new JButton("mid3");
        JButton mid4 = new JButton("mid4");
        JPanel midfieldPanel = new JPanel();
        GroupLayout groupLayout = new GroupLayout(midfieldPanel);

        GroupLayout.SequentialGroup horizontalGroup = groupLayout.createSequentialGroup();
        groupLayout.setHorizontalGroup(horizontalGroup);
        horizontalGroup.addComponent(mid1);
        horizontalGroup.addComponent(mid2);
        horizontalGroup.addComponent(mid3);
        horizontalGroup.addComponent(mid4);

        GroupLayout.SequentialGroup verticalGroup = groupLayout.createSequentialGroup();
        groupLayout.setVerticalGroup(verticalGroup);

        GroupLayout.ParallelGroup midButtonGroup = groupLayout.createParallelGroup(GroupLayout.Alignment.CENTER);
        midButtonGroup.addComponent(mid1);
        midButtonGroup.addComponent(mid2);
        midButtonGroup.addComponent(mid3);
        midButtonGroup.addComponent(mid4);

        verticalGroup.addGroup(midButtonGroup);

        JPanel teamPanel = new JPanel();
        BoxLayout boxLayout = new BoxLayout(teamPanel, BoxLayout.PAGE_AXIS);
        teamPanel.setLayout(boxLayout);

        teamPanel.add(wingPanel);
        teamPanel.add(midfieldPanel);

        JScrollPane scrollPane = new JScrollPane(teamPanel);
        getContentPane().add(scrollPane);

        pack();

    }
}

编辑:根据要求,下面只对GroupLayout做同样的事情。

两个群组之间没有互动,因为GroupLayout会对齐列中的内容,而您的播放器不在列中。

是的,我认为这很难 - 据我理解,GroupLayout真的是供GUI构建工具使用,而不是真正用于手工构建UI。我个人有一两个支持者类允许使用稍微简单的逻辑构建GroupLayout UI。但无论如何,我认为你需要了解构建模块:

GroupLayout允许 - 并且要求 - 将每个组件独立地放置在水平和垂直行/列位置;这很有用,因为许多UI需要混合组件和可变额外组件的行和列。

尺寸X中的连续成分组按尺寸X顺序排列;尺寸X中的平行组也顺序排列,但垂直于尺寸X.

布局保持了首选的组件尺寸;行宽和列高设置为构成组件的最大首选大小。

整个GroupLayout对象有一个垂直分组和一个水平分组;在其中,创建顺序和并行组以创建所需的整体布局。

我知道我读过的教程中的示例不会创建单独的变量来保存内部顺序和并行组,而更喜欢使用new X().addComponent().addGroup()之类的表单。但我认为这样做更难理解代码实际在做什么,而不是更容易;并且嵌套的括号成为他们自己的维护问题。所以我认为这是一种更好的做事方式,特别是那些刚开始使用这种布局的人。

package grouplayout;

import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Main3 extends JFrame
{
    public static void main(String ... arguments)
    {
        Main3 main2 = new Main3();
        main2.createUI();
        main2.setVisible(true);
    }

    public void createUI()
    {
        JButton btnone = new JButton("Lwing");
        JButton btntwo = new JButton("center");
        JButton btnthr = new JButton("Rwing");

        JPanel wingPanel = new JPanel();
        GroupLayout wingGroupLayout = new GroupLayout(wingPanel);

        GroupLayout.SequentialGroup wingHorizontalGroup = wingGroupLayout.createSequentialGroup();
        wingGroupLayout.setHorizontalGroup(wingHorizontalGroup);
        wingHorizontalGroup.addComponent(btnone);
        wingHorizontalGroup.addComponent(btntwo);
        wingHorizontalGroup.addComponent(btnthr);

        GroupLayout.SequentialGroup wingVerticalGroup = wingGroupLayout.createSequentialGroup();
        wingGroupLayout.setVerticalGroup(wingVerticalGroup);

        GroupLayout.ParallelGroup wingButtonGroup = wingGroupLayout.createParallelGroup();
        wingButtonGroup.addComponent(btnone);
        wingButtonGroup.addComponent(btntwo);
        wingButtonGroup.addComponent(btnthr);

        wingVerticalGroup.addGroup(wingButtonGroup);

        // -------------------------------------------

        JButton mid1 = new JButton("mid1");
        JButton mid2 = new JButton("mid2");
        JButton mid3 = new JButton("mid3");
        JButton mid4 = new JButton("mid4");
        JPanel midfieldPanel = new JPanel();
        GroupLayout groupLayout = new GroupLayout(midfieldPanel);

        GroupLayout.SequentialGroup horizontalGroup = groupLayout.createSequentialGroup();
        groupLayout.setHorizontalGroup(horizontalGroup);
        horizontalGroup.addComponent(mid1);
        horizontalGroup.addComponent(mid2);
        horizontalGroup.addComponent(mid3);
        horizontalGroup.addComponent(mid4);

        GroupLayout.SequentialGroup verticalGroup = groupLayout.createSequentialGroup();
        groupLayout.setVerticalGroup(verticalGroup);

        GroupLayout.ParallelGroup midButtonGroup = groupLayout.createParallelGroup(GroupLayout.Alignment.CENTER);
        midButtonGroup.addComponent(mid1);
        midButtonGroup.addComponent(mid2);
        midButtonGroup.addComponent(mid3);
        midButtonGroup.addComponent(mid4);

        verticalGroup.addGroup(midButtonGroup);

        JPanel teamPanel = new JPanel();
        BoxLayout boxLayout = new BoxLayout(teamPanel, BoxLayout.PAGE_AXIS);
        teamPanel.setLayout(boxLayout);

        teamPanel.add(wingPanel);
        teamPanel.add(midfieldPanel);

        JScrollPane scrollPane = new JScrollPane(teamPanel);
        getContentPane().add(scrollPane);

        pack();

    }
}