Boas pessoal, comecei à pouco a programar usando Swing e esta é a minha questão, tenho um JPanel que é alterado várias vezes, ou melhor, é sempre criado um novo e adicionado a um JScrollPane, o problema é que quando o JPanel aumenta demasiado, o scroll não acompanha, isto é eu coloquei ele sempre visivel para o poder ver, mas não adianta nada pois não funciona… Em baixo mando meu codigo para se alguem puder dar uma olhadela e me ajudar… Desde já agradeco!!! 
classe principal onde é criada a janela:
public class Janela extends JFrame {
protected JMenuBar menus;
protected JMenu m1;
protected JMenuItem m11;
protected JMenuItem m12;
protected JToolBar barraferramentas;
protected JButton b1;
protected JScrollPane scroll_image;
protected JScrollPane scroll;
//Esta classe janela e chamada de outra classe principal onde se encontra o main...
public Janela(String nome, int dim_h, int dim_v, Vector pdas)
{
Configs cfg = new Configs();
Relogio r = new Relogio();
JFrame j = new JFrame();
j.setSize(dim_h, dim_v);
j.setTitle("Socializer Plus - Pda version");
Container pane = j.getContentPane();
j.setVisible(true);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Slider para aumentar ou diminuir a velocidade de redesenho
JSlider slider = new JSlider(JSlider.HORIZONTAL,-500, -1, -200) ;
slider.addChangeListener(new ChangeListener() {
// Método chamado sempre que o slider é modificado
public void stateChanged(ChangeEvent evt)
{
JSlider slider = (JSlider)evt.getSource();
if (!slider.getValueIsAdjusting()) {
// Get new value
int value = slider.getValue();
}
}
});
pane.add(slider,"South");
//Mundo (Simulacao)
DesenhaMundo d;
d = new DesenhaMundo(pdas, r); //este sera o novo JPanel
//E aqui coloco-o no JScrollPane
scroll_image = new JScrollPane(d,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
pane.add(scroll_image,"Center");
//Simula o mundo n vezes
//A partir daqui ele vai criar um novo JPanel e colocar numnovo JScrollPane e adicionar a janela n vezes, ate acabar a simulacao
--- E aqui e que esta o problema, ele parece que nao ve quando o JPanel
aumenta demasiado e dai nao funcionarem os scroll
for (int i=1; i<cfg.NUM_HORAS*(60/cfg.PASSO_HORARIO); i++)
{
r.avancaRelogio();
d = new DesenhaMundo(pdas, r);
pane.remove(scroll_image);
scroll_image = new JScrollPane(d,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll_image.setPreferredSize(new Dimension(10,10));
scroll_image.setSize(10,10);
scroll_image.revalidate();
pane.add(scroll_image,"Center");
d.revalidate();
d.setPreferredSize(d.getArea());
System.out.println(d.getSize());
System.out.println(scroll_image.getSize()+"ccc");
j.setVisible(true);
//Pausa entre redesenhos que utiliza o valor do slider
try
{
Thread.currentThread().sleep(Math.abs(slider.getValue())*10);
}
catch(InterruptedException e) {}
}
}
}
Este e o JPanel que e sempre criado
public class DesenhaMundo extends JPanel {
protected Vector pdas;
private Relogio r;
private Dimension area;
int bigger_X;
int bigger_Y;
JScrollPane scroll;
public DesenhaMundo (Vector pdas, Relogio r)
{
this.pdas=pdas;
this.r = r;
bigger_X=0;
bigger_Y=0;
for(int i=0;i<pdas.size();i++)
{
if(((Pda) pdas.elementAt(i)).pos.getX(r.getHora(), r.getMinuto())>bigger_X)
bigger_X = ((Pda) pdas.elementAt(i)).pos.getX(r.getHora(), r.getMinuto());
if(((Pda) pdas.elementAt(i)).pos.getY(r.getHora(), r.getMinuto())>bigger_Y)
bigger_Y = ((Pda) pdas.elementAt(i)).pos.getY(r.getHora(), r.getMinuto());
}
area = new Dimension(bigger_X, bigger_Y);
this.setPreferredSize(area);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
//Grelha
g.setColor(Color.black);
for (int i=0; i<bigger_Y+2;i++)
g.drawLine(0,i*15,(bigger_X+1)*15,i*15);
for (int i=0; i<bigger_X+2;i++)
g.drawLine(i*15,0,i*15,(bigger_Y+1)*15);
//PDAs
for(int i=0;i<pdas.size();i++)
{
if (((Pda) pdas.elementAt(i)).pos.getX(r.getHora(), r.getMinuto()) >=0 )
if (((Pda) pdas.elementAt(i)).pos.getY(r.getHora(), r.getMinuto()) >=0 )
if(((Pda) pdas.elementAt(i)).getPerfil().getSexo().equals("Masculino"))
{
g.setColor(Color.blue);
if (((Pda) pdas.elementAt(i)).enviou_msg)
g.setColor(Color.orange);
if (((Pda) pdas.elementAt(i)).recebeu_msg)
g.setColor(Color.green);
g.fillRect(((Pda) pdas.elementAt(i)).pos.getX(r.getHora(),r.getMinuto())*15+1,
((Pda) pdas.elementAt(i)).pos.getY(r.getHora(),r.getMinuto())*15+1,14,14);
g.setColor(Color.white);
g.drawString(Integer.toString(i),
((Pda) pdas.elementAt(i)).pos.getX(r.getHora(),r.getMinuto())*15+1,
((Pda) pdas.elementAt(i)).pos.getY(r.getHora(),r.getMinuto())*15+14);
}
else
{
g.setColor(Color.pink);
if (((Pda) pdas.elementAt(i)).enviou_msg)
g.setColor(Color.orange);
if (((Pda) pdas.elementAt(i)).recebeu_msg)
g.setColor(Color.green);
g.fillRect(((Pda) pdas.elementAt(i)).pos.getX(r.getHora(),r.getMinuto())*15+1,
((Pda) pdas.elementAt(i)).pos.getY(r.getHora(),r.getMinuto())*15+1,14,14);
g.setColor(Color.black);
g.drawString(Integer.toString(i),
((Pda) pdas.elementAt(i)).pos.getX(r.getHora(),r.getMinuto())*15+1,
((Pda) pdas.elementAt(i)).pos.getY(r.getHora(),r.getMinuto())*15+14);
}
}
setPreferredSize(area);
revalidate();
}
public Dimension getArea()
{
return this.area;
}
}
Já dei voltas e voltas e nada… Se alguem me puder ajudar agradecia!!!
Brigadao!!!
