Java 为什么GroupLayout没有按要求生成结果

Java 为什么GroupLayout没有按要求生成结果,java,layout,frame,grouplayout,Java,Layout,Frame,Grouplayout,在这里,我想按照足球中的4-3-3阵型添加按钮,但我得到了3-3-3。如何将4个按钮放在一行?? 我已被转介到此网站: 代码: import java.awt.*; 导入javax.swing.*; 导入java.awt.event.*; 导入静态javax.swing.GroupLayout.Alignment.*; 类Abc扩展了JFrame { JButton b[]; Abc() { b=新的JButton[11]; JPanel jp=新的JPanel(); 对于(int i=0;i我

在这里,我想按照足球中的4-3-3阵型添加按钮,但我得到了3-3-3。如何将4个按钮放在一行?? 我已被转介到此网站:

代码:

import java.awt.*;
导入javax.swing.*;
导入java.awt.event.*;
导入静态javax.swing.GroupLayout.Alignment.*;
类Abc扩展了JFrame
{
JButton b[];
Abc()
{
b=新的JButton[11];
JPanel jp=新的JPanel();

对于(int i=0;i我找到了两种方法来做你想要的事情;将按钮居中结果表明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。我个人有一两个supporter类,允许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();

    }
}

你想要的结果不清楚。你说你想要“足球中的4-3-3”,但我不知道这意味着什么。你没有说你想要4是一行还是一列,或者在哪一端。你说你得到了3-3-3,但实际上你在输出上有10个按钮。你没有说你尝试了什么,或者你想要哪个按钮。我们大多数人都不想只是四处闲逛,希望意外地得到答案我想要一个由4行3列组成的输出第一行由3个按钮组成第二行与第一行相同,第三行包含4个按钮,最后第四行在centerOk中包含一个按钮再深入一点,但我现在没时间花在上面了。首先弄清楚你想让你的四个按钮排成什么样子——前三个按钮是与前两行的三个按钮排成一行,还是你想让所有四个按钮都分散在一起,并各自居中?这将告诉你是否要将这些行与前两行中的按钮处于相同的垂直分组中。每个分组对应于一个垂直或水平行。尝试发布一张您想要的图片。这对我来说有点困难。虽然它看起来很好。您能否仅使用GroupLayout给我相同的结果。我在java中没有您那么好。先生,p请给我一个简单的方法来解决我的问题。有什么方法可以让我合并不同的布局并得到所需的结果吗?我想我已经为你做了足够多的编程了。可能有一种更简单的方法可以做到这一点,但我不知道有哪种。如果这超出了你目前的编程能力,答案不一定是肯定的更容易编程。标准布局管理器可能不是适合您工作的工具;它们的目的是更容易创建标准UI——窗口
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();

    }
}