13

GridBagLayout マネージャーで GridLayout の動作を完全にエミュレートすることは可能ですか?

基本的に、各セルの幅と高さが同じである 8x8 グリッドがあります。GridLayout はこれを自動的に行いました。しかし、サイズが他の行と同じではないグリッドに別の行と列を追加したいと思います。その行/列は、残っている可能性のある残りのスペースをすべて占有する必要があります (使用可能なサイズを 8 つのセルに均等に分散できないため)。それは可能ですか、それとも別のレイアウト マネージャーを使用する必要がありますか?

編集

これは、私が達成したいことの単純な図であり、4 つのセルに単純化されています。 問題のグラフィック

色付きのセルは、同じ高さと幅のセルを持つ実際のグリッド (灰色) に追加したものxです。したがって、グリッドの高さと幅は4*xです。追加のセルに、必要な幅/高さ (minimumSize) と、フル サイズの残りの幅/高さを加えたいと思います。

パネル全体のサイズが変更された場合、灰色のグリッド セルが再び可能な限り多くのスペースを占有する必要があります。

4

5 に答える 5

3

固定セルのweightxおよびweightyをに設定し、 をおよびに設定します。フローティング セルを に設定し、水平方向にのみ拡張するフローティング セルを に設定し、垂直方向に拡張するセルを に設定します。GridBagConstraints0fillNONEfillBOTHweightx1weighty1

セルはコンテンツがある場合にのみ拡張されるため、何かを入力する必要があります。sを選択JLabelし、固定セルのラベルに固定サイズを設定しました。サイズ変更時には、寸法を再計算し、レイアウトを再計算するために呼び出す必要がありinvalidate()ます。

以下はwxhグリッドの例です。

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class GridBag {
    public static void main(String[] args) {
        final JFrame f = new JFrame("Gridbag Test");
        final Container c = f.getContentPane();
        c.setLayout(new GridBagLayout());

        final Dimension dim = new Dimension(70, 70);
        final int w = 4;
        final int h = 4;
        final JLabel[] yfloating = new JLabel[w];
        final JLabel[] xfloating = new JLabel[h];
        final JLabel[][] fixed = new JLabel[w][h];

        // adding the vertically floating cells
        final GridBagConstraints gc = new GridBagConstraints();
        gc.fill = GridBagConstraints.BOTH;
        gc.weightx = 0.0;
        gc.weighty = 1.0;
        for(int i = 0; i < w; ++i) {
            yfloating[i] = new JLabel("floating " + i);
            yfloating[i].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            yfloating[i].setHorizontalTextPosition(JLabel.CENTER);
            yfloating[i].setVerticalTextPosition(JLabel.CENTER);
            gc.gridy = 0;
            gc.gridx = i+1;
            c.add(yfloating[i], gc);
        }

        // adding the horizontally floating cells
        gc.fill = GridBagConstraints.BOTH;
        gc.weightx = 1.0;
        gc.weighty = 0.0;
        for(int i = 0; i < w; ++i) {
            xfloating[i] = new JLabel("floating " + i);
            xfloating[i].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            xfloating[i].setHorizontalTextPosition(JLabel.CENTER);
            xfloating[i].setVerticalTextPosition(JLabel.CENTER);
            gc.gridy = i+1;
            gc.gridx = 0;
            c.add(xfloating[i], gc);
        }

        // adding the fixed cells
        gc.fill = GridBagConstraints.NONE;
        gc.weightx = 0.0;
        gc.weighty = 0.0;
        for(int i = 0; i < w; ++i) {
            for(int j = 0; j < h; ++j) {
                fixed[i][j] = new JLabel("fixed " + i);
                fixed[i][j].setBorder(BorderFactory.createLineBorder(Color.BLACK));
                fixed[i][j].setMaximumSize(dim);
                fixed[i][j].setMinimumSize(dim);
                fixed[i][j].setPreferredSize(dim);

                gc.gridx = i+1;
                gc.gridy = j+1;
                c.add(fixed[i][j], gc);
            }
        }

        c.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                final Component comp = e.getComponent();
                final int newSize = Math.min(comp.getHeight() / h, comp.getWidth() / w);
                final Dimension newDim = new Dimension(newSize, newSize);
                for(int i = 0; i < w; ++i) {
                    for(int j = 0; j < h; ++j) {
                        fixed[i][j].setMaximumSize(newDim);
                        fixed[i][j].setMinimumSize(newDim);
                        fixed[i][j].setPreferredSize(newDim);
                    }
                }
                comp.invalidate();
            }
        });

        f.pack();
        f.setVisible(true);
    }
}
于 2010-09-14T04:26:21.543 に答える
1

必ずしも GridBagLayout に縛られていない場合は、MigLayoutライブラリを調べる必要があります。次の行に沿って何かを行うことができます。

MigLayout layout = new MigLayout(
        "",         // Layout Constraints
        "[10][10][10][10]", // Column constraints
        "[10][10][10][10]");  // Row constraints
于 2010-10-01T02:35:15.293 に答える
0

JTable でこれを行っていない理由はありますか? まさにそのために作られたもののようです。適切なセル レンダラーを使用すると、必要なものをセルに配置できます。

http://www.java2s.com/Code/Java/Swing-Components/TableRowHeaderExample.htm

于 2010-10-02T16:46:59.963 に答える
0

すべての値は で設定されますGridBagConstraints

8x8 グリッドを固定したい場合は、ipadxとのipady値を設定できます。

次に、新しい行/列のweightxとの値を に設定し、 に設定します。weighty1.0fillFULL

余分な行/列は、残ったスペースで拡張されます。

8x8 グリッドも拡張する場合は、さらに複雑になります。との値に加えてipadxとの値も調整できます。または、8x8 グリッドのパネルを作成し、そこで使用します。パネルと追加の行/列で使用します。ipadyweightxweightyGridLayoutGridBagLayout

于 2010-09-12T15:42:46.777 に答える
-2

組み込みのレイアウト マネージャーでさまざまなことを試した後、この問題にも対応するカスタム レイアウト マネージャーを作成することにしました。このプロジェクトを続行する時間がなかったので、まだ行っていませんが、完了したら、レイアウト マネージャーのコードをここに投稿して、同様のソリューションに興味のある人がいるようにします。使用できます。

編集

didxgaは、自分のソリューションを投稿したかったことをコメントで思い出させてくれました。しかし、当時のプロジェクトを掘り出して見たところ、実際にソリューションを作成できなかったことが判明したため、ソリューションを投稿できません!

それは 2010 年 9 月中旬に公式に終了した uni プロジェクトでした。実際にはその後も作業を続けたかったので、投稿すると言ったのはおそらくそのためです (これは私が改善したかったことの 1 つだったからです)。悲しいことに。代わりに、余分な列と行を単に省略しました (これは行/列のラベルとして意図されていました)。

そうそう、私が最初に望んでいたレイアウトを投稿できなくて本当に申し訳ありません…:(もしそのようなレイアウトのリクエストが十分にあれば、私はそれを作成するでしょうが、今のところ、私は本当に喜んでいません。再び Java レイアウトに飛び込みます ;)

于 2010-10-02T17:49:07.347 に答える