1

Java Swing レイアウト用のWindowBuilder Proをいじってみたところ、いくつかの奇妙な動作に遭遇しましたが、最終的に SSCCE にまで減らすことができました。以下のソースコードを検討してください。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class WBPTest2 {
    private JFrame frame;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    WBPTest2 window = new WBPTest2();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public WBPTest2() {
        initialize();
    }
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setBackground(Color.RED);
        frame.getContentPane().add(panel, BorderLayout.CENTER);
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        JPanel panel_1 = new JPanel();
        panel_1.setBackground(Color.GREEN);
        panel_1.setMaximumSize(new Dimension(32767, 100));
        panel.add(panel_1);
        panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.Y_AXIS));

        JPanel panel_2 = new JPanel();
        panel_2.setBackground(Color.BLUE);
        panel_2.setMaximumSize(new Dimension(32767, 100));
        panel.add(panel_2);
        panel_2.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
    }
}

次のレイアウトが得られます。

ここに画像の説明を入力

なんらかの理由でpanel_1、緑の が右に浮いています。コード内のいくつかのパラメーターをいじってみると、緑色のパネルの左側のギャップを完全になくす方法が 2 つしか見つかりません。

  • コンストラクターのhgapandを 0vgapに変更します。panel_2

また

  • を (0,0) にminimumSize変更します。panel_2

これらのいずれかを実行すると、次のようになります。

ここに画像の説明を入力

さて、問題は、いったいなぜ、minimumSizeまたはhgapfor のいずれかが、その親の左側までいっぱいになるのを防ぐことに関係があるFlowLayoutのでしょうか? in に0 より大きい値と 0 より大きい値が必要な場合はどうすればよいでしょうか? では、 inの左側のギャップをどのように解消できますか?panel_2panel_1minimumSizehgapFlowLayoutpanel_2BoxLayoutpanel_1

に何をしてもpanel_1親コンテナの幅全体を埋めることはできません(panel_2上記のように編集しない限り)。皮肉なことに、alignmentXforpanel_1をに設定するとRIGHT_ALIGNMENT、実際には左に浮きます。しかし、ギャップはまだ存在します (ちょうど今右側にあります)。コンテンツを埋めpanel_1てサイズを大きくすると、右側のギャップはどんどん小さくなりますが、完全になくなることはありません。

これは が の場合だけでなく、他の多くの型でも発生しpanel_2ます... 通常はパラメーターを持たない型です。つまり、 の左側のギャップを修正する唯一の方法は、新しいコンテナが 0 になりましたが、これもばかげていて関係がないように見えます。最も重要なことは、私の設計意図ではない可能性があることです。FlowLayoutJScrollPanehgappanel_1minimumSize

4

1 に答える 1

3

パネル 1 と 2 にalignmentX を設定すると、画面全体に表示されます。

2 つの異なるレイアウト マネージャーが原因で、パネルが異なる配置の既定値を設定するようです。

于 2013-01-17T03:47:10.017 に答える