Swing: менеджер раскладки колонного потока? - PullRequest
5 голосов
/ 11 июня 2011

Я ищу LayoutManager, который позволил бы мне показать набор компонентов в контейнере (например, JPanel) в столбцах примерно следующим образом.

  • Ширина контейнера является входным ограничением.
  • Предпочтительная высота контейнера является функцией ширины и может быть:
    • минимальная высота, необходимая для размещения компонентов по ширине, если они размещены более чем в одном столбце.
    • минимальная высота, необходимая для размещения компонентов в одном столбце.
  • Компоненты будут размещены в порядке столбцов газет, сверху вниз, а затем слева направо.

Вот пример (низкотехнологичное отображение текста), показывающий 13 компонентов. Если бы они могли поместиться в 3 столбца, они бы выглядели так:

Foo1    Foo6     Foo11   
Foo2    Foo7     Foo12
Foo3    Foo8     Foo13
Foo4    Foo9     
Foo5    Foo10

Если бы это было слишком широко, они бы выглядели так:

Foo1    Foo8 
Foo2    Foo9  
Foo3    Foo10 
Foo4    Foo11 
Foo5    Foo12
Foo6    Foo13
Foo7    

А если это слишком широко, они бы выглядели так:

Foo1     
Foo2      
Foo3     
Foo4     
Foo5    
Foo6    
Foo7    
Foo8
Foo9
Foo10
Foo11
Foo12
Foo13

Существует ли уже существующий LayoutManager, который я могу использовать или создать подкласс, чтобы сделать что-то подобное?


edit: это очень близко к этот другой вопрос о вертикальной компоновке , но эта компоновка имеет высоту компонента, являющуюся ограничением, а моя - шириной компонента, являющейся ограничением.

Ответы [ 2 ]

2 голосов
/ 11 июня 2011

Еще одним компонентом, который допускает этот вид макета, является JList, который включает VERTICAL_WRAP, который «обозначает макет газетного стиля с ячейками, перетекающими вертикально, а затем горизонтально».В зависимости от ваших потребностей может подойти ListCellRenderer, упомянутый здесь .

1 голос
/ 11 июня 2011

вы можете посмотреть в GribBagLayout http://download.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

С помощью компоновки gridbag, зная размер, вы можете установить, сколько компонентов будет в определенной строке.

но если я не ошибаюсь, не делайте gridlayout именно то, что вы хотите.

поехали с простыми ярлыками. если размер метки * 2 больше ширины, то в строке будет отображаться только 1 метка. и так далее.

вот пример, который должен прояснить ситуацию

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class GridLayoutDemo implements ActionListener{
    JTextField j1;
    JTextField j2;
    JFrame f;
    public void show(){
        j1=new JTextField("x dimention");
        j2=new JTextField("y dimention");
        f=new JFrame();
        JPanel p=new JPanel();
        JLabel l2=new JLabel("abcdefghijklmnoqrstuvw");
        JLabel l1=new JLabel("abcdefghijklmnoqrstuvw");
        JLabel l3=new JLabel("abcdefghijklmnoqrstuvw");
        JLabel l4=new JLabel("abcdefghijklmnoqrstuvw");
        JButton b=new JButton("new size");
        b.addActionListener(this);

        p.add(l1);
        p.add(l2);
        p.add(l3);
        p.add(l4);
        p.add(j1);
        p.add(j2);
        p.add(b);
        f.setSize(400, 200);
        f.add(p);

        //f.pack();
        f.setVisible(true);

    }

    public static void main(String[] args){
        GridLayoutDemo g=new GridLayoutDemo();
        g.show();
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
        int x=Integer.parseInt(j1.getText());
        int y=Integer.parseInt(j2.getText());
        f.setSize(x,y);
        f.setVisible(true);

    }
}
...