web-dev-qa-db-ja.com

GridLayoutに空のセルを残すように強制する方法はありますか?

2つのJPanelsがGridLayout(13、11)に設定されたJTabbedPaneがあります。最初のJPanelには、空のセルを残すのに十分な数のセルが入力されています。 enter image description here

2番目のJPanelでは、埋められるセルが大幅に少なくなり、その結果、各ボタンが引き伸ばされて行全体が埋められます。 enter image description here

GridLayoutに空のセルを尊重させる方法があるので、両方のJPanelのボタンは同じサイズですか?

8
Pentarctagon

ネストされたレイアウトを使用して、目的の結果を取得します。一部のレイアウトはコンポーネントの推奨サイズを尊重し、一部は尊重しません。 GridLayoutはそうではないものの1つです。 this answer を見て、どれが実行し、どれが実行しないかを確認してください。

たとえば、GridLayoutnestedの13個のボタンを別のJPanelFlowLayoutでネストできます。

JPanel p1 = new JPanel(new FlowLayout(FlowLayout.LEADING));
JPanel p2 = new JPanel(new GridLayout(13, 1));
for (int i = 0; i < 13; i++) {
    p2.add(new JButton("Button " + i));
}
p1.add(p2);

enter image description here

import Java.awt.FlowLayout;
import Java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test6 {

    public Test6() {
        JPanel p1 = new JPanel(new FlowLayout(FlowLayout.LEADING));
        JPanel p2 = new JPanel(new GridLayout(13, 1));
        for (int i = 0; i < 13; i++) {
            p2.add(new JButton("Button " + i));
        }
        p1.add(p2);

        JFrame frame = new JFrame("Test Card");
        frame.add(p1);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Test6 test = new Test6();
            }
        });
    }
}
7
Paul Samsotha

両方のJPanelのボタンが同じサイズになるようにGridLayoutに空のセルを尊重させる方法はありますか?

それは確かにGridLayoutで実行可能であり、テキストのないJLabelで空白の正方形を単に「埋める」。

例えば。これが2つのグリッドレイアウトで、どちらも3行に埋め込まれています。

Padded Grid Layout

import Java.awt.*;
import Java.awt.image.BufferedImage;
import Java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.LineBorder;

class FillGridLayout {

    public static final JComponent getPaddedGrid(
            ArrayList<BufferedImage> images, int width, int height) {
        JPanel p = new JPanel(new GridLayout(height, width, 2, 2));
        p.setBorder(new LineBorder(Color.RED));
        int count = 0;
        for (BufferedImage bi : images) {
            p.add(new JButton(new ImageIcon(bi)));
            count++;
        }
        for (int ii=count; ii<width*height; ii++ ) {
            // add invisible component
            p.add(new JLabel());
        }
        return p;
    }

    public static void main(String[] args) {
        final ArrayList<BufferedImage> images = new ArrayList<BufferedImage>();
        int s = 16;
        for (int ii = s/4; ii < s; ii+=s/4) {
            images.add(new BufferedImage(ii, s, BufferedImage.TYPE_INT_RGB));
            images.add(new BufferedImage(s, ii, BufferedImage.TYPE_INT_RGB));
        }
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JPanel gui = new JPanel(new BorderLayout(3,3));
                gui.add(getPaddedGrid(images, 3, 3), BorderLayout.LINE_START);
                gui.add(getPaddedGrid(images, 4, 3), BorderLayout.LINE_END);

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.Oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}
7
Andrew Thompson