JPanel e JScrollPane

3 respostas
sdinis

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!!! :smiley:

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!!!

3 Respostas

davidbuzatto

Tenta isso…

seuScrollPane.setViewportView( seuNovoPainel );

esse método atualiza a visualização do scroll pane… usa ele depois de criar seu novo painel.

falow!

sdinis

Pois, a ideia é boa né mas n funciona na mesma, penso que o problema estará em que o scroll que eu adiciono a JFrame e que contem o tal painel n consegue saber o tamanho do JPanel e ajustar-se… Pois o scroll fica do tamanho da janela e quando eu a encolho para n ver todo o desenho que faco no JPanel, ele simplesmente n ativa. Vou enviar todo o codigo num zip para se alguem tiver tempo dar uma olhadela e verificar o problema que esta aparecendo… Brigadao pela ajuda, valeu a tentativa :slight_smile:

Este codigo foi implementado para um programa em modo texto, por isso verao que ainda n esta tudo organizado, esta seria a minha primeira etapa, mostrar o movimento dos pdas… Isto e uma simulacao de socializacao de PDAs, e eles irao movimentar-se segundo as suas coordenadas de posicionamento, o que eu queria era mostrar isso em modo grafico!!! Mas encravei neste problema que já descrevi…

sdinis

Bem, resolvi o problema :smiley: Agradeço a tua ajuda, e afinal a burrice era mesmo minha :shock: Afinal o problema era mesmo o facto do scroll n saber o tamanho do panel e para isso é atraves do SetPreferredSize() que eu já tinha experimentado, mas no sitio errado, ou seja devo colocar no construtor do painel e eu estava a colocar no metodo paint()… ERRO… Bem, mas é com os erros que se aprende… Obrigado pela ajuda na mma… Té uma próxima!!!

Criado 12 de maio de 2006
Ultima resposta 14 de mai. de 2006
Respostas 3
Participantes 2