2016-10-13 8 views
0

Я пытаюсь поместить несколько карточек JPanel в свою основную панель. и если новая панель карты не подходит, я хочу, чтобы она была помещена в следующую строку. На изображении ниже вы видите, что все мои карточные панели идут вправо, и если я устанавливаю горизонтальный прокрутки HORIZONTAL_SCROLLBAR_ALWAYS. Поэтому здесь я хочу, чтобы в каждой строке моей основной панели была 4 панели карт, чтобы работать вертикальная прокрутка.Элемент разметки разворачивания потока в прокручиваемом JPanel

public class PanelTraining extends JPanel{ 
    private static final long serialVersionUID = 1L; 


    public PanelTraining(List<FccMeta> ffcms) { 
     super(new BorderLayout()); // set layout to absolute 
     setPreferredSize(new Dimension(880, 580)); 
     setBorder(new LineBorder(Color.decode("#A11E1E"),1, true)); 

     JPanel pnlChart = new JPanel(); 

     pnlChart.setPreferredSize(new Dimension(860, 180)); 
     pnlChart.setBackground(Color.YELLOW); 
     add(pnlChart, BorderLayout.NORTH); 

     JPanel pnlTrSet = new JPanel(new FlowLayout(FlowLayout.LEADING, 5, 5)); 
     //pnlTrSet.setSize(860, 380); 

     for (FccMeta fccMeta : ffcms) { 
      JPanel pnlCard = new MyCustomPanelCard(); 
      pnlTrSet.add(pnlCard); 
     } 


     JScrollPane scroll = new JScrollPane(pnlTrSet); 
     //scroll.setPreferredSize(new Dimension(860, 380)); 
     scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
     add(scroll, BorderLayout.CENTER); 

    } 
} 

enter image description here

EDIT в соответствии с ответом, приведенной ниже. Я изменил мою реализацию на this Class

ScrollablePanel pnlTrSet = new ScrollablePanel(new FlowLayout()); 
pnlTrSet.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT); 
pnlTrSet.setScrollableBlockIncrement(
     ScrollablePanel.VERTICAL, ScrollablePanel.IncrementType.PIXELS, 230); 

enter image description here

+1

1) Чтобы лучше помочь, отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). 2) Обеспечить ASCII-искусство или простой рисунок * предназначенного макета GUI при минимальном размере и, если он изменен, с большей шириной и высотой. –

ответ

3

Вы должны реализовать интерфейс панели Scrollable иметь ширину, прикрепленную к размеру окна просмотра в ScrollPane.

В принципе вам необходимо переопределить метод getScrollableTracksViewportWidth(), чтобы вернуть «true».

Простой способ сделать это - использовать Scrollable Panel. У этого есть метод, который позволяет вам управлять этим свойством.

Edit:

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

Чтобы обернуть кнопки, вы должны заменить FlowLayout вашей панели на Wrap Layout. правильно рассчитает правильную высоту панели, чтобы компоненты могли обернуться, и появилась вертикальная полоса прокрутки.

+0

Не могли бы вы подробно рассказать о своем ответе? что вы понимаете под прокручиваемым интерфейсом моей панели – gabby

+1

@gabby, 1) Прочитайте API для получения дополнительной информации о прокручиваемом интерфейсе. Это первое место, когда кто-то предлагает класс/интерфейс, о которых вы не знаете. 2) Найдите форум/веб для примеров, в которых используется предложенный метод. 3) Прочтите раздел из учебника Swing по [Реализация клиента с проверкой прокрутки] (http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html#scrollable). – camickr

+0

Да, да. Я обновил свой вопрос в результате, я получил то, что вы предложили. – gabby