2

北パネル ( ) としてFlowLayout内部に 5 つのラベルを入れたいとします。ウィンドウ/フレームのサイズを変更すると、ラベルが消えずに新しい行に移動します。BorderLayoutBorderLayout.NORTH

最小値、最大値、preferredLayoutSize メソッドについて読んでいます。しかし、彼らは役に立たないようで、私はまだ混乱しています.

また、ラッパーなどの他のレイアウトを使用したくありません。

4

2 に答える 2

6

厄介なことの 1 つはFlowLayout、使用可能な水平スペースが小さすぎる場合にコンテンツを「ラップ」しないことです。

代わりに、WrapLayoutを見てください。それFlowLayoutはラッピングを使用しています...

于 2013-03-06T22:44:45.653 に答える
0

次のコードは、あなたが要求したことを正確に実行します。

プログラムには、contentPaneがに設定されているフレームがありますBorderLayoutflowPanelフローレイアウトを持ち、に追加される別のパネルが含まれていBorderLayout.NORTHます。

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class PanelFun extends JFrame {
    final JPanel flowPanel;

    public PanelFun() {
        setPreferredSize(new Dimension(300,300));
        getContentPane().setLayout(new BorderLayout());
        flowPanel = new JPanel(new FlowLayout());
        addLabels();
        getContentPane().add(flowPanel, BorderLayout.NORTH);


        addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent e) {
                PanelFun.this.getContentPane().remove(flowPanel); //this statement is really optional.
                PanelFun.this.getContentPane().add(flowPanel);
            }
        });
    }

    void addLabels(){
        flowPanel.add(new JLabel("One"));
        flowPanel.add(new JLabel("Two"));
        flowPanel.add(new JLabel("Three"));
        flowPanel.add(new JLabel("Four"));
        flowPanel.add(new JLabel("Five"));
    }



    public static void main(String[] args) {
        final PanelFun frame = new PanelFun();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                frame.setVisible(true);

            }
        });
    }
}

それで、それはどのように機能しますか?

フレームのサイズが変更されたときに内部のコンポーネントを再調整するための鍵flowPanelは、このコードです。

SwingPS:コードの一部を初めて使用し、理解していない場合はお知らせください。

addComponentListener(new ComponentAdapter() {

                @Override
                public void componentResized(ComponentEvent e) {
                    PanelFun.this.getContentPane().remove(flowPanel);
                    PanelFun.this.getContentPane().add(flowPanel);
                }
            });

このコードflowPanelがないと、含まれているフレームのサイズが変更されたときにコンポーネントを再配置するのは通常の動作ではないため、はコンポーネントを再調整しません。

ただし、flowPanelパネルに追加すると、使用可能なスペースに従ってコンポーネントが配置されるという動作もあります。したがって、flowPanelフレームのサイズが変更されるたびに追加すると、使用可能なスペースを使用するように内部要素が再配置されます。

アップデート:

camickrが正しく指摘しているように、中央に何かを追加した場合、この方法は機能しません(BorderLayout.CENTER

于 2013-03-06T22:08:47.883 に答える