摆动布局:垂直流动 [英] swing layout: vertical flow
本文介绍了摆动布局:垂直流动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我应该使用什么LayoutManager来实现FlowLayout的转置版本?
What LayoutManager should I use to achieve a transposed version of FlowLayout?
基本上,我想要一个垂直列表,如果它不能适合所有列,它会占用多列它是一列中的组件。
Essentially, I want a vertical list which occupies multiple columns if it can't fit all of it's components within one column.
+------------------------+
| item 1 |
| item 2 |
| item 3 |
| item 4 |
| item 5 |
| item 6 |
| item 7 |
| item 8 |
+------------------------+
或
+------------------------+
| item 1 item 7 |
| item 2 item 8 |
| item 3 |
| item 4 |
| item 5 |
| item 6 |
+------------------------+
这个包装逻辑需要动态发生,即随着容器的大小调整。
this wrapping logic needs to happen dynamically, ie as the container is resized.
推荐答案
我正在研究我自己的问题的解决方案(非常相似:我需要流动垂直但水平约束宽度),我得到了一个简单的工作示例,也许它让你开始使用自定义布局管理器:
I'm working on a solution to my own question (very similar: I need to flow vertically but constrain width horizontally), I got a quick example sort of working and maybe it gets you started with a custom layout manager:
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();
}
}
这篇关于摆动布局:垂直流动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文