4

しばらくMiGLayoutを使用しておらず、コンポーネント間に自動的に配置されるスペースを削除する方法を思い出せません。次のパラメータを使用してみましたが、役に立ちませんでした(水平方向の間隔を維持したいことに注意してください)。

novisualpadding

パッド0

インセット0

成長する

これが私が意味することの例です: コンポーネント間のスペース

私が欲しいのは、行を2つずつグループ化することです。したがって、最初と2番目のJTextFields行の間にギャップがあってはなりません。でも、2列目と3列目のギャップを保ちたいです。3列目と4列目は隙間なくグループ化してほしい。

これが私のコードのレイアウトに関連する部分です(これはJPanelを拡張するクラスにあります):

setLayout(new MigLayout("insets 0", "grow"));

//Code to create the JTextFields not shown as it is not relevant

    for(int i = 0; i < textFields.length; ++i) {
        for(int j = 0; j < textFields[0].length; ++j) {
            textFields[i][j].setPreferredSize(new Dimension(80, 50));

            if(j == 0 && i % 2 == 0) //If it's the first JTextField in an even row
                add(textFields[i][j], "newline, split, gaptop 5, gapright 5");
            else if(j == 0 && i % 2 != 0) //If it's the first JTextField in an odd row
                add(textFields[i][j], "newline, split, gapright 5");
            else //if it's any other JTextField
                add(textFields[i][j], "gapright 5");

        }
    }

したがって、基本的には、ループを使用してすべてのコンポーネントを調べ、奇数行の上にギャップを設定します。これは、コンポーネントの行間にスペースが必要なためです。他のコンポーネントについては、そのギャップを除いて同じパラメーターを設定します。

最終的には、JPanelの同じ行からすべてのJTextFieldをグループ化し、代わりにJPanelsをレイアウトに追加しますが、現時点では重要ではありません。

4

2 に答える 2

6

デフォルトはプラットフォームに依存する「関連する」ギャップであるため、0幅のギャップを明示的に設定する必要があります。これは、レイアウトレベルまたは行/列レベルで実行できます。例えば:

setLayout(new MigLayout("gap rel 0", "grow"));

次に、奇数行に既存の制約を使用できます。

于 2012-07-23T08:00:49.427 に答える
5

LayoutConstraintsで削除する必要があります。ComponentConstraintsのギャップはデフォルトを増やすだけで、減らすことはできません。また、覚えておいてください。コンポーネントでsetXXSizeを使用することは絶対にありません:-)代わりに、ハードコードされたサイズが本当に必要な場合は、LayoutMangerで使用し、画面解像度に依存しない方法で実行することを検討してください。非常に強力な獣が手元にあります。プラス:レイアウトだけでなく、他のすべてのコード部分についても、繰り返してはいけません。最高の制約レイヤーで可能な限り定義するのが最善です。

一部のコードスニペット(背景画像を簡単に設定するためにSwingX JXPanelを使用)

int rows = 10;
int columns = 20;
MigLayout layout = new MigLayout(
        // set the automatic wrap after columns
        "insets 0, wrap " + columns, 
        // hardcode fixed column width and fixed column gap 
        "[50lp, fill]5lp", 
        // hardcode fixed height and a zero row gap
        "[20lp, fill]0");
JXPanel content = new JXPanel(layout);
content.setBackgroundPainter(new ImagePainter(XTestUtils.loadDefaultImage("moon.jpg")));
for (int r = 0; r < rows; r++) {
    // top gap on even rows
    String topGap = r != 0 && r % 2 == 0 ? "gaptop 5lp" : "";
    for (int i = 0; i < columns; i++) {
        JTextField field = new JTextField();
        content.add(field, topGap);
    }
}
showInFrame(content, "grid");

あなたの最後の文を見たばかりです:

最終的に、JPanelの同じ行からすべてのJTextFieldをグループ化し、代わりにJPanelsをレイアウトに追加します。

そうしないことを検討してください。ネストされたパネルは、強力ではないlayoutManagerにとっては手に負えないものであり、MigLayoutはオールインワン(または少なくともより大きな部分)のアプローチ用に設計されています。

多くの禁止事項について申し訳ありません:-)

于 2012-07-23T08:02:32.313 に答える