如何在调整大小时重新定位FlowLayout组件。

时间:2013-03-06 21:56:33

标签: java swing border-layout flowlayout

我想将FlowLayout放在BorderLayout内作为北面板(BorderLayout.NORTH),并且当我调整窗口/框架的大小时,我希望标签不会消失但是而是转移到新的一行。

我一直在阅读有关min,max值和preferredLayoutSize方法的内容。然而他们似乎没有帮助,我仍然感到困惑。

此外,我不想使用其他布局,如包装或其他东西。

2 个答案:

答案 0 :(得分:6)

关于FlowLayout的一个令人烦恼的事情是,当可用的水平空间很小时,它不会“包裹”它的内容。

相反,请查看WrapLayout,它是FlowLayout包装......

答案 1 :(得分:0)

以下代码完全符合您的要求。

该程序有一个框架,其contentPane设置为BorderLayout。它包含另一个具有流式布局的面板flowPanel,并添加到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内的组件的关键是这段代码

PS:如果您是Swing的新手并且不了解代码的某些部分,请与我们联系。

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

,此方法将无效