Как сделать 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 ячеек (строк), а затем прокрутить список. Вы можете сделать следующее:
- Используйте метод JList.setVisibleRowCount(), чтобы установить максимальное количество ячеек, которые будут отображаться.
- Добавьте ComponentListener в список для прослушивания события компонента, инициируемого при изменении размера списка: ComponentListener.componentResized ()
- Используйте метод JComponent.getVisibleRect(), чтобы получить видимый прямоугольник списка.
- Используйте метод JList.setFixedCellHeight(), чтобы установить фиксированную высоту ячейки.
Например:
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);
Если на панели есть один компонент, он автоматически растягивается.