我应该使用什么LayoutManager来实现FlowLayout的转置版本?
从本质上讲,我想要一个垂直列表,如果它不能适合一列中的所有组件,则会占用多列.
+------------------------+
| item 1 |
| item 2 |
| item 3 |
| item 4 |
| item 5 |
| item 6 |
| item 7 |
| item 8 |
+------------------------+
Run Code Online (Sandbox Code Playgroud)
要么
+------------------------+
| item 1 item 7 |
| item 2 item 8 |
| item 3 |
| item 4 |
| item 5 |
| item 6 |
+------------------------+
Run Code Online (Sandbox Code Playgroud)
这种包装逻辑需要动态发生,即在调整容器大小时.
小智 29
很简单,你只需要这个.
yourPanel.setLayout(new BoxLayout(yourPanel, BoxLayout.Y_AXIS));
Run Code Online (Sandbox Code Playgroud)
在此之后,您只需将视图添加到您的面板,您将获得垂直流布局.
我正在研究我自己的问题的解决方案(非常相似:我需要垂直流动但水平约束宽度),我得到了一个快速的例子工作,也许它让你开始使用自定义布局管理器:
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager2;
import java.util.Random;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.google.common.collect.Sets;
public class VerticalFlowLayout implements LayoutManager2
{
final private Set<Component> components = Sets.newLinkedHashSet();
private int hgap = 0;
private int vgap = 0;
public void setHGap(int hgap) { this.hgap = hgap; }
public void setVGap(int vgap) { this.vgap = vgap; }
@Override public void addLayoutComponent(Component comp, Object constraints) {
this.components.add(comp);
}
/* these 3 methods need to be overridden properly */
@Override public float getLayoutAlignmentX(Container target) {
// TODO Auto-generated method stub
return 0;
}
@Override public float getLayoutAlignmentY(Container target) {
// TODO Auto-generated method stub
return 0;
}
@Override public void invalidateLayout(Container target) {
// TODO Auto-generated method stub
}
@Override public void addLayoutComponent(String name, Component comp) {
this.components.add(comp);
}
@Override public void layoutContainer(Container parent) {
int x = 0;
int y = 0;
int columnWidth = 0;
for (Component c : this.components)
{
if (c.isVisible())
{
Dimension d = c.getPreferredSize();
columnWidth = Math.max(columnWidth, d.width);
if (y+d.height > parent.getHeight())
{
x += columnWidth + this.hgap;
y = 0;
}
c.setBounds(x, y, d.width, d.height);
y += d.height + this.vgap;
}
}
}
/* these 3 methods need to be overridden properly */
@Override public Dimension minimumLayoutSize(Container parent) {
return new Dimension(0,0);
}
@Override public Dimension preferredLayoutSize(Container parent) {
return new Dimension(200,200);
}
@Override public Dimension maximumLayoutSize(Container target) {
return new Dimension(600,600);
}
@Override public void removeLayoutComponent(Component comp) {
this.components.remove(comp);
}
public static void main(String[] args) {
JFrame frame = new JFrame("VerticalFlowLayoutTest");
VerticalFlowLayout vfl = new VerticalFlowLayout();
JPanel panel = new JPanel(vfl);
vfl.setHGap(20);
vfl.setVGap(2);
int n = 19;
Random r = new Random(12345);
for (int i = 0; i < n; ++i)
{
JLabel label = new JLabel(labelName(i,r));
panel.add(label);
}
frame.setContentPane(panel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private static String labelName(int i, Random r) {
StringBuilder sb = new StringBuilder();
sb.append("label #");
sb.append(i);
sb.append(" ");
int n = r.nextInt(26);
for (int j = 0; j < n; ++j)
sb.append("_");
return sb.toString();
}
}
Run Code Online (Sandbox Code Playgroud)