Java:强制组件填充GridLayout中的整行

Java:强制组件填充GridLayout中的整行,java,swing,layout,split,grid-layout,Java,Swing,Layout,Split,Grid Layout,我正在编写一个程序,允许多个用户共享屏幕截图。每次用户连接时,参与“房间”的每个人(一群能够相互接收屏幕截图的用户)都能够看到用户拍摄的屏幕截图。为了能够看到屏幕截图,帧需要将自身拆分,以便为该用户的屏幕截图留出专用空间 我决定使用GridLayout,因为它将组件拆分为大小相等的矩形,这正是我所寻找的。布局正是我所需要的,除了有一个问题。如果我将GridLayout配置为有两行和两列,则即使只有一个组件,最底层的行仍将被拆分为两列。这是预期的行为,但是否有漫游,最好不使用不同的布局?我真的很喜

我正在编写一个程序,允许多个用户共享屏幕截图。每次用户连接时,参与“房间”的每个人(一群能够相互接收屏幕截图的用户)都能够看到用户拍摄的屏幕截图。为了能够看到屏幕截图,帧需要将自身拆分,以便为该用户的屏幕截图留出专用空间

我决定使用GridLayout,因为它将组件拆分为大小相等的矩形,这正是我所寻找的。布局正是我所需要的,除了有一个问题。如果我将GridLayout配置为有两行和两列,则即使只有一个组件,最底层的行仍将被拆分为两列。这是预期的行为,但是否有漫游,最好不使用不同的布局?我真的很喜欢GridLayout的简单性。我曾考虑过使用BorderLayout,但它是有限的,因为我可以在一定数量的空间中放置项目

图片的格式不受支持,因此我无法将其嵌入此问题。 这是框架看起来是满的。我用实际的屏幕截图代替按钮,因为我只是在测试。 下面是我从最下面一行移除按钮时的外观: 下面是我希望最下面一行的外观:

我怎样才能使最下面的一行看起来像那样?请记住,我仍然希望其他行有两列,但我只希望最底部的一行有一列。
谢谢

我想您应该使用
GridBagLayout
-查看


特别是,使用
GridBagLayout
,可以添加带有
GridBagConstraints
的组件。这允许您指定每个组件应放置的位置,以及每个组件应具有的重量-例如,请参阅。

据我所知,您不能。GridLayout就是这样做的

但是GridBagLayout将为您的程序做一个漂亮的工作

看看这个小演示,它按行和列排列按钮。 (单击按钮将其删除)

导入java.awt.Component;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.Timer;
公共类Test4{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame();
final JPanel root=new JPanel(new GridBagLayout());
frame.add(根);
框架。设置尺寸(600600);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
计时器t=新计时器(2000,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
final JButton b=newjbutton(“Hello”+root.getComponentCount());
b、 addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
根。移除(b);
更新应变(根);
}
});
加上(b);
更新应变(根);
}
});
t、 start();
}
});
}
受保护的静态void updateConstraints(JPanel root){
if(!(根.getLayout()实例GridBagLayout)){
System.err.println(“无网格布局”);
返回;
}
GridBagLayout=(GridBagLayout)root.getLayout();
int count=root.getComponentCount();
int col=(int)Math.round(Math.sqrt(count));
int row=(int)Math.ceil((double)count/col);
GridBagConstraints gbc=新的GridBagConstraints();
gbc.fill=GridBagConstraints.BOTH;
gbc.weightx=1.0;
gbc.weighty=1.0;
int指数=0;
对于(int i=0;i
我决定采用稍微不同的方法。由于当屏幕数量为偶数时,使用GridLayout可以很好地布置单独的屏幕,因此如果屏幕数量为奇数,我决定简单地将屏幕拆分为页面。

对于我所寻找的内容来说,这太复杂了。我知道它可以满足我的需要,但GridBagLayout提供的其他一切对我来说都是无用的。
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Test4 {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();

                final JPanel root = new JPanel(new GridBagLayout());
                frame.add(root);
                frame.setSize(600, 600);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
                Timer t = new Timer(2000, new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        final JButton b = new JButton("Hello" + root.getComponentCount());
                        b.addActionListener(new ActionListener() {

                            @Override
                            public void actionPerformed(ActionEvent e) {
                                root.remove(b);
                                updateConstraints(root);
                            }
                        });
                        root.add(b);
                        updateConstraints(root);
                    }
                });
                t.start();
            }
        });
    }

    protected static void updateConstraints(JPanel root) {
        if (!(root.getLayout() instanceof GridBagLayout)) {
            System.err.println("No a gridbaglayout");
            return;
        }
        GridBagLayout layout = (GridBagLayout) root.getLayout();
        int count = root.getComponentCount();
        int col = (int) Math.round(Math.sqrt(count));
        int row = (int) Math.ceil((double) count / col);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        int index = 0;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                gbc.gridx = j;
                gbc.gridy = i;
                boolean last = index + 1 == count;
                if (last) {
                    gbc.gridwidth = col - j;
                }
                Component c = root.getComponent(index);
                layout.setConstraints(c, gbc);
                if (last) {
                    break;
                }
                index++;
            }
        }
        root.doLayout();
    }
}