Как добавить JScrollPane в JPanel

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

Вот моя (безуспешно) попытка сделать указанное JScrollPane:

final JPanel info = new JPanel();
final JScrollPane infoS = new JScrollPane(info,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
info.setLayout(new GridLayout(0,1));
info.setLocation(10,78);
info.setSize(420,490);
infoS.setPreferredSize(new Dimension(600, 600));
gui.add(infoS);

person Thrfoot    schedule 19.11.2012    source источник
comment
gui.add(infoS);? ты не имеешь в виду info.add(infoS)? Ах да, и, пожалуйста, прочитайте это.   -  person mre    schedule 20.11.2012
comment
@mre: надеюсь, что нет, потому что это означало бы, что информация будет одновременно дочерней и родительской для infoS (и наоборот).   -  person JB Nizet    schedule 20.11.2012
comment
Ах, извините, я упустил эту часть информации. gui — это общая панель JPanel, содержащая содержимое фрейма.   -  person Thrfoot    schedule 20.11.2012
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 20.11.2012


Ответы (2)


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

Вместо этого используйте BorderLayout

final JPanel info = new JPanel(new BorderLayout()); // <-- Change me :D
final JScrollPane infoS = new JScrollPane(info,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
// These are bad ideas, setLocation and setSize won't work, as the panel should be
// under the control of a layout manager
//info.setLocation(10,78);
//info.setSize(420,490);
//infoS.setPreferredSize(new Dimension(600, 600));
gui.add(infoS);
person MadProgrammer    schedule 19.11.2012
comment
После долгих поисков и гугления у меня все заработало. Спасибо за этот отличный пример! - person Thrfoot; 20.11.2012

В этом примере ряд вложенных панелей добавляется к панели, имеющей BoxLayout. Эта панель используется для создания JScrollPane, который затем добавляется к JFrame.

public class BoxTest extends JPanel {
...
JScrollPane jsp = new JScrollPane(this,
    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
    JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
...
JFrame f = new JFrame();
f.add(jsp); // BorderLayout.CENTER, by default
person trashgod    schedule 19.11.2012
comment
Я помню, как однажды наткнулся на это. Однако это не то, что я ищу. Это делает весь кадр JScrollPane. Я просто хочу, чтобы конкретная JPanel стала JScrollPane. - person Thrfoot; 20.11.2012
comment
@Thrfoot Принцип тот же. JFrame в конце концов — это всего лишь компонент (ну, на самом деле, он зависит от панели содержимого, но...) - person MadProgrammer; 20.11.2012
comment
@Thrfoot: Нет, JScrollPane добавляется на панель содержимого фрейма. - person trashgod; 20.11.2012