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

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

问题描述:

我想把FlowLayout与可以说BorderLayout内的5个标签作为北面板(BorderLayout.NORTH),当我调整我的窗口/框架的大小时,我希望标签不会消失,而是移动到新行。如何在调整大小时使FlowLayout重新定位组件。

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

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

+0

看起来像一个跨页:http://www.coderanch.com/t/606655/GUI/java/Swing-FlowLayout- BorderLayout的。有趣的是你如何得到相同的答案。 – camickr 2013-03-07 04:35:00

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

程序有一个框架,其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

+1

-1,这仅适用于您未将任何组件添加到BorderLayout的中心。 – camickr 2013-03-07 04:31:57

+0

@camickr感谢您指出。我没有意识到这一点。 – Ankit 2013-03-07 06:45:59

+0

@camickr完全另一个说明,(假设从网站名称)你是否也是实际编写'WrapLayout'的人? – Ankit 2013-03-07 06:49:43

一个约FlowLayout恼人的事情之一是,它不”当可用水平空间变小时,“包装”它的内容。

相反,看看WrapLayout,这是FlowLayout与包装...