1

複数のユーザーがスクリーンショットを共有できるようにするプログラムを書いています。ユーザーが接続するたびに、「ルーム」に参加している全員 (互いにスクリーン ショットを受信できるユーザーの集まり) は、ユーザーが撮影したスクリーン ショットを見ることができるようになります。スクリーン ショットを表示できるようにするには、フレームを分割して、そのユーザーのスクリーン ショット専用のスペースを確保する必要があります。

コンポーネントを同じサイズの長方形に分割するため、GridLayout を使用することにしました。レイアウトは、1 つ問題があることを除けば、まさに私が必要としているものです。2 つの行と列があるように GridLayout を構成した場合、コンポーネントが 1 つしかない場合でも、一番下の行は 2 つの列に分割されます。これは予想される動作ですが、できれば別のレイアウトを使用せずにウォークアラウンドがありますか? GridLayout のシンプルさがとても気に入っています。BorderLayout の使用を検討しましたが、アイテムを配置できるスペースに一定の量があるため、制限があります。

写真の形式がサポートされていないため、この質問に埋め込むことができませんでした。フレームがいっぱいになった様子は次のとおりです。テストしているだけなので、実際のスクリーン ショットをボタンに置​​き換えました。

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

一番下の行からボタンを削除すると、次のようになります

一番下の行をどのように表示するかを次に示します

一番下の行をそのようにするにはどうすればよいですか? 他の行には 2 つの列が必要ですが、一番下の行だけに 1 つの列が必要であることに注意してください。

ありがとう!

4

3 に答える 3

2

私の知る限りでは、できません。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();
    }
}
于 2012-05-13T22:04:02.440 に答える
1

少し違うアプローチで行くことにしました。画面の数が偶数の場合は GridLayout を使用して別々の画面が非常にうまくレイアウトされるため、画面の数が奇数の場合は単純に画面をページに分割することにしました。

于 2012-05-14T03:31:49.777 に答える
0

を使用したいと思います-レイアウトGridBagLayoutのビジュアルガイドをチェックしてください

特に、 を使用するとGridBagLayout、 を使用してコンポーネントを追加できますGridBagConstraints。これにより、各コンポーネントを配置する場所を指定できますが、各コンポーネントの重みも指定できます。たとえば、GridBagLayout チュートリアルを参照してください。

于 2012-05-13T21:57:47.433 に答える