2013-12-22 2 views
0

У меня есть подпанель, к которой я иногда добавляю некоторые компоненты. Я ожидаю, что FlowLayout будет правильно их размещать. Я помещаю subPanel в JScrollPane, чтобы пользователь мог видеть все компоненты, но я не хотел бы беспокоить пользователя прокруткой по горизонтали. Но JScrollPane позволяет subPanel расширяться горизонтально, когда добавляются дополнительные компоненты. Таким образом, все компоненты отображаются горизонтально горизонтально. А это означает худший возможный макет.Предотвращение расширения JScrollPane компонента viewPort

this.setLayout(new GridLayout(1, 1)); 
    subPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); 
    subPanel.setMaximumSize(new Dimension(500, 4000)); 
    subPanel.setBackground(Color.CYAN); 
    subPane = new JScrollPane(subPanel); 
    subPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
    subPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
    this.add(subPane); 

Где-то еще я добавил componentListener, чтобы решить эту проблему, но проблема остается:

 @Override 
     public void componentShown(ComponentEvent e) { 
      subPanel.setSize(getSize()); 
     } 

     @Override 
     public void componentResized(ComponentEvent e) { 
      subPanel.setSize(getSize()); 
     } 

И this является JPanel, который создает полностью в JTabbedPane так занимает все вкладки.

+1

Не используйте компонент ComponentListener для воспроизведения с размерами. Менеджер компоновки будет управлять предпочтительным размером компонента, который, в свою очередь, позволит панели прокрутки работать правильно. – camickr

+0

Можете ли вы рассказать мне, какой формат использует JScrollPane для создания своего уникального компонента внутри? Проблема в том, что компоновка компонента внутри JScrollPane не управляется! Поэтому я не согласен, но я приветствую лучшее решение. @camickr – puk

+2

JScrollPane имеет собственный мануал макета, и вы никогда его не измените. Менеджер компоновки отвечает за управление окном просмотра, полосами прокрутки и заголовками столбцов и строк. Все, что вам нужно сделать, это убедиться, что компонент, который вы добавляете в scrollpane, использует диспетчер компоновки, и я уже дал вам предложение о том, какой из них использовать. – camickr

ответ

3

Может быть, вы ищете Wrap Layout, который обертывают компоненты к следующей строке, когда горизонтальное пространство заполнено.

+0

@puk: это тот, о котором я говорил в комментарии к моему ответу. –

+0

@camickr Я нашел проблему. В любом случае FlowLayout автоматически обертывается при изменении размера при изменении размера окна.Поэтому мне не нужен этот сторонний макет. – puk

+2

@puk, Да, он обертывается, но он не вычисляет предпочтительный размер правильно, поэтому полосы прокрутки будут работать некорректно. – camickr

2

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

Но это именно то, что должен сделать FlowLayout, и это именно то, что он делает.

Почему бы не просто использовать BoxLayout ориентированный на BoxLayout.PAGE_AXIS

+0

Худший ответ, который я мог бы получить! Я говорю, что это худший вариант, если компоненты идут горизонтально или вертикально. Они должны заполнять все видимое пространство, а когда нет места, они должны предпочесть расширить панель в вертикальном направлении. Если вы посмотрите на [этот пример] (http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/layout /FlowLayoutDemoProject/src/layout/FlowLayoutDemo.java) вы понимаете, что FlowLayout не должен делать то, что вы говорите. Я рекомендую запустить этот пример, чтобы понять, что я имею в виду. – puk

+0

@puk: '" Самый худший ответ, который я мог бы иметь! "' - yikes, меня просто посадили на место! Похоже, вы хотите создать собственный макет, который делает то, что вы хотите (я слышал, что это не очень сложно сделать, но я никогда не делал этого сам), или поиск того, который был создан, который может сделать это. Rob camick (пользовательский camickr на этом сайте) имеет некоторые умные макеты, которые вы могли бы искать. –

+0

Мне не нужно искать макет. Пока вы комментировали, я отредактировал свой ответ. FlowLayout идеально подходит для меня, и он работает хорошо. Мне просто нужно добавить scrollPane, чтобы пользователь мог видеть компоненты, выходящие из области просмотра. @Hovercraft – puk

Смежные вопросы