Как се добавя JScrollPane към JPanel

Търсих лесен начин за прилагане на JScrollPlane. Опитвам се да го добавя към JPanel и той ще съдържа динамичен брой JPanels (които ще бъдат запълнени с други неща).

Ето моят (неуспешен) опит да направя споменатото 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