1

このコード サンプルは、プログラムで発生している問題を説明するために作成しました。

JSplitPane のスライダー バーをボタンの端を越えて左にスライドさせ、その JPanel を圧縮し、FlowLayout でボタンを 2 行目にラップさせることができると期待しています。

代わりに、JSplitPane では、画面の右端のボタンを超えてスライダーを移動することはできません。圧縮を強制するために JFrame 全体のサイズを変更すると、ボタン (おそらく) が JPanel の右側からはみ出してしまいます。スライダーバー(明らかに見えないので推測)。

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

import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
public class Driver implements Runnable {
    public static void main(String[] args) {
        (new Driver()).run();
    }
    public void run() {
        try {
            go();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
    private void go() throws Exception {
        JFrame jframe = new JFrame("FlowLayoutTest");
        JPanel left = new JPanel();
        left.setBackground(Color.RED);
        left.setLayout(new BorderLayout());
        JPanel right = new JPanel();
        right.setBackground(Color.BLUE);
        right.setLayout(new BorderLayout());
        JSplitPane topmost =
            new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);
        jframe.setContentPane(topmost);
        JPanel bottomleft = new JPanel();
        bottomleft.setBackground(Color.GREEN);
        bottomleft.setLayout(new FlowLayout());
        left.add(bottomleft, BorderLayout.PAGE_END);
        for (int i = 0; i < 10; i++) {
            bottomleft.add(new JButton("" + i));
        }
        jframe.pack();
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
4

2 に答える 2

7

私が探していることを行う FlowLayout 以外の別のレイアウト マネージャーはありますか?

ラップ レイアウトが機能するはずです。

于 2011-04-19T01:17:25.963 に答える
1

これを追加すると

bottomleft.setMinimumSize(new Dimension(0, 0));

pack() の前にリフローします。ただし、ボーダー レイアウトは再パックされないため、2 行ではなく残りが切り取られた 1 行になります。したがって、サイズを変更した後は、ボーダー レイアウトを再パックする必要があります。ボーダー レイアウトを省略すると、必要に応じてリフローします。

つまり、ペストのように FlowLayout を避けるべきです。Swing に付属するレイアウトのほとんどは貧弱ですが、FlowLayout は最悪の違反者の 1 つです。

于 2011-04-18T23:04:58.913 に答える