3

非常に簡単な質問:2つを含む2つのセル間の垂直方向のギャップをどのように取り除くことができJCheckBoxますか?写真の隙間を赤い枠でマークしました。

ギャップ

そしてここにコードがあります:

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class Main {
    public static void main(String[] args) {
        JPanel somePanel = new JPanel();
        somePanel.setLayout(new MigLayout("insets 0, debug", "", ""));
        somePanel.add(new JCheckBox("first option"), "h 20!");
        somePanel.add(new JButton("click me"), "spany 2, h 40!, w 60%, wrap");
        somePanel.add(new JCheckBox("option two"), "h 20!");

        JFrame frame = new JFrame();
        frame.setContentPane(somePanel);
        frame.pack();
        frame.setVisible(true);
    }
}
4

3 に答える 3

3

最小ギャップは、特定の行/列にのみ適用する必要がある場合は、行/列の制約のいずれかで定義されます。

new MigLayout("insets 0, debug", "", "[]0[]"));

(これがうまくいかなかったのではないかと少し疑問に思いますか?ここでは問題ありません:)

または、layoutContraintsで、すべての行に適用する必要がある場合:

new MigLayout("insets 0, gapy 0, debug"));

ところで:レイアウトの「コーディング」は、すべてのコーディングと同じルールに従う必要があります。fiDRY :-)特に、レイアウト/行の制約で目標を達成できる場合、私のルールはコンポーネントの制約を繰り返さないことです。この例では、次の方法でスパニングを除くすべてのコンポーネント制約を取り除くことができます。

somePanel.setLayout(new MigLayout("insets 0, debug, wrap 2", 
        "[][60%, fill]", "[20!, fill]0"));
somePanel.add(new JCheckBox("first option"));
somePanel.add(new JButton("click me"), "spany 2");
somePanel.add(new JCheckBox("option two"));
于 2012-10-30T10:34:23.023 に答える
2

さて、ドッキングを使用して良い解決策を見つけました。

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class Main {
    public static void main(String[] args) {
        JPanel somePanel = new JPanel();
        somePanel.setLayout(new MigLayout("insets 0, debug", "", ""));
        somePanel.add(new JButton("click me"), "east");
        somePanel.add(new JCheckBox("first option"), "north");
        somePanel.add(new JCheckBox("option two"), "south");

        JFrame frame = new JFrame();
        frame.setContentPane(somePanel);
        frame.pack();
        frame.setVisible(true);
    }
}

しかし、ドッキングがオプションでない場合、どうすればよいですか?

于 2012-10-29T16:37:55.137 に答える
0

別の解決策は、セルを2つのサブセルに分割し、そこにチェックボックスを配置して、コンポーネントギャップ制約を適用することです。

package com.zetcode;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

/*
Demonstrating component gaps in MigLayout manager.
Author: Jan Bodnar
Website: zetcode.com
 */
public class MigLayoutGapsEx extends JFrame {

    public MigLayoutGapsEx() {

        initUI();
    }

    private void initUI() {

        JCheckBox cb1 = new JCheckBox("First option");
        JCheckBox cb2 = new JCheckBox("Second option");

        JButton btn = new JButton("Click me");

        createLayout(cb1, cb2, btn);

        setTitle("MigLayout example");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void createLayout(JComponent... arg) {

        setLayout(new MigLayout());

        add(arg[0], "split 2, flowy");
        add(arg[1], "gapy 0");
        add(arg[2]);

        pack();
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            MigLayoutGapsEx ex = new MigLayoutGapsEx();
            ex.setVisible(true);
        });
    }
}

スクリーンショットは次のとおりです。

例のスクリーンショット

于 2016-08-25T15:44:50.667 に答える