Как сделать JList наполнением JPanel

У меня есть JPanel с JList добавлено внутри. Как сделать то что JList будет иметь рост и вес, как мой JPanel, Это должно заполнить это полностью.

Если у меня есть 2 предмета в моем JListЯ хочу, чтобы 1 из них был 1/2 высоты, если 3 - 1/3 высоты и т. д.

Какие-либо решения?

public class RozkladLotow extends JPanel{
Vector<Samolot> samoloty;
public RozkladLotow(GeneratorSamolotow g){
    super();
    this.setLayout(new BorderLayout());
    Miasto m1 = new Miasto("Warszawa",571,142,"Polska",10,10);//sample objects needed to create a `Samolot`
    Miasto m2 = new Miasto("Pekin",571,142,"Chiny",10,10);//sample objects needed to create a `Samolot`
    samoloty = new Vector<Samolot>();
    samoloty.add(new Samolot(0, m1, m2, 0, 0, 0 , 0));
    samoloty.add(new Samolot(0, m2, m1, 0, 0, 0 , 0));
    JList lista = new JList<Samolot>(samoloty);
    add(lista,BorderLayout.CENTER);     
}
}

Ofc в классе Samolot у меня есть toString() функции, возвращающие образец String

3 ответа

Решение

Как сделать так, чтобы JList получал рост и вес, как мой JPanel. Это должно заполнить это полностью.

Ну, в этом случае решение заключается в добавлении списка в JPanel с BorderLayout, как указано в других ответах.

Если у меня есть 2 элемента в моем JList, я хочу, чтобы 1 из них был 1/2 высоты, если 3 - 1/3 высоты и т. Д.

Это требование немного сложнее: высота ячейки зависит от видимого прямоугольника списка и количества элементов в списке или количества элементов, которые вы хотите отобразить, которые могут отличаться.

Например, предположим, что список состоит из 6 элементов, но вы хотите отобразить максимум 5 ячеек (строк), а затем прокрутить список. Вы можете сделать следующее:

Например:

DefaultListModel model = new DefaultListModel();
model.addElement("Fender");
model.addElement("Gibson");
model.addElement("Ibanez");
model.addElement("Paul Reed Smith");
model.addElement("Jackson");
model.addElement("Godin"); // The model has 6 elements

JList list = new JList(model);
list.setVisibleRowCount(5); // I want to show only 5 elements, then scroll the list

list.addComponentListener(new ComponentAdapter() { // ComponentAdapter implements ComponentListener interface
    @Override
    public void componentResized(ComponentEvent e) {
        JList list = (JList)e.getComponent();
        int divider = Math.min(list.getVisibleRowCount(), list.getModel().getSize());
        list.setFixedCellHeight(list.getVisibleRect().height / divider);
    }
});

JPanel content = new JPanel(new BorderLayout());
content.add(new JScrollPane(list));

Так как я использую Math.min() для определения минимального делителя, чтобы правильно установить фиксированную высоту ячейки, если модель списка имеет только 2 элемента, они оба будут заполнять 50% каждый из доступной высоты.

Примечание: если вы хотите, чтобы все элементы в списке отображались всегда, то это проще:

list.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(ComponentEvent e) {
        JList list = (JList)e.getComponent();
        list.setFixedCellHeight(list.getVisibleRect().height / list.getModel().getSize());
    }
});
jPanel.setLayout(new BorderLayout());
jPanel.add(jList, BorderLayout.CENTER);

Попробуй это..

     JList<String> list = new JList<>();
     JPanel panel = new JPanel(new BorderLayout()); 
     panel.add(list,BorderLayout.CENTER);

Если на панели есть один компонент, он автоматически растягивается.

Другие вопросы по тегам