3

これはあなたたちにとって難しいものです:)

基本的に、2つの列を持つGridBagLayoutがあります。各列にスクロールペインでラップされたリストです。スクロールペインは両方向に引き伸ばされます。

このパネルの高さを徐々に下げると(ウィンドウの端をドラッグして)、スクロールペインで「ランダムな」サイズ変更が行われているのがわかります。

  • 最初のHscrollバーが表示されると、2番目の幅が狭くなります

  • その後、2番目の幅は理由もなく再び縮小されます...

コンポーネントをラップしない場合は、この動作を取得しないでください。


また、右側のリストをツリーに置き換えると、動作が異なります。ウィンドウの高さを380-ich px以下に縮小すると、ツリーのサイズが変更されます...

コンポーネントをラップしない場合、ウィンドウのサイズを変更し続けると、とにかくツリーのサイズが変更されます。

何が起こっているのか分かりますか?

PS:私が構築しようとしている実際のレイアウトは、この例よりも複雑です。それまでの間、SpringLayoutを使用してやりたいことを実行しますが、セットアップには多くの(それほど美しくはない)ことが必要です。

protected static ListModel newListModel(int n) {
    DefaultListModel lm = new DefaultListModel();

    for (int i = 0; i < n; ++i)
        lm.addElement("AAA");

    return lm;
}

protected static JComponent createContentPane() {
    JPanel  pane = new JPanel(new GridBagLayout());

    GridBagConstraints  gbc = new GridBagConstraints();

    gbc.anchor = GridBagConstraints.CENTER;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.gridy = 0;
    gbc.gridx = 0;

    pane.add(new JScrollPane(new JList(newListModel(12))), gbc);

    ++gbc.gridx;

    pane.add(new JScrollPane(new JList(newListModel(4))), gbc);

    return pane;
}

public static void main(String[] args) {
    JFrame f = new JFrame();

    f.getContentPane().add(createContentPane());
    f.setSize(800, 400);
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    f.setVisible(true);
}
4

2 に答える 2

9

GridBagLayout に複数の ScrollPanes を含むアプリケーションがあり、ウィンドウのサイズを変更すると突然サイズが変更されます。ScrollPane の実際のサイズが「優先サイズ」を超えると、ジャンプが発生するようです。回避策を見つけました: 優先サイズを 1x1 ピクセルに設定します。コンポーネントに正の重みがあり、両方が伸びる場合、セル全体を占有しますが、ジャンプはしません。複数のセルを異なる比率でサイズ変更する必要がある場合は、別のセルの優先サイズを、たとえば 2x1 ピクセルに設定できます。

于 2012-03-09T16:21:21.070 に答える
2
  • これはGridBagLayoutの基本原則です。defineを忘れた場合は、相対t にanchor配置を修正できます。GUI が複雑になると思います。このLayoutManagerは、1 つのコンテナーに多数を配置する場合に適しています(使用せずに)JComponentPoinGridBagLayoutJComponentsnested layout

例えば

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class BorderPanels extends JFrame {

    private static final long serialVersionUID = 1L;

    public BorderPanels() {
        setLayout(new GridBagLayout());// set LayoutManager
        GridBagConstraints gbc = new GridBagConstraints();
        JPanel panel1 = new JPanel();
        Border eBorder = BorderFactory.createEtchedBorder();

        panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "20pct"));
        gbc.gridx = gbc.gridy = 0;
        gbc.gridwidth = gbc.gridheight = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.weightx = gbc.weighty = 20;
        add(panel1, gbc); // add compoenet to the COntentPane

        JPanel panel2 = new JPanel();
        panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "60pct"));
        gbc.gridy = 1;
        gbc.weightx = gbc.weighty = 60;
        //gbc.insets = new Insets(2, 2, 2, 2);
        add(panel2, gbc); // add component to the COntentPane

        JPanel panel3 = new JPanel();
        panel3.setBorder(BorderFactory.createTitledBorder(eBorder, "20pct"));
        gbc.gridy = 2;
        gbc.weightx = gbc.weighty = 20;
        gbc.insets = new Insets(2, 2, 2, 2);
        add(panel3, gbc);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // important
        pack();
        setVisible(true); // important
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() { // important

            public void run() {
                BorderPanels borderPanels = new BorderPanels();
            }
        });
    }
}

単純なことを複雑にすることを避けること

于 2012-03-09T11:17:22.500 に答える