Java的:迫使部分填满整行的网格布局(Java: forcing a component to f

2019-10-16 17:25发布

我写一个程序,允许多个用户共享截图。 每个用户连接时间,大家谁是参加了“房间”(一堆是能够从彼此接收屏幕截图的用户)变得能够看到一个截屏的用户需要。 为了能够看到屏幕截图,该框架也需要将自身拆分,以便有针对该用户的屏幕快照专用的空间。

我决定,因为它分裂成组件这是我所期待的同等大小的矩形使用网格布局。 布局不正是我需要它,但有一个问题。 如果我在我的网格布局配置有两行和列中,最底排还是会分成两列,即使只有一个单一组分。 这是正常现象,但有一个步行约,最好不使用不同的布局? 我真的很喜欢网格布局的简单性。 我曾考虑使用BorderLayout的,但它是有限的,因为存在的空间在哪里可以放置物品的一组量。

不支持的图片格式,所以我不能它们嵌入到这个问题。 下面是框架的样子很全。 我取代实际截屏按钮,因为我只是测试。

http://cl.ly/0N311g3w061P1B0W1T3s/Screen%20shot%202012-05-13%20at%204.23.25%20PM.png

现在,这里是它的外观时,我从最底排删除按钮: http://cl.ly/2j3Z0V1r3w1S3F160j05/Screen%20shot%202012-05-13%20at%204.23.41%20PM.png

这里是我想要的最底排看: http://cl.ly/0J2R2y2L06151F0k0Y0i/Screen%20shot%202012-05-13%20at%204.24.11%20PM.png

我怎样才能使最底排的样子吗? 请记住,我仍然希望其他行有两列,但我只想要最底端的一个有一列。

谢谢!

Answer 1:

据我所知,你不能。 网格布局完成这种方式。

不过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();
    }
}


Answer 2:

我决定去一个稍微不同的方法。 由于不同的屏幕布局真的很好用网格布局时,有偶数数量的屏幕,我决定索性屏幕分成页,如果有画面的量。



Answer 3:

我想你想使用GridBagLayout -检查出的视觉引导布局

特别是,与GridBagLayout ,添加组件用GridBagConstraints 。 这使您可以指定每个组件应放,还能有什么重量的每个组件应该有-例如,看到的GridBagLayout教程 。



文章来源: Java: forcing a component to fill up the entire row in a GridLayout