我想在FlowLayout
里面放 5 个标签BorderLayout
作为北面板 ( BorderLayout.NORTH
),当我调整窗口/框架的大小时,我希望标签不会消失,而是移动到新行。
我一直在阅读有关 min、max 值和 preferredLayoutSize 方法的信息。但是他们似乎没有帮助,我仍然很困惑。
另外,我不想使用其他布局,例如包装器或其他东西。
我想在FlowLayout
里面放 5 个标签BorderLayout
作为北面板 ( BorderLayout.NORTH
),当我调整窗口/框架的大小时,我希望标签不会消失,而是移动到新行。
我一直在阅读有关 min、max 值和 preferredLayoutSize 方法的信息。但是他们似乎没有帮助,我仍然很困惑。
另外,我不想使用其他布局,例如包装器或其他东西。
令人讨厌的事情之一FlowLayout
是,当可用的水平空间很小时,它不会“包装”它的内容。
相反,看看WrapLayout,它FlowLayout
带有包装......
以下代码完全符合您的要求。
该程序有一个框架,其 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
重新对齐的关键是这段代码
Swing
PS:如果您是新手并且不了解代码的某些部分,请告诉我。
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
PanelFun.this.getContentPane().remove(flowPanel);
PanelFun.this.getContentPane().add(flowPanel);
}
});
如果没有此代码,flowPanel
则不会重新对齐其组件,因为在调整包含框架的大小时重新定位组件不是其正常行为。
然而,当flowPanel
被添加到面板时,它的行为也是根据可用空间定位组件。因此,如果我们在flowPanel
每次调整框架大小时添加,内部元素将重新定位以使用可用空间。
更新:
BorderLayout.CENTER
正如 camickr 正确指出的那样,如果您将任何内容添加到中心( ),此方法将不起作用