2

GridBagLayout を使用して JPanel のすべての項目に境界線の色を設定すると、コンポーネントが折りたたまれます。

折りたたまれた

しかし、1 つのコンポーネントだけから境界線を削除すると、パディングは期待どおりに残ります。

普通

私は何を間違っていますか?

ボーダー設定:

    setBorder(BorderFactory.createLineBorder(Color.decode("#"+Constants.Display.OPTIONS_BORDER_COLOR)));

JPanel:

public class OptionsPanel extends JPanel {
    private AddMachineBtn addMachineBtn;
    private SearchField searchField;
    private SearchBtn searchBtn;

    private GridBagConstraints gbc;

    public OptionsPanel() {
        init();
        config();
        build();
    }

    private void init() {
        addMachineBtn = new AddMachineBtn("Add Machine");
        searchField = new SearchField("Search...");
        searchBtn = new SearchBtn("S");

        gbc = new GridBagConstraints();
        int i = Constants.Display.OPTIONS_PANEL_PADDING;
        gbc.insets = new Insets(i, i, i, i);
    }

    private void config() {
        setLayout(new GridBagLayout());
        setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.decode("#"+Constants.Display.OPTIONS_BORDER_COLOR)));
        setPreferredSize(new Dimension(0, Constants.Display.OPTIONS_PANEL_HEIGHT));
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.anchor = gbc.LINE_START;
    }

    private void build() {
        gbc.gridx = 0;
        add(addMachineBtn, gbc);

        gbc.weightx = 0;
        gbc.gridx = 1;
        add(searchField, gbc);

        gbc.gridx = 2;
        add(searchBtn, gbc);
    }
}
4

4 に答える 4

4

にどう影響するかはわかりませんが、「一般的には、やGridBagLayout以外の標準Swingコンポーネントにボーダーを設定したい場合は、コンポーネントを に入れ、にボーダーを設定することをお勧めします。」—< a href="http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#setBorder%28javax.swing.border.Border%29" rel="nofollow noreferrer"> . ここに関連する例があります。JPanelJLabelJPanelJPanelsetBorder()

于 2012-08-01T18:48:11.293 に答える
2

はい、レイアウトはコンポーネントのサイズには影響しません。レイアウトを (たとえば FlowLayout に) 変更しようとしても、状況は同じです。Swing コンポーネントは、Look'n'Feel からの初期化中に境界を取得します。

System.out.println(addMachineBtn.getBorder());addMachineBtn 作成後に挿入します。境界線がすでに存在することがわかります

javax.swing.plaf.BorderUIResource$CompoundBorderUIResource

この境界線はコンポーネントに独自のインセットを提供し、境界線を別のものに置き換えると、そのインセットが失われます。

于 2012-08-01T20:42:46.523 に答える
1

元のコンポーネントのインセットを保持し、ボーダーを置き換えることが本当に重要な場合は、ネイティブの Swing ボーダーを模倣してみてください。

たとえば、次のようなものです。

addMachineBtn.setBorder(new CompoundBorder(new LineBorder(Color.red), new EmptyBorder(5, 17, 5, 17)));

LineBorder の代わりに必要な境界線を配置し、EmptyBorder は同じままにして、必要に応じてインセットを修正します。

于 2012-08-01T21:15:57.877 に答える
0

これに対する修正は、次の変更でした

setSize(new Dimension(w,h));
setMinimumSize(new Dimension(w,h));
setMaximumSize(new Dimension(w,h));

setPreferredSize(new Dimension(w,h));
setMinimumSize(new Dimension(w,h));
setMaximumSize(new Dimension(w,h));
于 2012-08-01T20:43:43.083 に答える