Problema com JScrollPane e JPanel

Pessoal,
Já tomei uma surra aqui do JScrollPane.

É o seguinte. Tenho dois projetos diferentes, porém nos dois quero usar o JScrollPane.

Em um dos projetos, eu exibo (add) vários JCheckBox no JPanel para que tenha rolagem. Isso funciona na boa. Veja o código:

[code]import java.awt.;
import javax.swing.
;

public class MyFrame extends javax.swing.JFrame {
private JScrollPane jScrollPan = new JScrollPane();
private JPanel pan = new JPanel();

public MyFrame() {
init();
addCheckboxes();
}

private void init() {
pan.setLayout(new VerticalFlowLayout());
jScrollPan.setBounds(0, 0, 300, 100);
jScrollPan.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jScrollPan.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPan.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jScrollPan.setViewportView(pan);
getContentPane().add(jScrollPan);
pack();
setSize(320,300);
}

private void addCheckboxes() {
int i=0;
for(; i<20; i++) {
JCheckBox j = new JCheckBox("CheckBox"+i);
pan.add( j );
}
pan.setBounds(new Rectangle(0, 0, 280, (++i)*22));
pan.repaint();
}

public static void main(String[] args) {
MyFrame m = new MyFrame();
m.show();
}
}[/code]

No outro projeto, eu tento fazer quase a mesma coisa, porém, criei uma classe que estende um JPanel, que dentro contém alguns objetos, e tento adicionar vários MyJPanel para ter o mesmo resultado do projeto anterior, mas não funciona.

Veja o código:

[code]import java.awt.;
import javax.swing.
;

public class MyFrame2 extends javax.swing.JFrame {
private JScrollPane jScrollPan = new JScrollPane();
private JPanel pan = new JPanel();

public MyFrame2() {
init();
addMyJPanels();
}

private void init() {
pan.setLayout(new VerticalFlowLayout());
jScrollPan.setBounds(0, 0, 300, 100);
jScrollPan.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jScrollPan.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPan.setBorder(BorderFactory.createLineBorder(Color.black, 1));
//jScrollPan.getViewport().setLayout(null);
jScrollPan.setViewportView(pan);
getContentPane().add(jScrollPan);
pack();
setSize(320,300);
}

private void addMyJPanels() {
int i=0;
for(; i<20; i++) {
MyJPanel j = new MyJPanel();
pan.add( j );
}
pan.setBounds(new Rectangle(0, 0, 280, (++i)*22));
pan.repaint();
}

public static void main(String[] args) {
MyFrame2 m = new MyFrame2();
m.show();
}
}[/code]

E o meu JPanel que criei:

[code]import java.awt.;
import javax.swing.
;
import javax.swing.border.LineBorder;

public class MyJPanel extends javax.swing.JPanel {
private JTextField t1 = new JTextField();
private JTextField t2 = new JTextField();
private JTextField t3 = new JTextField();

public MyJPanel() {
init();
}

private void init() {
setSize(306,22);
setLayout(null);
setBorder(new LineBorder(new Color(0, 0, 0)));
t1.setBounds(1,1,100,20);
t2.setBounds(103,1,100,20);
t3.setBounds(205,1,100,20);
add(t1);
add(t2);
add(t3);
}

public static void main(String[] args) {
JFrame m = new JFrame();
m.getContentPane().setLayout(null);
m.getContentPane().add(new MyJPanel());
m.setSize(310,50);
m.show();
}
}[/code]

Alguém alguma idéia porque isso não dá certo quando eu adiciono um JPanel ao invés de outro componente?

A classe VerticalFlowLayout eu achei na internet. Para pegar o arquivo, clique aqui.

Valeu!

Pra definir o tamanho do JPanel usa o método setPreferredSize() que tenho quase certeza que vai funcionar

Pois é…

Eu fiz:

pan.setLayout(null):
pan.setPreferredSize(new Dimension(x,y));

e

j.setLocation(v,w);

na classe MyFrame2 e funcionou.

Pra que serve este setPreferredSize() ???

[quote=“danieldestro”]Pois é…

Eu fiz:

pan.setLayout(null):
pan.setPreferredSize(new Dimension(x,y));

e

j.setLocation(v,w);

na classe MyFrame2 e funcionou.

Pra que serve este setPreferredSize() ???[/code][/quote]

É o tamanho preferido do componente…rssss
Seria como um tamanho padrao ( default ) do componente.

[quote=“danieldestro”]
Pra que serve este setPreferredSize() ???[/quote]

Ele dá uma pista para renderizar o componente … do tamanho “preferido” dele. :slight_smile:
Você pode checar os métodos setMinimumSize e setMaximumSize também, dê uma olhada no JComponent:

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JComponent.html

[]'s